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

STM32L562DK探索板——字符显示功能的剖析

[复制链接]
老牛洋车 发布时间:2026-7-25 07:52
官方例程中显示不同大小的字符都是共用一个函数,即先指定字库、前景色和背景色,然后再将字符串及起始行列、对齐方式作为参数传送给字符串显示函数UTIL_LCD_DisplayStringAt(),如下图所示:
8 _" ~- h$ z) K+ J5 b7 C2 m, f) k, v: I7 f: n# ^7 _! C
char1.png
# t( m7 b  Q/ P' D
$ N9 k3 A- A2 i$ j6 ]/ e9 S" v在UTIL_LCD_DisplayStringAt()函数中也仅仅是处理好显示的起始位置后,依次将字符串逐个字符传递给后续函数UTIL_LCD_DisplayChar(refcolumn, Ypos, *Text)处理:- @7 q( i) h# U6 k7 ]  [7 K
char2.png ! f5 ]' }6 h# {

$ e( l/ A+ S& G* V' N后续的DisplayChar()函数如下:
' i1 M! Z6 z, q& A  I$ e; V# O1 s7 B
5 q, u% t- e1 [/ M1 s# \2 B/**
/ D/ S* S! g6 Q0 ]1 ]. f  * @brief  Displays one character in currently active layer.在当前活动层中显示一个字符。1 Y$ h; H' K; Z  V
  * @param  Xpos Start column address4 C! f/ ~: g9 N* Q
  * @param  Ypos Line where to display the character shape.% F& R. O$ t6 T6 w" Z* I# q
  * @param  Ascii Character ascii code2 w& Z5 A! Z0 T7 [6 j
  *           This parameter must be a number between Min_Data = 0x20 and Max_Data = 0x7E
% r6 {, J, S4 z  */8 l4 U4 Y" k3 j0 |
void UTIL_LCD_DisplayChar(uint32_t Xpos, uint32_t Ypos, uint8_t Ascii)  e$ v+ n$ e  q
{
+ D# `9 c$ F) z# |$ I3 q  DrawChar(Xpos, Ypos, &DrawProp[DrawProp->LcdLayer].pFont->table[(Ascii-' ') *\  T8 o& _$ M3 l6 {% u6 x
  DrawProp[DrawProp->LcdLayer].pFont->Height * ((DrawProp[DrawProp->LcdLayer].pFont->Width + 7) / 8)]);
% w0 W) r; V# e, o2 g}5 i; z6 h) S0 a& D! Y
7 V8 [1 N( V* `! t% H/ U! S
在这个函数中也只是将之前指定的字库设置好,继续交给DrawChar()函数执行,DrawChar函数如下:
& {: i6 V, o% N, P) b; }$ |4 T) Z! i  C4 l; [& |

( ^1 l$ w: ^/ }3 Y6 I% @# H7 }/**) N: l; m" w- I3 U2 E2 Z. c; }
  * @brief  Draws a character on LCD.% W9 R1 Y* o, Y1 ^0 N+ |7 b
  * @param  Xpos  Line where to display the character shape, Q2 e5 q) b& w+ T) }
  * @param  Ypos  Start column address$ _7 f8 b9 s& _  Q. S- m
  * @param  pData Pointer to the character data
( q9 G6 K& b% i  */
' w! C, J9 G% m' \; q- kstatic void DrawChar(uint32_t Xpos, uint32_t Ypos, const uint8_t *pData)
& [& `$ T3 \: ?5 D{. S$ r( }9 V8 c8 t9 S
  uint32_t i = 0, j = 0, offset;
7 z$ o" [) b( k/ V& M  uint32_t height, width;0 j0 p, F0 ?, }$ T: r" h
  uint8_t  *pchar;
7 R% w0 g8 |. B( [  uint32_t line;# C+ y! m5 l& s- M5 L9 r
6 W5 m' B2 o( W/ ~* A7 G' y! o( F
  height = DrawProp[DrawProp->LcdLayer].pFont->Height;( z6 p  I8 g  t) d6 V; ]
  width  = DrawProp[DrawProp->LcdLayer].pFont->Width;) v, P4 U/ a' M/ d- K+ m  u2 @
  uint16_t rgb565[24];0 y& }9 s% A4 N( D2 k% I; ^) Z8 B
  uint32_t argb8888[24];
: y9 P2 f' W4 |1 a" v" k0 P) O0 T/ E- i' P( s; b- A
  offset =  8 *((width + 7)/8) -  width ;
7 ?) J1 E' Y0 O: I' a! ?. M  @! o$ G- z' W" A" a7 c* ]: R- t
  for(i = 0; i < height; i++)
% Y. v# Q2 R0 P5 e; q+ A  {; T. p% s0 C/ l3 h. }2 Q# B  R
    pchar = ((uint8_t *)pData + (width + 7)/8 * i);
; Z8 P; f" l: |5 L$ m1 B$ `# B
$ f8 n. h: W- w5 y+ L* ~2 Q    switch(((width + 7)/8)), S6 o% g8 J! O1 y; Q
    {
, ~" R" S9 R$ u+ E. j  r# x2 q  c6 C" }! w& {
    case 1:" V  _7 O8 `& K0 `, F, \: I
      line =  pchar[0];/ E$ ^; n# e" ~& Y
      break;
3 F  ]; v% R* e7 j/ k, w3 m9 j
2 I$ x$ E( q5 K. h    case 2:7 s, S) o" |1 e3 @% O2 F# {2 f
      line =  (pchar[0]<< 8) | pchar[1];* v  y/ t: ~2 g
      break;
0 Y/ u7 R; {/ k+ L3 \& L) l1 f2 Q) X6 I  h' f" w7 t
    case 3:- P! I9 U) @, M6 H
    default:
* ]1 @7 R! d) e$ K      line =  (pchar[0]<< 16) | (pchar[1]<< 8) | pchar[2];  t  V9 L/ |* w- `& _$ O
      break;* B! X. B% S5 H; v* |: d
    }) r& N, {; u8 L. u$ c
: O$ Q' `/ @7 h* X  `  ]
    if(DrawProp[DrawProp->LcdLayer].LcdPixelFormat == LCD_PIXEL_FORMAT_RGB565): z2 J6 Z6 s$ j, |. [
    {1 D: h* B+ A2 g/ I+ W) @
      for (j = 0; j < width; j++)
8 S/ d$ e7 f' H5 B6 |      {" |# |" o2 G9 _" h7 k' Z/ k' K
        if(line & (1 << (width- j + offset- 1)))
/ c6 l+ w/ R" I& {; G        {
, v+ e+ ~9 O$ z          rgb565[j] = CONVERTARGB88882RGB565(DrawProp[DrawProp->LcdLayer].TextColor);/ E4 S/ A1 [5 W9 p( P
        }" z4 Z* H8 q8 A6 M8 o* t
        else
! a' }& X. o$ i        {
, P" o* \* A5 i          rgb565[j] = CONVERTARGB88882RGB565(DrawProp[DrawProp->LcdLayer].BackColor);. E- N. ~( u( |4 J5 N% D3 T$ N
        }
# l5 P2 B2 p( D3 {8 g3 i! B, s      }% ?( K1 C7 ~. x6 Z* T/ v* h+ ?
      UTIL_LCD_FillRGBRect(Xpos,  Ypos++, (uint8_t*)&rgb565[0], width, 1);
* M1 B$ C% B* F5 [$ e" ~    }9 ]" s. Q, _- L, ~  L0 a: B( f
    else
3 H# ~$ j. M1 {/ a- N    {* X( b  r: n( x: R" r$ ~! [  P3 Q
      for (j = 0; j < width; j++)2 w( c6 V: k' G! ^
      {/ O$ U2 |/ k3 }; i! r
        if(line & (1 << (width- j + offset- 1)))
3 o: g( i2 R' E+ Z        {
: p  @4 a: E( h. P* i" X" Q          argb8888[j] = DrawProp[DrawProp->LcdLayer].TextColor;$ F3 |" V4 D6 o% d8 n% F  v3 j
        }
9 q7 H: h) R; z& U+ Q# _        else" }+ c7 p1 g( O
        {
6 a- j; Q2 Y* b: a          argb8888[j] = DrawProp[DrawProp->LcdLayer].BackColor;
3 {8 f( r* \! K7 H6 I2 A" [' q        }( O& ]- x+ R! _- g6 K$ n0 \
      }
  u+ @# h& B/ d* b/ L6 r& N      UTIL_LCD_FillRGBRect(Xpos,  Ypos++, (uint8_t*)&argb8888[0], width, 1);
+ A' L- {& j6 k3 Y    }
* k9 P$ H9 X* l  }0 t& o, J1 @. b) L7 a! ^8 q; x2 h
}6 N% P! ]6 j$ K; q

+ C8 w2 V# Y4 V5 `$ I" l5 ^7 ~% u
在这个函数中,将字库中的字模逐个点交给写矩形的函数,在屏幕中“画”出字符来。
- \! I! A3 i8 J; b4 q* B我好奇的是:为什么不使用画点的函数UTIL_LCD_SetPixel(),而使用画矩形的函数UTIL_LCD_FillRGBRect()?: \" B3 i9 a6 c/ H* T, F2 S, W: _
- ^  A" N( v0 X, X* ~, Y
赞 收藏 评论0 发布时间:2026-7-25 07:52

举报

0个回答

所属标签

相似技术帖

官网相关资源

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