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

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

[复制链接]
老牛洋车 发布时间:2026-7-25 07:52
官方例程中显示不同大小的字符都是共用一个函数,即先指定字库、前景色和背景色,然后再将字符串及起始行列、对齐方式作为参数传送给字符串显示函数UTIL_LCD_DisplayStringAt(),如下图所示:8 p, O+ V, \2 n6 Q6 Z! t
) b; R& X. G3 w
char1.png 3 J! R/ {. N6 B
; }8 ?2 l% R2 Y5 O6 ]3 q% p) A1 R+ U
在UTIL_LCD_DisplayStringAt()函数中也仅仅是处理好显示的起始位置后,依次将字符串逐个字符传递给后续函数UTIL_LCD_DisplayChar(refcolumn, Ypos, *Text)处理:
& n0 {. k: _4 {$ h% Z7 U char2.png " P# E; l' o2 ^

0 G$ L' [, S* ~1 r后续的DisplayChar()函数如下:" _3 N/ U" I: n: N, V$ V, v

( D9 P. a& _8 F1 ^& c4 M. `$ B4 \/**
' R# Q9 j% h: H2 p  * @brief  Displays one character in currently active layer.在当前活动层中显示一个字符。
5 D% j! g: u. F& P7 T# r  * @param  Xpos Start column address7 H/ [: I+ G' L+ Q9 P" ?. v! Q' A
  * @param  Ypos Line where to display the character shape.. M9 ]$ S8 d8 c0 W1 {* f
  * @param  Ascii Character ascii code  Y  c/ \/ U9 X; c; W) J/ J
  *           This parameter must be a number between Min_Data = 0x20 and Max_Data = 0x7E! d: _0 O$ Y; }$ s& @
  */
  J# ^2 w/ D1 q, svoid UTIL_LCD_DisplayChar(uint32_t Xpos, uint32_t Ypos, uint8_t Ascii)
: m6 ?6 A, C" f, o{( a, y9 h" _& k2 k& ~
  DrawChar(Xpos, Ypos, &DrawProp[DrawProp->LcdLayer].pFont->table[(Ascii-' ') *\
2 C4 u& W) D" Q" e) X! S0 R, S  DrawProp[DrawProp->LcdLayer].pFont->Height * ((DrawProp[DrawProp->LcdLayer].pFont->Width + 7) / 8)]);" }; W7 n0 B3 p% ?/ y8 K
}, ^6 B* U- w) N6 x: Q; f' [

1 C# u5 A8 y/ I; q2 M! E在这个函数中也只是将之前指定的字库设置好,继续交给DrawChar()函数执行,DrawChar函数如下:
3 m: [2 V# e& t' Q2 x, a& x+ C- R& [4 B' y" f' Z3 H: W
4 w* X. o. h* a0 ?) n* {
/**
1 z  Y7 H) @  F; {  * @brief  Draws a character on LCD.
8 z5 `7 i% [0 @( w! d3 m  * @param  Xpos  Line where to display the character shape# A7 P- c/ x6 e" I
  * @param  Ypos  Start column address( U$ Y8 d+ U/ c
  * @param  pData Pointer to the character data+ t, K3 |7 x2 h, a
  */
6 V" b' u% I0 n/ `4 |static void DrawChar(uint32_t Xpos, uint32_t Ypos, const uint8_t *pData)4 C6 l2 N$ h( n- I- i
{
' ]9 d8 _' r! L) y1 [( K+ C1 B6 I  uint32_t i = 0, j = 0, offset;
! Q# F, v5 Y, U, |: Q/ P4 r, z5 A  uint32_t height, width;
. }  s" E3 O! |  uint8_t  *pchar;. O* G/ s6 M0 S
  uint32_t line;
- |: g$ M% F# O% X1 `
. |8 T8 r1 l: B0 M; |0 l" F3 d6 q  height = DrawProp[DrawProp->LcdLayer].pFont->Height;
3 c. c  r; S9 g& s, U1 L  width  = DrawProp[DrawProp->LcdLayer].pFont->Width;  y6 y- R- O% h8 y1 t
  uint16_t rgb565[24];4 \0 B$ E' S$ l( s6 N# b
  uint32_t argb8888[24];
1 d9 Y8 y5 F# Y9 o+ J2 G) ?1 c
  offset =  8 *((width + 7)/8) -  width ;7 j8 \( G+ n- h  ^- t

( F7 y- }0 P$ d( \3 q# b1 ]  for(i = 0; i < height; i++): V# [' r4 @5 g* X3 w4 D
  {
. r. d9 d1 U8 k1 K" ~& x( h8 Y    pchar = ((uint8_t *)pData + (width + 7)/8 * i);
! ?9 a5 I* o; q# N( |* p9 \( _8 w* [/ t3 x' t5 Y7 x
    switch(((width + 7)/8))$ U8 c* _( a3 i
    {
9 N/ B4 p+ `$ @4 q* D4 [: G
4 }% C8 j& h9 S# }    case 1:
1 F/ }0 s5 `7 ^2 I. i      line =  pchar[0];' |" |  f$ \* q" h1 C
      break;/ S* s2 c2 Z! }4 T- R5 L) w

0 w, ?) ?" a1 p3 Y; n4 K/ a    case 2:" q7 F8 S: a6 u8 f4 V6 t9 F/ o9 x
      line =  (pchar[0]<< 8) | pchar[1];
/ l! {! o+ z- \      break;
9 a4 c0 f& P1 t# W* ?
2 V: {- c& T* d, E, Q' ]& f  Z    case 3:( F4 F: w! L' X2 q* B
    default:
& v1 ^7 {  a0 h6 @. E7 r      line =  (pchar[0]<< 16) | (pchar[1]<< 8) | pchar[2];" U. O$ W; y* U4 m2 V0 d
      break;+ E; z& V7 o( b
    }
# F9 U% t/ O5 {5 @; H' B6 s( h' O- o
    if(DrawProp[DrawProp->LcdLayer].LcdPixelFormat == LCD_PIXEL_FORMAT_RGB565): x  k) V7 o7 z# T
    {4 u+ S# f! K6 Y' R
      for (j = 0; j < width; j++)
& H! U: ]6 B- E9 n7 I$ j  ]2 k      {
# |/ ]! a* G0 b" H1 }        if(line & (1 << (width- j + offset- 1)))2 Y, A# o3 R3 T( e4 _+ N# ]( L
        {
* L5 w4 e$ D, ]- G5 t; x" X% C% p" `          rgb565[j] = CONVERTARGB88882RGB565(DrawProp[DrawProp->LcdLayer].TextColor);% }& R2 @; a! t0 T! X
        }
% ]( r2 t" Z. D1 i2 [4 x        else
; D; F) [: l$ U/ C2 g# `6 {( z        {8 E, q8 s0 l0 h- i. p
          rgb565[j] = CONVERTARGB88882RGB565(DrawProp[DrawProp->LcdLayer].BackColor);% o1 f: m; p8 S
        }4 e- Q3 J4 ?. V! O+ p- o- b! G
      }
7 B6 L& l; s  q" @7 U* j      UTIL_LCD_FillRGBRect(Xpos,  Ypos++, (uint8_t*)&rgb565[0], width, 1);
, m: B) d/ v  H: r: Y    }
5 }7 y, O& T! E2 q$ {    else
" I) s% q# v5 G9 q9 L    {1 y1 F* q  e& j- I4 J/ P
      for (j = 0; j < width; j++)
4 n9 W- g- u3 n% k2 |      {
$ O5 o$ w1 K: v$ a2 l        if(line & (1 << (width- j + offset- 1)))
) a) U3 v( V) _# M3 c2 e        {
+ e( }0 S0 n6 a- u& ~& @          argb8888[j] = DrawProp[DrawProp->LcdLayer].TextColor;
$ H9 U2 n1 Q& D        }% x& Q' q5 K- d9 N
        else
" W. u5 l' m( }7 H  R3 U        {' _8 e- ?; R. ?# {* \
          argb8888[j] = DrawProp[DrawProp->LcdLayer].BackColor;
; l7 V  o7 ~0 \: W3 K4 ^$ A4 K        }
& r  o) p; u, k  [, q: d      }  Y! `2 e/ M, U  e" @" D
      UTIL_LCD_FillRGBRect(Xpos,  Ypos++, (uint8_t*)&argb8888[0], width, 1);# N& z: a) F% M8 r, F' M0 J/ l
    }! `2 P( |% s0 n& S: r
  }/ U# Y5 x3 z0 I* C! B
}6 D; E& d5 }: e9 M' c4 W

" u7 n% j( ]( f% q- V
8 h1 q0 \1 @. W2 C# ]- [在这个函数中,将字库中的字模逐个点交给写矩形的函数,在屏幕中“画”出字符来。
4 J% o, ^5 X& n我好奇的是:为什么不使用画点的函数UTIL_LCD_SetPixel(),而使用画矩形的函数UTIL_LCD_FillRGBRect()?
0 h7 I1 D, Q' @7 u
* U1 x+ [3 ~% O- C0 r3 C& V
赞 收藏 评论0 发布时间:2026-7-25 07:52

举报

0个回答

所属标签

相似技术帖

官网相关资源

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