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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-6 19:12
一、汉字取模工具
. ^) C8 y1 g" O6 ~. ]; {        嵌入式LCD屏显示无非就是不间断刷新LCD宽度*LCD高度的像素矩阵,并为每个像素指定特定颜色。对于LCD屏幕显示汉字,无非就是将字体形状转换为字体宽度*字体高度的像素矩阵,及指定每个字体像素的颜色,然后在LCD屏幕指定位置按字体宽度*字体高度的像素矩阵进行刷新渲染。. g  |5 d  N" I6 }# \8 z
/ r. d3 m8 G5 y: F4 m4 C/ l
        汉字取模工具可以设置汉字显示的行、列像素大小,设置字体类型等信息,将输入的每个字符转换成指定行宽、列宽的二进制矩阵,在该矩阵中,字体覆盖区域采用1标记、字体不覆盖区域采用0标记。
; m# @- n6 l% ?+ u. ^; A8 I6 ~8 V' c- d8 q5 v9 E! [6 J1 E4 q" V

3 z2 X' m3 G. f8 _4 y1 G6 L5 a二、汉字取模配置
; O: V! w- Q, H2 ]' o- x        我们双击LcmZimo.exe打开,取模工具界面如下,红框部分是字体相关参数设置,篮框部分是图片参数设置(通常用于各种艺术字体、图片像素等):# Y: ?% G6 v& v: _; o" |
# N7 F- b+ m3 G
dad45ae29967412094c3ef30ea54fd87.png
2 o: \8 R' I; I5 o4 m) g( ^8 M: Y; Z  g- V, ^( k
4 E' V8 F0 T. _% R  B- {
         现在来制作24*24矩阵的“嵌入式开发测试!”的字体编码表,如下图进行设置。
* Y. Z& Z/ [4 M$ x6 r
& n# t# K2 N& S% ^! @9 O0 o
a6da1cc46b4740c3a74302a6a4434f35.png * c3 x9 _3 d/ n3 l

5 c- f) x6 x4 W: @         最终得到字符编码表:
0 H1 P6 b4 I3 p! h- f
" T7 Z6 @. U; y0 ]4 Q& Z. g# g9 U
2359940c46ca4d39baaf9f54abec8a17.png ( R$ x2 ]! q& S; U# L4 i

6 w2 `- S) ~. Q! i1 O9 {3 J         点击保存,将字符编码表输出为头文件“pytest.h”,如下图:
% Y# m! r7 ?1 B  w: K9 d' {; p2 E5 M
9867dd20e996493e826540c40f5fbada.png
# k5 V. T, o* r! x' I
* S9 j0 V$ N  ?! L! z8 j
1 c* l4 G/ l7 ]3 c  _
三、创建工程7 I& U1 S6 o3 i3 @
        本文基于STM32L496VGT3的MCU创建一个新工程,并提前实现了lpusart串口驱动、三个按键及三个LED灯驱动、以及OLED屏幕驱动(SPI引脚)
& A- i: Z5 c5 d( I# j- a3 S2 ^+ A8 g* H  f: d- o# e
        假定已经实现了这些基本功能,在此基础上实现OLED屏幕显示刚刚定义汉字“嵌入式开发测试!”。2 S3 ]. L, h, ?

2 J8 h1 f& _6 n( D' a8 a6 S; U四、汉字LCD显示设计
4 @% F+ u6 l" M( y        将刚才取模软件保存输出的pytest.h头文件拷贝到ICore/oled目录下,本文对pytest.h做了细微调整(去除一些不规范编程告警,不调整无影响):
; i+ v5 f3 `: W6 y% e4 `0 ]( J/ U5 P- S/ q. E) C2 A- M* @2 ?6 n
69005a7ea375474fb7c57bb52c883ced.png 2 y: V8 t1 T& x7 \: a- I" D

& c0 k9 ?7 Q; M$ I* K; N         取模软件针对每个字符输出了一个72字节的8bit的数值,也就是72字节*8bit=576bit=24*24像素,目前该字符编码在取模软件上设置是横向取模左高位,数据排列:从左到右从上到下,就意味着,每3个字节*8bit=24bit表示一行的像素,如前三个字符0X00 0X18 0X00->0000 0000 0001 1000 0000 0000,作为“嵌”字第一行像素标记,位数值为1的填充前景色,为0的填充背景色。具体代码如下:/ z/ q9 u7 D1 f9 c2 X6 j

6 v% k( l- F  a! s9 Y6 I! m' H( w
  1. //绘制每个字符,24*24像素大小  j. H% ^/ R0 H( v
  2. void OLED_DISPLAY_24x24(uint8_t xpos, uint8_t ypos,uint8_t index)
    5 m+ U" y% @6 T+ ^
  3. {
    " Y6 r/ R+ G* o; `' V# k. V
  4.         uint16_t textData[24][24]={0};    //24*24大小颜色矩阵
    . F+ g4 S& v. B5 S5 T2 ]
  5.         FNT_GB24 cur_text = code_GB_24[index];7 M# k8 P. G% f' H2 t1 j5 ?7 v
  6.         for(uint8_t i=0;i<72;i++){
    2 A8 E$ l6 J# Q) M1 U/ q
  7.                 for(uint8_t j=0; j<8; j++)
    ; p  G( n, P0 G# l+ R/ i6 y( g
  8.                 if(cur_text.Msk[i]&(0x01<<(8-j))){
    : C. f% n2 A+ t  N
  9.                         textData[i/3][(i%3)*8+j] = LCD_DISP_BLUE;//前景色,蓝色
    " b6 s/ p& \( Q; `  T
  10.                 }else{
    $ N& c) v6 t1 F" J# J% B
  11.                         textData[i/3][(i%3)*8+j] = LCD_DISP_BLACK;//背景色,黑色
    ) o' T& v. Z. n; j
  12.                 }
    ) d6 ~; L+ ]' {' i! W: {3 V
  13.         }  b9 H6 M$ C7 d* ]. ]$ r) S
  14.         for(uint8_t i=0; i<24; i++); g# Q8 P2 f4 e+ V/ ?! @# Y
  15.         {
    $ R; ?0 b) U+ [
  16.                 OLED_WriteLine(xpos,ypos+i,textData[i],24);//列像素渲染
    & @: A; V7 ]: U* j3 F2 F1 H
  17.         }
    # T' d2 S5 f! n4 c' J$ L/ m. D4 k4 ~
  18. }
