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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-6 19:12
一、汉字取模工具$ o4 S6 y& b  ]! q0 [8 a1 v
        嵌入式LCD屏显示无非就是不间断刷新LCD宽度*LCD高度的像素矩阵,并为每个像素指定特定颜色。对于LCD屏幕显示汉字,无非就是将字体形状转换为字体宽度*字体高度的像素矩阵,及指定每个字体像素的颜色,然后在LCD屏幕指定位置按字体宽度*字体高度的像素矩阵进行刷新渲染。( j$ V: f! k$ L+ ]# K

0 N$ t, I* e7 g. d5 x' T        汉字取模工具可以设置汉字显示的行、列像素大小,设置字体类型等信息,将输入的每个字符转换成指定行宽、列宽的二进制矩阵,在该矩阵中,字体覆盖区域采用1标记、字体不覆盖区域采用0标记。" E( D- P1 _! N: p) h' z" v

# E) y7 C& ?7 B  B( ]; V# u7 d, Z
% k+ _& }0 k" z+ C) |' `
二、汉字取模配置9 \8 A* r, H+ T. V- o, s2 L
        我们双击LcmZimo.exe打开,取模工具界面如下,红框部分是字体相关参数设置,篮框部分是图片参数设置(通常用于各种艺术字体、图片像素等):
! L+ f) }- o  @  ]
6 s# H- Z1 h* q- S
dad45ae29967412094c3ef30ea54fd87.png ; _* M% r: t& c7 l

* h9 T+ e8 i  E5 g1 S' _

1 I+ }' b$ j: Q3 l8 D         现在来制作24*24矩阵的“嵌入式开发测试!”的字体编码表,如下图进行设置。; l! S; Z8 |, W& d: b

! c% q' T& q8 @  f. O( @. x
a6da1cc46b4740c3a74302a6a4434f35.png ; x) J7 M& l( ^: B. N1 I6 I) K/ H, l
. N% R1 M4 O  A4 X, F% s$ }
         最终得到字符编码表:
* B7 G% x: t# d, s6 C( O
7 E8 Q7 q" }8 p9 `! ]+ M7 e/ {* A
2359940c46ca4d39baaf9f54abec8a17.png
( d* c9 `1 n- Y% P, n5 I. b; I& Y0 Y
         点击保存,将字符编码表输出为头文件“pytest.h”,如下图:
' \* P* {8 F8 b' L0 O
8 ]& u/ `1 L: p& w+ D8 M/ Z
9867dd20e996493e826540c40f5fbada.png $ M9 r  @) b" u9 Y" [. p4 }9 c, o
9 w! I; k5 ~; g# Q" y
7 |, G2 C" J' x
三、创建工程5 S  ]7 g" A. m: a2 _
        本文基于STM32L496VGT3的MCU创建一个新工程,并提前实现了lpusart串口驱动、三个按键及三个LED灯驱动、以及OLED屏幕驱动(SPI引脚)
# i' _3 g1 l1 T1 s: o" N
4 D$ E6 }( t9 i- c- f; w) v        假定已经实现了这些基本功能,在此基础上实现OLED屏幕显示刚刚定义汉字“嵌入式开发测试!”。1 f  [) I) \2 {1 ?

8 W  z1 n8 J6 d7 ]四、汉字LCD显示设计7 L) W8 U$ Y4 r9 }' Q4 H
        将刚才取模软件保存输出的pytest.h头文件拷贝到ICore/oled目录下,本文对pytest.h做了细微调整(去除一些不规范编程告警,不调整无影响):
