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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-6 19:12
一、汉字取模工具
' M- I0 |$ S) r2 X+ L" K1 p8 u, W        嵌入式LCD屏显示无非就是不间断刷新LCD宽度*LCD高度的像素矩阵,并为每个像素指定特定颜色。对于LCD屏幕显示汉字,无非就是将字体形状转换为字体宽度*字体高度的像素矩阵,及指定每个字体像素的颜色,然后在LCD屏幕指定位置按字体宽度*字体高度的像素矩阵进行刷新渲染。% H# z1 \- X. G0 n2 k/ Z: {6 p0 z
) q( Y8 A5 |9 I1 j
        汉字取模工具可以设置汉字显示的行、列像素大小,设置字体类型等信息,将输入的每个字符转换成指定行宽、列宽的二进制矩阵,在该矩阵中,字体覆盖区域采用1标记、字体不覆盖区域采用0标记。
9 d+ R7 V# h& ^' t* O
: N+ m9 U: \3 v- L2 k

$ w4 ]2 M+ ~2 u* l+ t二、汉字取模配置# M$ U+ p3 Q/ O) M9 _7 S6 A
        我们双击LcmZimo.exe打开,取模工具界面如下,红框部分是字体相关参数设置,篮框部分是图片参数设置(通常用于各种艺术字体、图片像素等):
8 D, C1 U4 w6 x) [/ G, V# h% Q6 c
dad45ae29967412094c3ef30ea54fd87.png
+ ~+ x% f/ f0 N9 D1 F7 S- N- h3 @# W2 D# _$ h" x

7 {0 _5 I1 \  K$ z9 W         现在来制作24*24矩阵的“嵌入式开发测试!”的字体编码表,如下图进行设置。
' n( o+ C; G( N2 ?/ C: z8 U4 n, z) z+ ^6 `) ?, k/ ^1 z- d3 Y
a6da1cc46b4740c3a74302a6a4434f35.png & G/ l4 N$ R2 S, ]6 y
/ L9 G. j3 h9 J4 A
         最终得到字符编码表:
7 d6 R  r' M  g; W+ Z3 b7 G  o6 r) [! e* O0 y- @" p
2359940c46ca4d39baaf9f54abec8a17.png
& j. q7 L) }3 {# w0 _. x/ f# |7 R% W8 C8 f1 P3 F" ~9 `: w* \
         点击保存,将字符编码表输出为头文件“pytest.h”,如下图:
- b: {' ~: r+ v; \# Y) \+ O6 s: }* H3 a# x1 u# F
9867dd20e996493e826540c40f5fbada.png ; }0 H* r9 L4 Q
" f! o; H0 r" v. j2 D: g
  M0 k" v# k( i2 x0 b: @
三、创建工程
2 ?+ i; ?: ^5 F* ], V        本文基于STM32L496VGT3的MCU创建一个新工程,并提前实现了lpusart串口驱动、三个按键及三个LED灯驱动、以及OLED屏幕驱动(SPI引脚)
0 f/ M' [2 y" q5 K0 u3 f
! T4 l! K/ C) J6 H        假定已经实现了这些基本功能,在此基础上实现OLED屏幕显示刚刚定义汉字“嵌入式开发测试!”。- h8 u* S6 C; N/ w