复制代码

: u' F" s# T# }. ^        上述代码中,每个汉字72字节编码表,3个字节表示一行(列宽3*8bit=24),共24行(72字节/3=24),构成24*24的二进制矩阵,然后根据该二进制矩阵,为1的给与前景色,为0的给与背景色,从而得到24*24的颜色矩阵,然后在渲染时在24*24像素的LCD区域渲染对应的颜色,形成屏幕显示输出。0 d: a) p- u: i3 {2 o  N

0 U+ F7 j( r* Y1 M) r* R        然后逐个字符绘制输出,完成前面输入字段“嵌入式开发测试!”的全部输出:
( J2 v; R* W5 |
  1. void BSP_LCD_login(uint8_t xpos, uint8_t ypos)
    ; v# B$ _# V' }+ X0 H% Q2 N5 J
  2. {
    % T" y3 k- Z( ]  c5 T
  3.         BSP_LCD_Clear_DMA(LCD_DISP_BLUE);' [5 d9 q  R. h" q& U3 K  a
  4.         for(uint8_t index=0; index<8;index++)
    2 O" Y) I& k4 z1 m" n4 @9 J) N, T
  5.         {
    ! K2 ^$ Z& r3 k8 K! z
  6.                 OLED_DISPLAY_24x24(xpos+index*24,ypos,index);  @. J0 U) |  K! p* z; Y0 \4 U" R
  7.         }
    * P- w) V0 @! h6 q8 s' x& a0 c
  8. }
复制代码

' E& F% S4 I3 e! ]2 x五、汉字输出测试
* G7 L& x& F0 c9 P9 [; W- P# @+ X        在主循环函数中,按键KEY0时,屏幕输出显示“嵌入式开发测试!”字段:! n/ Z! |& k0 k

6 C+ Y$ a$ q! d6 m
6ed62e52730f4575b6fd12358d1344a1.png
3 h" |5 L$ z  T, i: H# p: H* @7 V. M
  a1 U9 O3 m! ~- a         编译及下载:
3 d, A$ F# k+ y  Q( T$ c; m; @, p3 u) [6 G. ]
e9dd817922e248ccaeacdb5d33411c55.png & i. k3 w6 P& o* V1 I$ |

3 C( C1 M& [" v0 h8 v7 p, D8 E         按键KEY0,屏幕输出显示如下:
# M* y7 Z) k" J& s
0 [/ I- C9 V, c& R# m% C! {8 y
7bb63e40a0994f8bbd59a704db07964b.png % k0 w% M  K: o- s( j

& r) e* G+ F, W6 ^4 o6 u* D————————————————
$ S3 z6 \# g$ z( J$ I版权声明:py_free-物联智能
- m+ R0 _# ]% u. R7 Y) W如有侵权请联系删除6 p: _  V7 X8 L) p8 i( S0 Z

7 X6 Y& X! y& B; w' o  f1 q' L2 m' O  [. [4 K* v1 P
赞 收藏 评论0 发布时间:2023-4-6 19:12

举报

0个回答

所属标签

相似技术帖

官网相关资源

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