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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-6 19:12
一、汉字取模工具
' a8 b& R, c4 s" w        嵌入式LCD屏显示无非就是不间断刷新LCD宽度*LCD高度的像素矩阵,并为每个像素指定特定颜色。对于LCD屏幕显示汉字,无非就是将字体形状转换为字体宽度*字体高度的像素矩阵,及指定每个字体像素的颜色,然后在LCD屏幕指定位置按字体宽度*字体高度的像素矩阵进行刷新渲染。; [0 i0 F0 g) x  r/ B' J
0 M% E6 V: u, Y
        汉字取模工具可以设置汉字显示的行、列像素大小,设置字体类型等信息,将输入的每个字符转换成指定行宽、列宽的二进制矩阵,在该矩阵中,字体覆盖区域采用1标记、字体不覆盖区域采用0标记。9 C/ S$ @8 D& P( X3 U
) d& ~6 Z: b1 b7 `# ]2 _% y) P5 W
' f5 Y; ?! ?5 Q5 z; B5 ^: P
二、汉字取模配置
' }3 C2 i: J5 T& G1 D  y3 ?        我们双击LcmZimo.exe打开,取模工具界面如下,红框部分是字体相关参数设置,篮框部分是图片参数设置(通常用于各种艺术字体、图片像素等):
3 O( ~# ~/ X# u% Z: a
5 J2 U$ C/ C1 j7 U
dad45ae29967412094c3ef30ea54fd87.png
$ P) l8 l4 L5 R& j2 P5 Z! ^- i, l1 B
  p/ _: x0 x% C3 S" Y* K

, e+ m$ m+ v& p; u: v: P. K         现在来制作24*24矩阵的“嵌入式开发测试!”的字体编码表,如下图进行设置。1 B& j* Q+ Z6 x, A- q

9 i4 f) I1 y. N( j# \( k2 B
a6da1cc46b4740c3a74302a6a4434f35.png
3 h+ e! C$ D# y& D- O
; |) x5 z/ g$ G( y         最终得到字符编码表:7 p, R7 N% j: l  S5 @5 s9 q% o

7 Q' L" d1 u' ^9 K
2359940c46ca4d39baaf9f54abec8a17.png
5 s* A; w: P! U1 Q& F" {( d+ G  L# ]
         点击保存,将字符编码表输出为头文件“pytest.h”,如下图:; g8 c6 D5 r; x
3 v& W+ i0 _4 y4 ?
9867dd20e996493e826540c40f5fbada.png 4 l8 P% q( g6 E: H

# l9 v9 a# P8 P) R5 v4 y( Z1 T) K, `

