你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CubeIDE结合汉字取模在LCD输出字体经验分享

[复制链接]
攻城狮Melo 发布时间:2023-4-6 19:12
一、汉字取模工具; \; [" o' r  \- ?+ ]3 [
        嵌入式LCD屏显示无非就是不间断刷新LCD宽度*LCD高度的像素矩阵,并为每个像素指定特定颜色。对于LCD屏幕显示汉字,无非就是将字体形状转换为字体宽度*字体高度的像素矩阵,及指定每个字体像素的颜色,然后在LCD屏幕指定位置按字体宽度*字体高度的像素矩阵进行刷新渲染。' Q% m" d0 l' w- i: q
9 N/ f' L! S7 j
        汉字取模工具可以设置汉字显示的行、列像素大小,设置字体类型等信息,将输入的每个字符转换成指定行宽、列宽的二进制矩阵,在该矩阵中,字体覆盖区域采用1标记、字体不覆盖区域采用0标记。
. A- `7 z: c# g2 [: E% b( h; l: r* U* p8 c: Z

, R2 a7 B6 H# ~9 n: i二、汉字取模配置6 r4 F# z' j2 l+ I) \/ ]4 Q+ d  x
        我们双击LcmZimo.exe打开,取模工具界面如下,红框部分是字体相关参数设置,篮框部分是图片参数设置(通常用于各种艺术字体、图片像素等):
- i# ^, C" l  u9 r8 \
' P$ A  N' H: |5 m/ h  C$ c3 E
dad45ae29967412094c3ef30ea54fd87.png 7 k: \/ ^6 N/ M9 @3 r, w

% W) i* U8 j. M7 H

$ U' g( _& e+ ~9 |8 r1 r) ~         现在来制作24*24矩阵的“嵌入式开发测试!”的字体编码表,如下图进行设置。' V' p4 N& C6 i) c5 F

' w5 w4 l' n8 V- s5 F# p( y
a6da1cc46b4740c3a74302a6a4434f35.png
, C" n% k- o4 k8 h) r
$ P9 R# l5 X, c7 [* ^         最终得到字符编码表:
7 l- \9 E  S5 s- O7 @% q- W* v6 j8 \
2359940c46ca4d39baaf9f54abec8a17.png
) P& |2 q6 Q' z) q. _/ g6 f* p: H2 H8 C) s" p" }3 \% l: g. z" O) g# E
         点击保存,将字符编码表输出为头文件“pytest.h”,如下图:( F3 C3 P& e0 G  d

% u8 I0 g+ M' N) b' s" Y' K3 V
9867dd20e996493e826540c40f5fbada.png
- F5 R7 J  U" S- ]9 b1 {
6 l' X6 p; U( L2 V+ @1 {& Q% d& K

9 s% T6 I1 }1 }: k4 { 三、创建工程
) O- {0 t+ Y' u1 ~: Y        本文基于STM32L496VGT3的MCU创建一个新工程,并提前实现了lpusart串口驱动、三个按键及三个LED灯驱动、以及OLED屏幕驱动(SPI引脚)
9 v: h# k6 g: V3 o6 g
) m4 ]2 o* E$ V# A        假定已经实现了这些基本功能,在此基础上实现OLED屏幕显示刚刚定义汉字“嵌入式开发测试!”。7 E$ q; m5 A! N$ l% r) j- L# ^3 _: b

; t  V7 N4 F9 Y' W: U3 T. |% t四、汉字LCD显示设计& K) M/ y1 c( }# M* ^: ^1 N- L
        将刚才取模软件保存输出的pytest.h头文件拷贝到ICore/oled目录下,本文对pytest.h做了细微调整(去除一些不规范编程告警,不调整无影响):
# k  v$ n2 ?' S2 V# u" }4 Q* s# n4 ^3 t: F7 j
69005a7ea375474fb7c57bb52c883ced.png
; r, y; b% r  H0 q7 z6 p8 x' h: M4 U$ X
         取模软件针对每个字符输出了一个72字节的8bit的数值,也就是72字节*8bit=576bit=24*24像素,目前该字符编码在取模软件上设置是横向取模左高位,数据排列:从左到右从上到下,就意味着,每3个字节*8bit=24bit表示一行的像素,如前三个字符0X00 0X18 0X00->0000 0000 0001 1000 0000 0000,作为“嵌”字第一行像素标记,位数值为1的填充前景色,为0的填充背景色。具体代码如下:) o7 Y$ h' _2 X- S, M
) i+ w% ?! K) J5 G# v0 E/ E
  1. //绘制每个字符,24*24像素大小, i0 B  s( c+ v/ y* {- r( T  b4 [
  2. void OLED_DISPLAY_24x24(uint8_t xpos, uint8_t ypos,uint8_t index)1 F. t& k# b. j  f- W! d1 d
  3. {  ~! d' V! J  r& y) }' A
  4.         uint16_t textData[24][24]={0};    //24*24大小颜色矩阵! A: N" o5 x5 M! g# o8 X
  5.         FNT_GB24 cur_text = code_GB_24[index];
    % z1 @) x! t/ @7 T, p. |
  6.         for(uint8_t i=0;i<72;i++){
    ! t/ J3 q9 O( w, @
  7.                 for(uint8_t j=0; j<8; j++)
    / Q6 `: w% B$ J0 Y- ?2 h$ `% c
  8.                 if(cur_text.Msk[i]&(0x01<<(8-j))){+ G/ C! I0 m) @+ Q  [
  9.                         textData[i/3][(i%3)*8+j] = LCD_DISP_BLUE;//前景色,蓝色6 k" o7 R' M! n
  10.                 }else{  f; z* a. r  t  g0 J
  11.                         textData[i/3][(i%3)*8+j] = LCD_DISP_BLACK;//背景色,黑色
    ! h9 P5 j" V8 g, b% L' |9 q4 h# t
  12.                 }
    . D% M# R  f7 ?
  13.         }
    ! p/ r. J" H$ k9 R" R$ {  I* `+ ?
  14.         for(uint8_t i=0; i<24; i++)+ ]+ C, O% W. m( N- q# s) d. X
  15.         {* q* _) e. w4 t5 y* Q1 @' p
  16.                 OLED_WriteLine(xpos,ypos+i,textData[i],24);//列像素渲染1 a4 t( @5 A; A  m5 L
  17.         }
    * j, f  @6 {3 U  ]6 G. p' c- r+ Z
  18. }
