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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-6 19:12
一、汉字取模工具
2 y2 J( C* b" Z9 H. z        嵌入式LCD屏显示无非就是不间断刷新LCD宽度*LCD高度的像素矩阵,并为每个像素指定特定颜色。对于LCD屏幕显示汉字,无非就是将字体形状转换为字体宽度*字体高度的像素矩阵,及指定每个字体像素的颜色,然后在LCD屏幕指定位置按字体宽度*字体高度的像素矩阵进行刷新渲染。
5 [  W3 o; c, X. \5 R+ O: I3 U
% ]! e- h# ^  ?0 t
        汉字取模工具可以设置汉字显示的行、列像素大小,设置字体类型等信息,将输入的每个字符转换成指定行宽、列宽的二进制矩阵,在该矩阵中,字体覆盖区域采用1标记、字体不覆盖区域采用0标记。
2 {6 F0 `9 v0 u# \: |  l: ~6 D# |& d8 m8 Q& }8 V- Z

1 U8 ^4 J& D' F* Q6 O3 w! D二、汉字取模配置
* u, x* \6 T1 T: W5 b" K        我们双击LcmZimo.exe打开,取模工具界面如下,红框部分是字体相关参数设置,篮框部分是图片参数设置(通常用于各种艺术字体、图片像素等):* i& T+ S. N( f9 I0 u7 V$ _3 `

& b" c7 E, @6 b
dad45ae29967412094c3ef30ea54fd87.png
: O) _# b- Y: p# w5 W: J+ h+ h; m8 [( a

0 ^, O4 M1 R  y3 L0 P( X/ T         现在来制作24*24矩阵的“嵌入式开发测试!”的字体编码表,如下图进行设置。
5 |4 \8 X% K1 h  E" J3 [
3 K/ X, \. s, {4 I9 B  o
a6da1cc46b4740c3a74302a6a4434f35.png ' j1 ?: I$ d3 ^" Z7 p% A/ }) {
9 G, ?/ H& H6 V& ~4 r; D) V
         最终得到字符编码表:
: K7 Q' _3 p0 `7 H/ x
8 G3 [; X; S  s3 N1 m2 j; V
2359940c46ca4d39baaf9f54abec8a17.png
5 B; _7 E: _) k$ y+ [# _: S# M' u, ^
         点击保存,将字符编码表输出为头文件“pytest.h”,如下图:
! q. B' S1 u3 K4 j- @$ d7 ]$ [1 X# K% [6 r6 `$ F9 V; R
9867dd20e996493e826540c40f5fbada.png 6 ]6 K& z+ D. l; J0 I
; A+ B8 U' w" A( f) Y" ]' F3 b4 F' s

# Z6 n5 o0 e. v0 ?" C( `9 @ 三、创建工程
% ]. g( W3 Y/ L8 E  C% N# E        本文基于STM32L496VGT3的MCU创建一个新工程,并提前实现了lpusart串口驱动、三个按键及三个LED灯驱动、以及OLED屏幕驱动(SPI引脚)9 [, Y: A# L$ s& S2 p. Y9 v

6 w( f- L3 I$ k8 i, s! u        假定已经实现了这些基本功能,在此基础上实现OLED屏幕显示刚刚定义汉字“嵌入式开发测试!”。
, E- E& w+ v- ?- _: _
: I6 D, S4 S' D# H% b6 V9 y四、汉字LCD显示设计. f, \+ k" ], y, I5 ?
        将刚才取模软件保存输出的pytest.h头文件拷贝到ICore/oled目录下,本文对pytest.h做了细微调整(去除一些不规范编程告警,不调整无影响):# q. |) o9 A' g9 v6 Y2 G$ y
1 o1 q6 J* N- L+ i; a
69005a7ea375474fb7c57bb52c883ced.png
$ d5 ^. A2 p8 b4 H# v: N1 X& g( h- o0 d8 A# f
         取模软件针对每个字符输出了一个72字节的8bit的数值,也就是72字节*8bit=576bit=24*24像素,目前该字符编码在取模软件上设置是横向取模左高位,数据排列:从左到右从上到下,就意味着,每3个字节*8bit=24bit表示一行的像素,如前三个字符0X00 0X18 0X00->0000 0000 0001 1000 0000 0000,作为“嵌”字第一行像素标记,位数值为1的填充前景色,为0的填充背景色。具体代码如下:
2 @+ s' _+ Q4 f
  F# Q1 }' p4 d3 @" I' E# B& e
  1. //绘制每个字符,24*24像素大小
    ' r" A" e$ e9 M: c3 f8 [1 [
  2. void OLED_DISPLAY_24x24(uint8_t xpos, uint8_t ypos,uint8_t index)
    $ W" B8 e* [& B& V+ ~
  3. {: }; h1 e2 l; l: X
  4.         uint16_t textData[24][24]={0};    //24*24大小颜色矩阵! s6 s; o0 P8 p# z& x, ?
  5.         FNT_GB24 cur_text = code_GB_24[index];/ s$ s) I$ V' q& w$ v
  6.         for(uint8_t i=0;i<72;i++){
    ) `' `+ [& r8 A3 d( {, u. I6 D3 p
  7.                 for(uint8_t j=0; j<8; j++)
    + X5 W1 F6 }' @2 c
  8.                 if(cur_text.Msk[i]&(0x01<<(8-j))){' S+ F2 h9 p  w' i  e  Y
  9.                         textData[i/3][(i%3)*8+j] = LCD_DISP_BLUE;//前景色,蓝色# e+ W8 y( D$ A. m
  10.                 }else{- G+ x# X6 Q( J+ y* A5 v+ {
  11.                         textData[i/3][(i%3)*8+j] = LCD_DISP_BLACK;//背景色,黑色
    6 L. Q$ E: S. ]+ v: ~. l
  12.                 }
    " m/ Q) y0 W. P$ L+ F# j$ h
  13.         }( \. P) f6 e! J5 g5 _% k
  14.         for(uint8_t i=0; i<24; i++); |$ w2 ]7 m) ?' t7 T: }1 |
  15.         {
    / L/ S( h# X$ L4 W3 r) \! ^, B" r. L
  16.                 OLED_WriteLine(xpos,ypos+i,textData[i],24);//列像素渲染, [* `$ I6 g/ F& B( }' S3 ?. B6 ?0 j
  17.         }
    ! H. O) W6 S4 v& ]6 z: j
  18. }