8 L6 f* G) ?3 l  P 三、创建工程
$ ]1 `% q! A$ i( L        本文基于STM32L496VGT3的MCU创建一个新工程,并提前实现了lpusart串口驱动、三个按键及三个LED灯驱动、以及OLED屏幕驱动(SPI引脚)% L+ z- y7 h, L1 o+ K5 T  Z
: n9 K7 \$ c) T% o' e
        假定已经实现了这些基本功能,在此基础上实现OLED屏幕显示刚刚定义汉字“嵌入式开发测试!”。
- x5 G5 X+ O. O! T# U+ A' m6 `  H$ Z4 q" D
四、汉字LCD显示设计
; T$ A: R( @5 ?+ X( U. n; w! ^        将刚才取模软件保存输出的pytest.h头文件拷贝到ICore/oled目录下,本文对pytest.h做了细微调整(去除一些不规范编程告警,不调整无影响):
. \4 A/ }5 Q) a( z5 F' p* ^! A. Q  x0 \
; n+ W7 l& j; ?" A
69005a7ea375474fb7c57bb52c883ced.png
3 Q; L3 ], {$ w4 W4 L( ^1 l# ]& u% ~& j5 l8 L3 ~  N. S
         取模软件针对每个字符输出了一个72字节的8bit的数值,也就是72字节*8bit=576bit=24*24像素,目前该字符编码在取模软件上设置是横向取模左高位,数据排列:从左到右从上到下,就意味着,每3个字节*8bit=24bit表示一行的像素,如前三个字符0X00 0X18 0X00->0000 0000 0001 1000 0000 0000,作为“嵌”字第一行像素标记,位数值为1的填充前景色,为0的填充背景色。具体代码如下:
  A& O- A: Y  h3 _8 }$ c0 f& W
6 d/ ?& `. c9 W$ O
  1. //绘制每个字符,24*24像素大小
    + |8 i7 r  Y6 T' Z
  2. void OLED_DISPLAY_24x24(uint8_t xpos, uint8_t ypos,uint8_t index)8 f  F, n6 [% x" g
  3. {* p' M  t) n) r2 W+ k7 E
  4.         uint16_t textData[24][24]={0};    //24*24大小颜色矩阵8 D: R+ G% e  a0 G5 O
  5.         FNT_GB24 cur_text = code_GB_24[index];( t. N* ~- f0 }# m% E. c0 `9 {
  6.         for(uint8_t i=0;i<72;i++){
    " T6 y4 B& _' P3 g4 d
  7.                 for(uint8_t j=0; j<8; j++)) E8 s/ {2 v" B% G, b/ ~& Q
  8.                 if(cur_text.Msk[i]&(0x01<<(8-j))){
    0 O2 a  Q9 I2 L" j
  9.                         textData[i/3][(i%3)*8+j] = LCD_DISP_BLUE;//前景色,蓝色
    5 m+ F) A* M1 b# g/ i% j, }. E
  10.                 }else{$ U$ w1 l0 N3 s9 D1 T% A
  11.                         textData[i/3][(i%3)*8+j] = LCD_DISP_BLACK;//背景色,黑色
    3 ?2 K1 a! ~5 D0 l( `+ h" I
  12.                 }. K' D6 J) J9 f8 ]  P
  13.         }( ?+ z* u/ W" h& \5 S" x: m
  14.         for(uint8_t i=0; i<24; i++)
    $ C5 O" e3 ?1 C$ W
  15.         {
    6 d) c% ^. ]2 f% b. \3 {) J# _
  16.                 OLED_WriteLine(xpos,ypos+i,textData[i],24);//列像素渲染
    # Q8 A3 o; [1 [" z1 Q! i
  17.         }5 x" s. t: U. F0 b* k' u) V3 V4 V% M0 U
  18. }
复制代码
$ D1 U% g; v2 _, }& c' y
        上述代码中,每个汉字72字节编码表,3个字节表示一行(列宽3*8bit=24),共24行(72字节/3=24),构成24*24的二进制矩阵,然后根据该二进制矩阵,为1的给与前景色,为0的给与背景色,从而得到24*24的颜色矩阵,然后在渲染时在24*24像素的LCD区域渲染对应的颜色,形成屏幕显示输出。+ K6 d6 K& c% f( |' s
; r/ i" d7 n( q
        然后逐个字符绘制输出,完成前面输入字段“嵌入式开发测试!”的全部输出:
0 \6 c  ^% z: d* u, i) B0 p& j
  1. void BSP_LCD_login(uint8_t xpos, uint8_t ypos)' R) q- R( s" i
  2. {% u, O7 F9 L3 F( Y! U7 y  @
  3.         BSP_LCD_Clear_DMA(LCD_DISP_BLUE);$ w. L/ l5 M" k; @* N7 w
  4.         for(uint8_t index=0; index<8;index++)
    3 C, c/ V! e0 l0 ~% [& y0 K
  5.         {( @! d0 _3 B4 f
  6.                 OLED_DISPLAY_24x24(xpos+index*24,ypos,index);( T' v( M) d, x
  7.         }% c# g) _& R7 Z
  8. }
复制代码
$ _/ x- H0 U1 L" A% _7 c- I
五、汉字输出测试7 z5 q: f& X3 ]3 b$ Z) J: g' Y
        在主循环函数中,按键KEY0时,屏幕输出显示“嵌入式开发测试!”字段:, k! ?; m$ V+ K/ m& M5 ^4 f, q* Z, }
4 z5 D  M- u7 V5 G5 q
6ed62e52730f4575b6fd12358d1344a1.png
) V, S8 H3 N# H" ^/ {+ B9 o( H$ c$ ~* r# p+ e5 O
         编译及下载:
5 f4 j8 T* j8 j* ^
  D% q. k* r2 W. G& G5 h! @# H
e9dd817922e248ccaeacdb5d33411c55.png
, }  m  `3 {% _6 h5 y4 i8 I5 r) I0 A' E# I; `6 m0 v3 N. r
         按键KEY0,屏幕输出显示如下:6 B8 l8 q) n$ ~
* s% i) p5 [" o# |. J3 m
7bb63e40a0994f8bbd59a704db07964b.png
- b6 v7 \( }7 l3 w$ V
7 l$ B( k6 y" K$ ]$ ~& `2 z
————————————————; v. [5 E; a+ }) w' o4 f
版权声明:py_free-物联智能
* ]6 j7 @7 [: \! p* A0 w如有侵权请联系删除
. g; D$ p+ v. K0 c$ ?
3 O& m9 U- C  f- F9 p
+ y; J8 W  }8 b" ]2 z7 z
收藏 评论0 发布时间:2023-4-6 19:12

举报

0个回答

所属标签

相似分享

官网相关资源

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