复制代码
. Q1 b, N; r9 D4 s- i0 h, p! i
        上述代码中,每个汉字72字节编码表,3个字节表示一行(列宽3*8bit=24),共24行(72字节/3=24),构成24*24的二进制矩阵,然后根据该二进制矩阵,为1的给与前景色,为0的给与背景色,从而得到24*24的颜色矩阵,然后在渲染时在24*24像素的LCD区域渲染对应的颜色,形成屏幕显示输出。3 I, P0 I+ K% P5 z$ V* w

9 o- m$ E) \+ g' x  U7 _* _        然后逐个字符绘制输出,完成前面输入字段“嵌入式开发测试!”的全部输出:
3 O; G+ |& g7 K$ n9 u; T
  1. void BSP_LCD_login(uint8_t xpos, uint8_t ypos)
    ( _! i; Z/ V% C" s& R  U# i0 W
  2. {
    " v* B7 v  E2 n# n
  3.         BSP_LCD_Clear_DMA(LCD_DISP_BLUE);
    : W3 Z* w* K% Q- ~! U
  4.         for(uint8_t index=0; index<8;index++); I7 _$ p/ G7 O0 J3 ^4 X
  5.         {
    ' K* \/ o+ Q( z; d# A! |  J
  6.                 OLED_DISPLAY_24x24(xpos+index*24,ypos,index);
    1 e4 f$ H: B: S. e9 D% j: _
  7.         }: n& D  |3 e. z. K  K
  8. }
复制代码
. _$ i6 D" h. u4 A, O; S7 u
五、汉字输出测试0 R8 P/ K6 e. Z2 d! ]; Y
        在主循环函数中,按键KEY0时,屏幕输出显示“嵌入式开发测试!”字段:1 r" m6 w- [9 d" V+ g; j2 Z

4 b: y$ r+ a$ Y1 m5 [. ~+ H8 t8 L) x- \
6ed62e52730f4575b6fd12358d1344a1.png ) y6 ]' I! {! f; p! U
6 W' r* ]  {+ r# U6 i- C+ X3 S
         编译及下载:( w2 ?- B& G% |0 ^" p; ?
) F. e. ~8 k  f2 e
e9dd817922e248ccaeacdb5d33411c55.png # b# N5 O+ z; [  _& N
+ y/ k, X6 T' ?5 Z3 Q& p, Q$ c
         按键KEY0,屏幕输出显示如下:0 C: C% J& x8 E) Y/ K& U- T
9 a5 N: }* Q; \
7bb63e40a0994f8bbd59a704db07964b.png 2 H6 O, |/ [+ F# n% W

! x! {3 W% A" b; R' }# t2 A1 |————————————————4 ^+ K5 z$ Y! g& c
版权声明:py_free-物联智能/ T' T: m7 M( ~" R9 w1 u# r
如有侵权请联系删除3 a! |, q6 l, `6 C; y/ I' [% h
  Z$ g6 C9 ^. h* s4 |

  ]; G5 z4 i8 n8 m
收藏 评论0 发布时间:2023-4-6 19:12

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版