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

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

[复制链接]
老牛洋车 发布时间:2026-7-25 07:52
官方例程中显示不同大小的字符都是共用一个函数,即先指定字库、前景色和背景色,然后再将字符串及起始行列、对齐方式作为参数传送给字符串显示函数UTIL_LCD_DisplayStringAt(),如下图所示:/ T+ `  b! f! t& E' m4 s

4 Q  u- m- m; }6 {0 w# {* w9 I char1.png " g, H3 i  X% ?) ]
: D( {3 p$ w- Y6 P, c2 I8 f
在UTIL_LCD_DisplayStringAt()函数中也仅仅是处理好显示的起始位置后,依次将字符串逐个字符传递给后续函数UTIL_LCD_DisplayChar(refcolumn, Ypos, *Text)处理:
" ~9 `# ^/ b1 z char2.png 8 x" ~6 y: x$ a; w* w2 M% U1 H
' U* f: O4 f( \" |7 |+ L2 }
后续的DisplayChar()函数如下:
# m2 ]6 n. z# R3 q0 J6 D5 g8 W0 T# A: Q$ E0 m1 X& T* j% }
/**
4 f- B# V) k: W& ]* w1 X  * @brief  Displays one character in currently active layer.在当前活动层中显示一个字符。. g9 U( C, ~" f! V3 j
  * @param  Xpos Start column address
3 Q0 Q" l; D" {9 Y1 E, d1 G+ b/ l4 K  * @param  Ypos Line where to display the character shape.+ s9 U, U5 N  h
  * @param  Ascii Character ascii code0 m& }. e3 o% ?6 b
  *           This parameter must be a number between Min_Data = 0x20 and Max_Data = 0x7E( D0 }& g) c( O8 X3 T: b
  */
