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

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

[复制链接]
老牛洋车 发布时间:2026-7-25 07:52
官方例程中显示不同大小的字符都是共用一个函数,即先指定字库、前景色和背景色,然后再将字符串及起始行列、对齐方式作为参数传送给字符串显示函数UTIL_LCD_DisplayStringAt(),如下图所示:8 T4 ^1 A( x, x8 G5 ~" V

1 N* z6 Q" P4 q" [ char1.png
9 {! ], Q: {, A8 J3 ?' H2 N( z
' v' `: M  M% P" k9 M' b在UTIL_LCD_DisplayStringAt()函数中也仅仅是处理好显示的起始位置后,依次将字符串逐个字符传递给后续函数UTIL_LCD_DisplayChar(refcolumn, Ypos, *Text)处理:
. |( v) ^) a8 K7 r; l char2.png ) M0 u$ ?( N( `% |6 B- i4 S/ D

% x: D8 K+ b# c7 J5 W, N后续的DisplayChar()函数如下:
5 T% Z) s% l1 M7 F# v
8 U$ w% o) w# ^6 O, ?. @, Z: x/**4 b, o, W8 [1 o' k
  * @brief  Displays one character in currently active layer.在当前活动层中显示一个字符。( S( v4 j: `/ C! ]: r
  * @param  Xpos Start column address
( ?7 k$ H3 n; `7 i* w/ X7 ]' I  * @param  Ypos Line where to display the character shape./ J* u8 H+ l0 `8 r
  * @param  Ascii Character ascii code; U9 d' i/ j/ j6 q. V
  *           This parameter must be a number between Min_Data = 0x20 and Max_Data = 0x7E+ h; U- C7 z. T' M/ g
  */
. w3 b$ A; k. U, |; h7 X- k. p' ivoid UTIL_LCD_DisplayChar(uint32_t Xpos, uint32_t Ypos, uint8_t Ascii)3 D( r  z$ G* u( q3 \4 R
{
* c% C/ g) w5 ^' n5 {. ]; g; E. Z  DrawChar(Xpos, Ypos, &DrawProp[DrawProp->LcdLayer].pFont->table[(Ascii-' ') *\5 o5 B/ p. n  Y, l/ O3 ^- i
  DrawProp[DrawProp->LcdLayer].pFont->Height * ((DrawProp[DrawProp->LcdLayer].pFont->Width + 7) / 8)]);0 C# n# J3 N8 C" m  J
}: e" [4 A( S8 L" m0 ?! p, ]4 l
7 `. G( F  f$ y* e$ y: w
在这个函数中也只是将之前指定的字库设置好,继续交给DrawChar()函数执行,DrawChar函数如下:; C- m* E* i  ?( \! x: D1 H

% j5 f$ r! R& E) `+ s8 ?+ A( X3 ~& u* f
/**# t5 n- Q6 C( r# c4 x! M
  * @brief  Draws a character on LCD.
, b# H& x1 f2 u/ B& u$ Q' L  * @param  Xpos  Line where to display the character shape
, Q0 r; h2 A9 y+ x  * @param  Ypos  Start column address1 P8 t; E8 \9 J
  * @param  pData Pointer to the character data
9 L& r* ]% L; y1 \  ]# c  */& d, E( L# H8 I) `: @+ m
static void DrawChar(uint32_t Xpos, uint32_t Ypos, const uint8_t *pData), [" a" R4 o# `, f, C; o
{3 p3 Q4 m  n% t3 A
  uint32_t i = 0, j = 0, offset;
: u3 t; @& R# `" Q  uint32_t height, width;
7 i" F* O% t' {. V, Q' F. c3 E0 |  uint8_t  *pchar;) s, b0 \$ y7 J9 D3 T$ w
  uint32_t line;9 g. V- K4 a3 |$ H7 T. ~

# S* B6 _. s; O& i, I6 B  u: m/ @  height = DrawProp[DrawProp->LcdLayer].pFont->Height;
5 p& N, `7 B. t: U  width  = DrawProp[DrawProp->LcdLayer].pFont->Width;
3 z/ [# F/ L; E" i$ p* _' j, n) C# B  uint16_t rgb565[24];
8 @, y6 A' ^, E; @  uint32_t argb8888[24];" q) L. x, C2 B

2 H6 O  C) D! V: F+ e0 S# [% M  offset =  8 *((width + 7)/8) -  width ;
  W- A* g! w- k3 [5 V; ?- v  d8 m* t, ?0 w  q4 ^
  for(i = 0; i < height; i++)
& u: m. ~# @5 l' ]0 i. X0 h  {
8 t5 K3 K% y. U+ E2 M    pchar = ((uint8_t *)pData + (width + 7)/8 * i);0 Q" i) k/ @$ X% d! @3 W

" _  M$ [! V& i9 ?' o/ X1 B; P4 f    switch(((width + 7)/8))
) E. w3 Z; A2 b( n- V    {0 \1 A% f& o! ?3 I* `" v  Y5 Y

$ R+ g; m* \0 k    case 1:* C, e8 ^1 ^1 H6 X$ P* E
      line =  pchar[0];0 S; E6 e& ^4 K6 o4 x) A* P/ {  M- [* U
      break;- g9 d) Z/ z* f' V3 P- ^8 r: Q3 @

) S, c5 h+ z# R    case 2:
! f7 Y/ j$ e5 L, S8 C; g      line =  (pchar[0]<< 8) | pchar[1];; V2 ?+ G; n3 A2 d; \; W
      break;
  \( C6 @* r4 @0 n- F
  G  J$ C) W/ f+ [    case 3:
. r  A- Q1 [3 A( Z* a; H    default:
* z4 \8 ?" R5 F1 g: b4 Y* t      line =  (pchar[0]<< 16) | (pchar[1]<< 8) | pchar[2];$ S3 a/ X" O% {& C  g( v1 C
      break;
7 l  Y2 k4 l' o+ h3 L! ^" a- w9 X    }
0 g8 S& @# Y. N( ?; m! l
* W4 y! w% M/ G( Z    if(DrawProp[DrawProp->LcdLayer].LcdPixelFormat == LCD_PIXEL_FORMAT_RGB565)# y0 x, q$ w; [
    {# F2 f; b- _% F% F+ I& v
      for (j = 0; j < width; j++)
7 \5 n' C$ P& v      {0 r. s/ Z9 l) g8 U. G5 v
        if(line & (1 << (width- j + offset- 1))); s, K3 T( c, p2 Q% d1 j
        {5 O5 r7 g  s, v; Q
          rgb565[j] = CONVERTARGB88882RGB565(DrawProp[DrawProp->LcdLayer].TextColor);, k% e- U' i+ {- L1 Y: U
        }) Z3 Q& C' J" p# s7 c7 U4 o; h
        else
) N0 r+ h- Q) d6 `        {3 a2 N; u+ a5 z# L. X% I+ D
          rgb565[j] = CONVERTARGB88882RGB565(DrawProp[DrawProp->LcdLayer].BackColor);/ H6 a: N# _; m2 n/ m0 {! s$ b
        }
+ R2 M0 F4 h! s! u      }
- M: ^' h# L# x4 ~/ ]; Y      UTIL_LCD_FillRGBRect(Xpos,  Ypos++, (uint8_t*)&rgb565[0], width, 1);) ]4 `) q. a6 {) @, W1 w' f
    }
7 \0 r, M  m6 z& M    else) b, w4 E# Y$ k
    {
, p# V4 L; u2 H  _9 `      for (j = 0; j < width; j++)
0 J8 t; R  g. G0 B5 B3 k& q$ A      {& G1 q- s% U6 f. q* f- k# {! e% v
        if(line & (1 << (width- j + offset- 1)))( g' t" [5 L: o) |
        {
. L5 E2 \% Y0 A1 M' u2 i          argb8888[j] = DrawProp[DrawProp->LcdLayer].TextColor;
; m5 Z" z; p/ @& }7 v4 x        }
1 _5 z" h0 h* K        else
, o. b& X. p4 J        {
( ~. n" x  I7 D! N" [          argb8888[j] = DrawProp[DrawProp->LcdLayer].BackColor;; `" M; z; k. p& J1 c9 u4 `% {
        }+ X- \: @# N& J8 A; b9 B
      }
0 ?2 w! K8 G' [$ H$ S' U7 A5 F      UTIL_LCD_FillRGBRect(Xpos,  Ypos++, (uint8_t*)&argb8888[0], width, 1);; q2 E; p' C) q  [
    }
' ]% [4 Z2 x0 ~* o  }( h$ [: d$ j! T4 {
}
4 R' H/ y( X! q3 ^- u5 e. I+ d  p3 Q; k0 p
: k; M5 Z- R2 o( W' s2 S6 a
在这个函数中,将字库中的字模逐个点交给写矩形的函数,在屏幕中“画”出字符来。, o+ m* n7 T2 z! g
我好奇的是:为什么不使用画点的函数UTIL_LCD_SetPixel(),而使用画矩形的函数UTIL_LCD_FillRGBRect()?! {2 u0 Y2 w% h3 R* f: y

5 P2 d  m6 p5 a* Z* l, I
收藏 评论0 发布时间:2026-7-25 07:52

举报

0个回答

所属标签

相似技术帖

官网相关资源

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