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

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

[复制链接]
攻城狮Melo 发布时间:2023-4-6 19:12
一、汉字取模工具" {- k3 p7 V* R- l* v
        嵌入式LCD屏显示无非就是不间断刷新LCD宽度*LCD高度的像素矩阵,并为每个像素指定特定颜色。对于LCD屏幕显示汉字,无非就是将字体形状转换为字体宽度*字体高度的像素矩阵,及指定每个字体像素的颜色,然后在LCD屏幕指定位置按字体宽度*字体高度的像素矩阵进行刷新渲染。
' w- K8 M- J' r% d) _
( [4 B6 c+ g2 p0 P8 c) D5 w
        汉字取模工具可以设置汉字显示的行、列像素大小,设置字体类型等信息,将输入的每个字符转换成指定行宽、列宽的二进制矩阵,在该矩阵中,字体覆盖区域采用1标记、字体不覆盖区域采用0标记。# _7 }7 F3 U" Y* o
1 v1 R- p8 F" V/ ]6 I% R& S
$ ?2 @! F. m+ h* l
二、汉字取模配置
) t/ s& U1 C, z4 v" Z: k+ ?        我们双击LcmZimo.exe打开,取模工具界面如下,红框部分是字体相关参数设置,篮框部分是图片参数设置(通常用于各种艺术字体、图片像素等):
/ D0 w4 k$ C) }. u
( h* q/ U: D- Z4 b
dad45ae29967412094c3ef30ea54fd87.png
" W( c2 C2 @* _4 V; ?; p& \: o6 s. a" Q# @

" r- N0 Z& N0 S         现在来制作24*24矩阵的“嵌入式开发测试!”的字体编码表,如下图进行设置。+ W  `! S% A: F- L$ M
( [+ n! ?8 N5 |2 V. z2 Q+ O
a6da1cc46b4740c3a74302a6a4434f35.png
5 l! ^5 c( Y5 L* a, X* @) |
! N1 R( s9 U6 l9 O0 ]         最终得到字符编码表:1 h' }& @; X& T: R* h" Z

# S' m1 {/ q9 B: L
2359940c46ca4d39baaf9f54abec8a17.png
0 H- I4 q/ E  ?0 \7 {: {5 D/ Z! c9 F4 A4 k, Z- X
         点击保存,将字符编码表输出为头文件“pytest.h”,如下图:
2 F- V/ o& I5 T: Z+ {
# W0 M- D1 Z1 t6 z
9867dd20e996493e826540c40f5fbada.png
5 d/ Q  A& S0 y/ c( S+ N, ^2 ~" F. C% r

0 D/ x& q) R1 m* O/ p) L 三、创建工程
# Z: w0 ~& m% e/ p1 g        本文基于STM32L496VGT3的MCU创建一个新工程,并提前实现了lpusart串口驱动、三个按键及三个LED灯驱动、以及OLED屏幕驱动(SPI引脚)$ f' a9 a1 h" J4 z

' D! B) t0 D/ C1 y% M- |, r( k        假定已经实现了这些基本功能,在此基础上实现OLED屏幕显示刚刚定义汉字“嵌入式开发测试!”。
4 I1 R, P3 n: E# L3 x8 o; C3 x9 |- x: g
四、汉字LCD显示设计- M" |0 ^+ K7 a. n  ^9 O& O
        将刚才取模软件保存输出的pytest.h头文件拷贝到ICore/oled目录下,本文对pytest.h做了细微调整(去除一些不规范编程告警,不调整无影响):
2 W4 b3 O1 q8 \+ q  b: K3 M
& t4 {9 ?' h1 v- E4 l5 `
69005a7ea375474fb7c57bb52c883ced.png
" d; I' k; {1 `. {# u9 T
9 V: g- ~4 V5 @         取模软件针对每个字符输出了一个72字节的8bit的数值,也就是72字节*8bit=576bit=24*24像素,目前该字符编码在取模软件上设置是横向取模左高位,数据排列:从左到右从上到下,就意味着,每3个字节*8bit=24bit表示一行的像素,如前三个字符0X00 0X18 0X00->0000 0000 0001 1000 0000 0000,作为“嵌”字第一行像素标记,位数值为1的填充前景色,为0的填充背景色。具体代码如下:
7 V9 W1 q" I3 [, O6 V7 D) r; T( g6 `) @- _; B/ m
  1. //绘制每个字符,24*24像素大小7 r0 o( `  k$ t
  2. void OLED_DISPLAY_24x24(uint8_t xpos, uint8_t ypos,uint8_t index)
    ' V# t9 T, u( l, F$ v3 F# F
  3. {
    . j2 N; |' R" w9 ^9 b7 I& ?+ ~* H
  4.         uint16_t textData[24][24]={0};    //24*24大小颜色矩阵- T# k3 r8 r! Q$ U' T
  5.         FNT_GB24 cur_text = code_GB_24[index];
    " N# R& H  s; a) r- {$ E4 z
  6.         for(uint8_t i=0;i<72;i++){
    1 W! ~4 n* T, a( ^0 c! j
  7.                 for(uint8_t j=0; j<8; j++)
    9 y, w' J8 z6 h# K+ D- M
  8.                 if(cur_text.Msk[i]&(0x01<<(8-j))){% g+ e% _# q) d- F  O" |
  9.                         textData[i/3][(i%3)*8+j] = LCD_DISP_BLUE;//前景色,蓝色: R( f3 }% F; p- j0 }+ W( @
  10.                 }else{
    0 ?+ Z1 v: X" z' y3 E
  11.                         textData[i/3][(i%3)*8+j] = LCD_DISP_BLACK;//背景色,黑色
    ; _( k: B: S+ X* R6 S+ U
  12.                 }" g5 m! g5 }$ c. h
  13.         }" H# I8 O9 X1 n: O' D+ Q+ ~
  14.         for(uint8_t i=0; i<24; i++); `) P3 S) T- r6 [
  15.         {# _$ G% J( ?* W& b; o; E
  16.                 OLED_WriteLine(xpos,ypos+i,textData[i],24);//列像素渲染
    % }' L5 v1 C' V! R
  17.         }1 r* T2 j) [. I. {3 K& L8 e
  18. }
复制代码

% L  q) j$ `$ L+ J  t        上述代码中,每个汉字72字节编码表,3个字节表示一行(列宽3*8bit=24),共24行(72字节/3=24),构成24*24的二进制矩阵,然后根据该二进制矩阵,为1的给与前景色,为0的给与背景色,从而得到24*24的颜色矩阵,然后在渲染时在24*24像素的LCD区域渲染对应的颜色,形成屏幕显示输出。- |+ m! z0 w. m4 I" w  p3 ]0 n! O

3 e# M3 m: F' v$ m( ~: a& C% d        然后逐个字符绘制输出,完成前面输入字段“嵌入式开发测试!”的全部输出:; ^3 G" e3 V0 s
  1. void BSP_LCD_login(uint8_t xpos, uint8_t ypos): [, A" U( D% \6 \) I
  2. {, G3 @& H2 K8 C- M3 ?- o6 \8 _; c
  3.         BSP_LCD_Clear_DMA(LCD_DISP_BLUE);6 y6 x: h" P5 f3 d
  4.         for(uint8_t index=0; index<8;index++)( O4 f0 }6 V/ F2 k$ X% X# n/ \
  5.         {  u5 P6 G2 A, W* G/ \3 N+ i
  6.                 OLED_DISPLAY_24x24(xpos+index*24,ypos,index);) u8 N( H  \$ T& c
  7.         }
    : ~+ i% Y, t9 U/ z) c, g# q0 T
  8. }
复制代码

% T/ m: U5 O8 R9 l; }五、汉字输出测试5 |5 y; U* H5 X8 A
        在主循环函数中,按键KEY0时,屏幕输出显示“嵌入式开发测试!”字段:
8 [+ V/ J( [* l5 o" V7 |+ I3 I7 [2 B# ^/ Z8 I" f, \
6ed62e52730f4575b6fd12358d1344a1.png : H' O9 ~, X. h' e/ g3 _
  q" [5 T- e. w9 n! b) m( j
         编译及下载:
& U3 P' E& x& ]; K" x+ Y( U" T: r
e9dd817922e248ccaeacdb5d33411c55.png
8 q8 V7 r7 C* d- p  ~- p" x* ]" E9 O' |3 R
         按键KEY0,屏幕输出显示如下:
1 }# w: Q" y  `: ?# ^: b5 b1 u& i2 ^  M( q
7bb63e40a0994f8bbd59a704db07964b.png ( y2 X7 m& O; J  j) I
) @3 Z' @" ?5 n7 H& v: a
————————————————5 x+ [. g6 _( \/ y0 w6 ]' n
版权声明:py_free-物联智能4 y2 \1 \/ `! y) i
如有侵权请联系删除& O) _0 X: H; a

& G3 B5 N* j" p  `/ ^: e
$ h: V, {5 h3 A& T/ h( D% `4 s
收藏 评论0 发布时间:2023-4-6 19:12

举报

0个回答

所属标签

相似分享

官网相关资源

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