复制代码
, m  h8 Y9 R$ `7 R, D; v" d/ {
        上述代码中,每个汉字72字节编码表,3个字节表示一行(列宽3*8bit=24),共24行(72字节/3=24),构成24*24的二进制矩阵,然后根据该二进制矩阵,为1的给与前景色,为0的给与背景色,从而得到24*24的颜色矩阵,然后在渲染时在24*24像素的LCD区域渲染对应的颜色,形成屏幕显示输出。4 f$ W- [$ C, b$ b! Y" o: j! b

% f# J2 h# E" U3 O, d        然后逐个字符绘制输出,完成前面输入字段“嵌入式开发测试!”的全部输出:
. O, c% t) H; M+ u
  1. void BSP_LCD_login(uint8_t xpos, uint8_t ypos)+ {+ |# R" |% Q+ r" d
  2. {2 H3 R* |- F7 ~8 P+ e
  3.         BSP_LCD_Clear_DMA(LCD_DISP_BLUE);! D$ \/ ~0 p& D
  4.         for(uint8_t index=0; index<8;index++)  `  p: _# g- I: o2 A
  5.         {
    5 f# a2 R$ l1 E0 W& b3 o$ X* Y
  6.                 OLED_DISPLAY_24x24(xpos+index*24,ypos,index);
    1 r* W, i: B7 X1 ?% [
  7.         }7 k1 i7 ~1 d- [, v! u( d
  8. }
复制代码
/ \& P4 y. z# L% C" @( g7 X
五、汉字输出测试
% I$ b" m3 ?" H& p# D8 o0 O9 o1 j        在主循环函数中,按键KEY0时,屏幕输出显示“嵌入式开发测试!”字段:! O) C2 U' M+ ?

: e2 p) j7 z3 G1 E
6ed62e52730f4575b6fd12358d1344a1.png
! r: ]8 D9 r$ R; G' ~. ^& h% j0 H) Y2 Y1 Y& [9 k6 N6 K& f0 u  u
         编译及下载:
/ J( f" k  |! ]+ \
9 l; n7 ^, e! I7 ~6 J! b: S
e9dd817922e248ccaeacdb5d33411c55.png 9 V# m2 ~9 ?" p7 z1 n

' |$ S2 A0 S0 N. }7 j# p2 G         按键KEY0,屏幕输出显示如下:
2 U  z( ^$ U: z% H5 ~0 X
4 L9 L: o! m5 t$ P1 j
7bb63e40a0994f8bbd59a704db07964b.png
5 E6 n; d0 b+ G, \# h) V
2 Q* z5 j2 a6 f) {
————————————————! ~2 Y. B% \/ E5 V: ^
版权声明:py_free-物联智能. y% T1 M5 C: {: ~8 W
如有侵权请联系删除
  A; j& p7 q( f; \* T" Z4 L
6 n9 z3 i0 B0 U- P/ S2 D0 j
# J/ M8 V* c/ z
赞 收藏 评论0 发布时间:2023-4-6 19:12

举报

0个回答

所属标签

相似技术帖

官网相关资源

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