2 R- j% K3 E, R* a# tvoid UTIL_LCD_DisplayChar(uint32_t Xpos, uint32_t Ypos, uint8_t Ascii)
  @& T3 B% j5 @! O5 j7 u{
& X2 [+ S! o! a5 g+ D  DrawChar(Xpos, Ypos, &DrawProp[DrawProp->LcdLayer].pFont->table[(Ascii-' ') *\
* @: B" R5 B. e5 |5 Q  DrawProp[DrawProp->LcdLayer].pFont->Height * ((DrawProp[DrawProp->LcdLayer].pFont->Width + 7) / 8)]);5 g: J9 H1 a& [! {2 ?' g
}& A+ w4 r/ {5 o$ t+ _0 K9 d

. U% z8 `5 ~5 H. ~% f在这个函数中也只是将之前指定的字库设置好,继续交给DrawChar()函数执行,DrawChar函数如下:- C6 Z3 |0 k4 A, D, b4 f1 B3 Z3 `8 X

) ]7 B; j/ G  {. P5 o. n7 [' D: t# `2 g1 ^+ G( S  o
/**
6 {, \# H6 s* U4 D. K  * @brief  Draws a character on LCD.! u7 q$ K3 R% W& L, ~) A' ~
  * @param  Xpos  Line where to display the character shape
7 \$ G9 `! J$ e7 c; O" h' h  * @param  Ypos  Start column address: Z5 `1 ~: t* G  z& O6 }
  * @param  pData Pointer to the character data! d" K$ V3 N, c. r' S! H
  *// C4 U; y2 h. g. A% C" i: n- Q
static void DrawChar(uint32_t Xpos, uint32_t Ypos, const uint8_t *pData)3 G# [" i- G, X  B5 e+ {: v
{
: q- F' J0 y, u6 b. y  uint32_t i = 0, j = 0, offset;& u" c3 @1 i7 o% ]
  uint32_t height, width;
* O! K% I- T8 v( i: c  uint8_t  *pchar;% T1 S  _1 w: v& c  s5 r
  uint32_t line;
& y# _( p$ j$ P: Y6 N) [$ U- I% _  Y; T% c
  height = DrawProp[DrawProp->LcdLayer].pFont->Height;
: _  v* R" @% T+ Q: ^8 s8 W  width  = DrawProp[DrawProp->LcdLayer].pFont->Width;
4 |$ B. O6 ~4 v* Y# b# n/ N1 k  uint16_t rgb565[24];0 L& w7 D% g1 ]1 |" G6 z, D
  uint32_t argb8888[24];% ]0 z! `# B( z

8 I4 }) @* _3 U8 ^, W2 f3 [% l  offset =  8 *((width + 7)/8) -  width ;/ ?- q5 y; `1 a1 _7 C- A

  e+ v+ q6 _2 F# s4 X4 h  for(i = 0; i < height; i++)
0 H3 }3 x; a! n  {/ n  N. ]* B) \
    pchar = ((uint8_t *)pData + (width + 7)/8 * i);
8 L- I' W6 N) c7 P6 `* _
/ p! m  j8 Z7 v4 A. l    switch(((width + 7)/8))  J7 f8 W1 u2 E, I  O
    {( w3 z  l2 V2 z. _, c
' C9 ^- P4 ?/ y" ^4 g
    case 1:
9 j7 I" Y: y/ c: @; j      line =  pchar[0];8 s& F/ y$ Y/ o+ X8 W
      break;
. c* V2 v; f. n+ p& P
& o; N0 n% i4 V) y) N4 ^8 d    case 2:2 i8 w# W1 r/ I0 @: e: P" h5 d
      line =  (pchar[0]<< 8) | pchar[1];  ?! N$ c8 U/ }$ p! u0 ~* f3 J; b: ]
      break;
0 B4 Q! Q1 y: N4 n5 _* V* y5 m, D
    case 3:( L8 q( [4 b  C, [5 \6 y" j
    default:
7 G5 T( ?) n+ t7 J* t      line =  (pchar[0]<< 16) | (pchar[1]<< 8) | pchar[2];
6 \7 c; `0 O6 w. ^% Q& E1 W- i9 u      break;
  [0 n7 k( f! X8 b" m    }7 z3 x( C8 g! l! l. \

2 @4 s+ d8 \5 T2 n) i    if(DrawProp[DrawProp->LcdLayer].LcdPixelFormat == LCD_PIXEL_FORMAT_RGB565)0 ]! ]: {2 J9 m& W8 Y: v
    {
4 o5 u1 Z$ C' x- w# [6 f7 L      for (j = 0; j < width; j++)
4 r$ H: I' c$ D8 ?8 [5 ]' D+ \3 ~      {+ e8 a7 y' l7 [4 t- q
        if(line & (1 << (width- j + offset- 1)))- ?2 T! S6 w1 s
        {# q, Z' r( @8 C# f3 [1 `
          rgb565[j] = CONVERTARGB88882RGB565(DrawProp[DrawProp->LcdLayer].TextColor);
3 q* ^6 ]( p3 j' y$ v        }
' b3 @9 G2 {7 w% M0 c* W4 U        else; A! O' G  ^3 k; V9 X
        {
8 M3 j+ T% P9 {2 F/ h          rgb565[j] = CONVERTARGB88882RGB565(DrawProp[DrawProp->LcdLayer].BackColor);6 `0 ]0 B9 x% @9 B
        }
0 T" d5 D0 c, W# y' d) `      }
, @1 h9 X9 c& y5 \, X3 J      UTIL_LCD_FillRGBRect(Xpos,  Ypos++, (uint8_t*)&rgb565[0], width, 1);
) N7 U  A% U# t( j* n0 l6 j    }) J2 P2 ]6 A# l, J, {
    else
6 l% R. V" b5 p& f; f: P+ z    {% i( m2 G5 i2 ?. ^" N, H
      for (j = 0; j < width; j++)& e- @$ {2 _6 H& y3 x' a
      {
/ {" F0 c3 v. x3 n7 o* m        if(line & (1 << (width- j + offset- 1)))
. @9 N  R6 Z, ^6 E) I% p# }        {9 C' I  s- Z4 \3 B( G! I
          argb8888[j] = DrawProp[DrawProp->LcdLayer].TextColor;
: E  v% R9 l2 N        }: |3 h% u: Z" o1 g* C" \# W
        else; H+ N, b! W* l! H6 I1 |" u0 C1 X( F
        {+ I, b/ `: a+ _& x7 I9 `
          argb8888[j] = DrawProp[DrawProp->LcdLayer].BackColor;
! a4 U, p1 V3 l, \8 R; j        }5 u- i* F% |) a7 ?1 G, |/ z
      }
; o3 n9 l1 }' h1 d2 p      UTIL_LCD_FillRGBRect(Xpos,  Ypos++, (uint8_t*)&argb8888[0], width, 1);
% e( e! Q* |! K, C/ P- g+ ~9 F    }
+ G: R/ X- m( B( p  }
" U: e# A2 y6 J" u5 k0 d9 R( x}) k' S4 N$ V" j# _: _# ?) R
3 D9 o2 N) v$ O

7 Y: b. ]# I' W% c) y; f在这个函数中,将字库中的字模逐个点交给写矩形的函数,在屏幕中“画”出字符来。
4 @+ E+ J4 {' ~+ f' [$ j我好奇的是:为什么不使用画点的函数UTIL_LCD_SetPixel(),而使用画矩形的函数UTIL_LCD_FillRGBRect()?
, n( w0 u. v4 |3 H3 C5 U# W. W: x- k5 L! t* Y- h" e
赞 收藏 评论0 发布时间:2026-7-25 07:52

举报

0个回答

所属标签

相似技术帖

官网相关资源

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