" ^( c+ D7 P/ O# @, M( W四、汉字LCD显示设计
5 C) o2 v% C! m        将刚才取模软件保存输出的pytest.h头文件拷贝到ICore/oled目录下,本文对pytest.h做了细微调整(去除一些不规范编程告警,不调整无影响):
) ?1 d4 s. e0 r- p2 p  t8 X% S1 w8 d  T( G! l: x
69005a7ea375474fb7c57bb52c883ced.png ) \& Q. K3 d; e6 `) k% B( W& u  H
) Y& [& h. {! V
         取模软件针对每个字符输出了一个72字节的8bit的数值,也就是72字节*8bit=576bit=24*24像素,目前该字符编码在取模软件上设置是横向取模左高位,数据排列:从左到右从上到下,就意味着,每3个字节*8bit=24bit表示一行的像素,如前三个字符0X00 0X18 0X00->0000 0000 0001 1000 0000 0000,作为“嵌”字第一行像素标记,位数值为1的填充前景色,为0的填充背景色。具体代码如下:/ T5 T7 K1 Y% D4 D/ \

7 D- ]9 k6 J; d& ~7 h$ h
  1. //绘制每个字符,24*24像素大小
    & ~3 u  Q' ?" W1 @
  2. void OLED_DISPLAY_24x24(uint8_t xpos, uint8_t ypos,uint8_t index)
    5 `3 e6 L% T. b4 }% r8 C8 p
  3. {
    6 M0 {" W; b! ?7 H& W
  4.         uint16_t textData[24][24]={0};    //24*24大小颜色矩阵
    6 k' P  B) n8 S. n9 k* i
  5.         FNT_GB24 cur_text = code_GB_24[index];
    1 r3 s6 \4 b6 C6 V& ?
  6.         for(uint8_t i=0;i<72;i++){; y+ p& E* I) f
  7.                 for(uint8_t j=0; j<8; j++)
    1 z, k) U0 l4 _- j2 x
  8.                 if(cur_text.Msk[i]&(0x01<<(8-j))){' P3 P5 y6 e" r% j. c2 w
  9.                         textData[i/3][(i%3)*8+j] = LCD_DISP_BLUE;//前景色,蓝色
    2 _+ v& p. |4 a" {3 |
  10.                 }else{" J, D) X) m' G- ?1 X
  11.                         textData[i/3][(i%3)*8+j] = LCD_DISP_BLACK;//背景色,黑色
    9 c2 J  n: Z+ e. {1 U; i
  12.                 }* M; Z; ^6 t  C( V* r
  13.         }. n. a( A2 ~" }# W) B$ D
  14.         for(uint8_t i=0; i<24; i++)- C5 L7 p7 b6 V4 d2 l" {
  15.         {
    2 `: J5 L2 ]2 S7 t- t7 H
  16.                 OLED_WriteLine(xpos,ypos+i,textData[i],24);//列像素渲染
    : z1 e. a5 j% `& A- o2 i
  17.         }* l( M1 K+ Q" x$ V0 h1 g
  18. }
复制代码

5 g/ L& A1 Z+ ^% ~! z        上述代码中,每个汉字72字节编码表,3个字节表示一行(列宽3*8bit=24),共24行(72字节/3=24),构成24*24的二进制矩阵,然后根据该二进制矩阵,为1的给与前景色,为0的给与背景色,从而得到24*24的颜色矩阵,然后在渲染时在24*24像素的LCD区域渲染对应的颜色,形成屏幕显示输出。
) v/ B, Y' {4 m0 M6 m+ N, F

4 K- b' C4 x3 q4 ?8 J% I/ b4 n! ~# o        然后逐个字符绘制输出,完成前面输入字段“嵌入式开发测试!”的全部输出:
5 |% i3 `+ ?7 X! |  S+ y5 E) u3 V
  1. void BSP_LCD_login(uint8_t xpos, uint8_t ypos)
    $ @( }9 s1 W7 O* V3 v
  2. {8 J$ G* V' G# m- o. @
  3.         BSP_LCD_Clear_DMA(LCD_DISP_BLUE);
    6 z$ y% r4 T9 R/ k
  4.         for(uint8_t index=0; index<8;index++)" ]0 h& o' R7 e+ L: P+ _/ C$ N+ R
  5.         {
    , H5 c5 t, N. y, T* l
  6.                 OLED_DISPLAY_24x24(xpos+index*24,ypos,index);
    8 k4 o% l# p" O% ?- F' Y' Q
  7.         }! R0 L) Z( h) G% |6 q1 x" r' I
  8. }
复制代码

* f6 K2 `: F1 _五、汉字输出测试
/ o& O( }2 i( O+ @  F/ x4 l! z# w        在主循环函数中,按键KEY0时,屏幕输出显示“嵌入式开发测试!”字段:) x. o& Y3 J# U2 b; N  ?4 k

3 l7 {& @; M% P$ ]8 f/ b# J& a/ R
6ed62e52730f4575b6fd12358d1344a1.png * l, x5 e2 T; v/ H- H7 l; f

6 A& x& V* ~6 X# S         编译及下载:* k) O# Y( j% n3 C# Y

+ C& x/ C( w/ z' U  f" I3 w# }
e9dd817922e248ccaeacdb5d33411c55.png
+ T4 x7 L) V+ d1 h+ m' B2 X% Q+ J- }' t. K  C: \' |
         按键KEY0,屏幕输出显示如下:. J$ h+ p1 b6 y3 r* p. ]% V
$ P( m, H6 o) p4 C
7bb63e40a0994f8bbd59a704db07964b.png / C1 @3 [: X5 w3 I- g
% ]; Q$ E- w# ~7 c' o* Z* O
————————————————
7 G1 D# N% X8 w9 l版权声明:py_free-物联智能5 {$ t. ?& @  p! N- e
如有侵权请联系删除
! R; ]9 _$ f8 ^6 l- A5 l0 i: V& K( v8 Y6 S7 X1 k
6 X' N6 p% q1 x7 B$ z
赞 收藏 评论0 发布时间:2023-4-6 19:12

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版