( n! o+ E' B; L$ F4 x: K+ d$ I* ^$ v, Y2 x
69005a7ea375474fb7c57bb52c883ced.png 0 D+ G- X0 o  c: c. W* T
7 L4 v- g/ ?  S& v3 ~
         取模软件针对每个字符输出了一个72字节的8bit的数值,也就是72字节*8bit=576bit=24*24像素,目前该字符编码在取模软件上设置是横向取模左高位,数据排列:从左到右从上到下,就意味着,每3个字节*8bit=24bit表示一行的像素,如前三个字符0X00 0X18 0X00->0000 0000 0001 1000 0000 0000,作为“嵌”字第一行像素标记,位数值为1的填充前景色,为0的填充背景色。具体代码如下:$ z& I1 a1 T9 P2 i4 c* J# J
+ C  U! C% r* r+ B
  1. //绘制每个字符,24*24像素大小+ W  A; C  |9 C0 `3 T
  2. void OLED_DISPLAY_24x24(uint8_t xpos, uint8_t ypos,uint8_t index)
    0 O1 p9 Y( o1 A
  3. {
      x/ p/ S9 R: }! Q
  4.         uint16_t textData[24][24]={0};    //24*24大小颜色矩阵8 B. b3 [! {: k' Q2 ?' l
  5.         FNT_GB24 cur_text = code_GB_24[index];) j- }+ K+ ]3 y% P$ q
  6.         for(uint8_t i=0;i<72;i++){
    2 x- `1 p0 Z" ^# p5 D9 O
  7.                 for(uint8_t j=0; j<8; j++); ^* H5 \% D7 Y+ r" y
  8.                 if(cur_text.Msk[i]&(0x01<<(8-j))){
    - d; E. r9 Q+ G7 Y
  9.                         textData[i/3][(i%3)*8+j] = LCD_DISP_BLUE;//前景色,蓝色
    4 I( S6 q, V4 H4 h# _
  10.                 }else{
    4 I# m% F, |. V. v% m% L
  11.                         textData[i/3][(i%3)*8+j] = LCD_DISP_BLACK;//背景色,黑色
    . }' U% G+ v3 j! o; _0 K3 z
  12.                 }* n* ]" K' U/ K  o8 d$ N6 h
  13.         }
    5 P# r/ v& A" e* i  U+ ~5 ~
  14.         for(uint8_t i=0; i<24; i++)5 K  ~* F) I6 b
  15.         {4 `8 y! [5 O! V% k$ ]0 H' ?
  16.                 OLED_WriteLine(xpos,ypos+i,textData[i],24);//列像素渲染
    # o( z# G3 S, I' J! @
  17.         }
    ' w+ u0 ?4 m- F+ v0 r% P
  18. }
复制代码

3 m8 f. ^; _# Z        上述代码中,每个汉字72字节编码表,3个字节表示一行(列宽3*8bit=24),共24行(72字节/3=24),构成24*24的二进制矩阵,然后根据该二进制矩阵,为1的给与前景色,为0的给与背景色,从而得到24*24的颜色矩阵,然后在渲染时在24*24像素的LCD区域渲染对应的颜色,形成屏幕显示输出。
5 V( A. x# G2 K2 Q4 X* [7 G
' G' u/ X4 s; f9 e, h' K1 L8 j
        然后逐个字符绘制输出,完成前面输入字段“嵌入式开发测试!”的全部输出:
* T) s# A1 [2 k0 c
  1. void BSP_LCD_login(uint8_t xpos, uint8_t ypos). s4 X; g+ m' o/ C. I4 Y
  2. {
    / W( B( ~/ n4 p9 n
  3.         BSP_LCD_Clear_DMA(LCD_DISP_BLUE);
      A9 G. b5 Q' T; b6 u6 J0 Q
  4.         for(uint8_t index=0; index<8;index++)
    : I& c% g; m2 G1 Z6 {! N; P0 ]
  5.         {
    ! r5 A5 w+ C. W/ X% w* q
  6.                 OLED_DISPLAY_24x24(xpos+index*24,ypos,index);
    6 F9 s6 Z& ]8 M% k5 D3 f0 J
  7.         }" ]! m9 |0 C4 d
  8. }
复制代码

# U: {- K* d/ g. Z9 N5 g0 G4 w5 J五、汉字输出测试  [7 K6 n) k' J
        在主循环函数中,按键KEY0时,屏幕输出显示“嵌入式开发测试!”字段:
% t, P) D0 Q, _7 l9 F5 u# J" L- t$ [, u* t4 i
6ed62e52730f4575b6fd12358d1344a1.png
: Z7 D' f" g) t. {8 I0 h  L0 U; K9 T& k
         编译及下载:2 a  W- V5 l3 x* z3 Y7 f. y6 g

% K( U8 l% F9 k4 T% ~1 k4 Y5 x2 r% r' E$ @
e9dd817922e248ccaeacdb5d33411c55.png # S# Y: R4 o2 K5 o0 p
* S4 H& A6 a( ^" }3 b. ]% g
         按键KEY0,屏幕输出显示如下:
3 F. ?/ u6 N  }
. U/ H/ k% N" D
7bb63e40a0994f8bbd59a704db07964b.png . E" I7 K3 n) h( i. O- z' ^8 v
( U8 |% h+ [, B1 |& A
————————————————
8 ~8 K4 S+ O0 b- Y6 W2 N' Q版权声明:py_free-物联智能
# j% F& b! C/ }) g; L; \; B3 I( K- I如有侵权请联系删除
( t' _1 ?9 F7 G" W. A2 x7 E4 A
. U, d9 n3 l# i' Y/ J- H* x: B
收藏 评论0 发布时间:2023-4-6 19:12

举报

0个回答

所属标签

相似技术帖

官网相关资源

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