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

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

[复制链接]
老牛洋车 发布时间:2026-7-25 07:52
官方例程中显示不同大小的字符都是共用一个函数,即先指定字库、前景色和背景色,然后再将字符串及起始行列、对齐方式作为参数传送给字符串显示函数UTIL_LCD_DisplayStringAt(),如下图所示:% x4 b% B7 @) T8 h) E  ^- B
5 m2 ~/ E# ?$ i9 H
char1.png   p* Z  I, G$ `" j6 |! F
! ^8 L* K6 u! b
在UTIL_LCD_DisplayStringAt()函数中也仅仅是处理好显示的起始位置后,依次将字符串逐个字符传递给后续函数UTIL_LCD_DisplayChar(refcolumn, Ypos, *Text)处理:
, I( W$ s  |. A3 \4 f char2.png
: f4 |7 w  T- W% d" N' \* w# J$ s) l6 V9 @2 v( l, l! V
后续的DisplayChar()函数如下:
' t& M# _0 S0 h3 t3 l/ B4 q* [
" ]0 F$ _: _3 W  Q2 q( r) Z# r. K/**$ s  X& E5 n# v$ o* F1 L
  * @brief  Displays one character in currently active layer.在当前活动层中显示一个字符。
% K, T. a6 ~+ Y1 V$ J1 _' |  * @param  Xpos Start column address( M% |9 _. p/ l& ?" L5 l* S
  * @param  Ypos Line where to display the character shape.
& k1 y* k: `9 _. K2 s# S  * @param  Ascii Character ascii code
# a; m$ ]% k* w4 K' ]+ N5 k  *           This parameter must be a number between Min_Data = 0x20 and Max_Data = 0x7E
" c. Z- U& U  L- b% U$ W  */
1 d# L; }$ Q9 ]8 X: A. yvoid UTIL_LCD_DisplayChar(uint32_t Xpos, uint32_t Ypos, uint8_t Ascii)2 X9 T, F3 i8 W% b
{1 E0 Q1 Y0 [8 @: f6 k4 j
  DrawChar(Xpos, Ypos, &DrawProp[DrawProp->LcdLayer].pFont->table[(Ascii-' ') *\) x  u( x2 V; L2 ~/ E3 s; G
  DrawProp[DrawProp->LcdLayer].pFont->Height * ((DrawProp[DrawProp->LcdLayer].pFont->Width + 7) / 8)]);; a7 M! ^  W7 r" l: l) j
}" r; I, g' N4 E6 z8 d

9 ^( x7 B8 `$ j在这个函数中也只是将之前指定的字库设置好,继续交给DrawChar()函数执行,DrawChar函数如下:
7 q0 p+ ^( u7 D+ j6 q9 i0 [
4 Q9 _  z) A' f% k" V2 S
; @: R" {* O" @% a/**8 l; ~) o1 D* }6 h# x" a
  * @brief  Draws a character on LCD.
( @9 J4 R8 d3 d/ g' k  j2 G8 l  * @param  Xpos  Line where to display the character shape
3 d$ R; v4 v( m8 D+ ^+ z  * @param  Ypos  Start column address- _( E! T2 b! i& @1 v% |' n. Y
  * @param  pData Pointer to the character data$ X1 n' [4 I! b, Q/ {
  */6 N! B) W, w5 b- ]1 ]4 w
static void DrawChar(uint32_t Xpos, uint32_t Ypos, const uint8_t *pData)
4 I: \/ Y2 g. S$ d3 R5 d{
3 c7 ?+ q3 C/ D, ^' C. s' J  uint32_t i = 0, j = 0, offset;2 A0 c- A4 m2 B8 S  X, U
  uint32_t height, width;4 e6 D" `' m; F2 Y) Z$ p* `! r
  uint8_t  *pchar;
% w, ]. c2 L5 o. t% U* t$ _4 z& h  uint32_t line;
" s& n3 v; u) }# V2 k* A. U
; q! k4 R. i9 e( K% _  height = DrawProp[DrawProp->LcdLayer].pFont->Height;
+ Y1 [1 Z9 |/ p. a1 B& |  width  = DrawProp[DrawProp->LcdLayer].pFont->Width;
# \. D; C, d" K( o( o1 ^3 w  uint16_t rgb565[24];- V  k: w- ?7 f* A1 h. `& o
  uint32_t argb8888[24];, q& i3 `2 |8 A9 S

3 V  o* p/ B" Y. u: t$ Q4 M% Y  offset =  8 *((width + 7)/8) -  width ;
0 u/ W2 g; C3 Y) U7 M0 J! [# |1 E7 b# V% n
  for(i = 0; i < height; i++)
3 A5 t9 u2 c% m& Q  {
4 P1 U. w. K2 I9 i: ?. g6 |) @2 E3 q& k    pchar = ((uint8_t *)pData + (width + 7)/8 * i);3 g  C9 y. p  M& v( f+ \7 C

0 w( @5 Y$ Q; R; o' J    switch(((width + 7)/8))$ j- @+ n6 t9 I. {. H% I4 Y; n% T7 Z
    {
/ t# q* E9 ^7 w6 [  u) @+ Y  b" A2 |8 V
    case 1:
( [0 L4 A2 m1 l" Z4 n      line =  pchar[0];1 g* o( H4 ?) N0 t/ n4 d
      break;
7 j' W5 ]+ a; I* C" N- u% Q" Z
7 s9 |& x- I; a+ n    case 2:, A2 M& v7 a1 E2 O6 m
      line =  (pchar[0]<< 8) | pchar[1];
4 S, C- ^. \% @+ F1 o      break;4 i- m# A1 @- g7 u7 v. i
3 o7 f6 f, _! U3 q5 F  g
    case 3:, b: U/ M; |+ t5 [2 W( r
    default:
$ t" ?; V8 O  Z/ S$ h8 V/ |( Y      line =  (pchar[0]<< 16) | (pchar[1]<< 8) | pchar[2];
- ]4 l+ D1 ^# K3 {" I' Y6 e/ P, S      break;& T3 o5 Y1 b# f1 l  J' Y; C
    }" p! ^- \) l9 [- h  Q" r
$ P" K' Z( K& i
    if(DrawProp[DrawProp->LcdLayer].LcdPixelFormat == LCD_PIXEL_FORMAT_RGB565)3 Y/ {. J" y! y9 b- n; f+ b
    {
3 Z' B$ ?! e6 R. h* o' N      for (j = 0; j < width; j++)
, A0 W9 ?: V* l0 }. }      {
3 L+ U$ f9 z0 K  w6 o' m- h        if(line & (1 << (width- j + offset- 1))); M0 g$ X5 [5 a  Q' K0 K
        {# l2 o6 q: m$ _* H
          rgb565[j] = CONVERTARGB88882RGB565(DrawProp[DrawProp->LcdLayer].TextColor);
3 @* P8 F9 G& s( i1 Z* z+ Q        }8 F- p- d+ A* P
        else
8 D# b9 k# D: ~        {$ n' H( @) C: q3 n
          rgb565[j] = CONVERTARGB88882RGB565(DrawProp[DrawProp->LcdLayer].BackColor);7 Y$ S  y5 A# ^
        }
8 c/ |& z; w, C- [; x      }
$ D* W# e4 i+ ]6 ^' v- a      UTIL_LCD_FillRGBRect(Xpos,  Ypos++, (uint8_t*)&rgb565[0], width, 1);
- n1 n& }, `# d2 T# Z1 U- l    }
5 F6 x+ j7 N* T: F' B. O3 Q    else/ \+ L0 Q7 B! u, T; o5 v, s
    {
9 O0 ?. q( z: w+ X# Q3 r! g! t  A      for (j = 0; j < width; j++)
3 D# v' y& Q/ C4 Q) V- p      {
) ?! D" S* J& |! Y3 ^: t& T2 c        if(line & (1 << (width- j + offset- 1)))6 r5 l& p/ y7 N8 G$ P( G
        {  p: l! Z) I" v, ~
          argb8888[j] = DrawProp[DrawProp->LcdLayer].TextColor;; S5 p7 p: O. [' K5 N
        }8 ^) M- v4 D8 C2 r* R# x: m% I
        else
, _1 O5 c  t/ C8 I$ _; n        {  z0 D" y# f- v5 I  p
          argb8888[j] = DrawProp[DrawProp->LcdLayer].BackColor;8 p# c. l# w$ S' g5 N
        }# Y& O# R9 t3 u% X: ~* @' g; B5 s
      }! K+ X$ L! r3 Z
      UTIL_LCD_FillRGBRect(Xpos,  Ypos++, (uint8_t*)&argb8888[0], width, 1);
  g1 S6 t7 G4 e    }
! ?( B* w7 j6 b' g9 d9 P  }
2 N; l9 p) [: I7 B% }( z}6 P$ c6 \4 d( A$ [4 g2 M) A8 X3 L

$ z8 U) Y; B- C# v( H9 A9 p& C! b9 t) O, G
在这个函数中,将字库中的字模逐个点交给写矩形的函数,在屏幕中“画”出字符来。% v1 O# V6 R5 k$ O, l1 Z8 F1 T$ _# h' I
我好奇的是:为什么不使用画点的函数UTIL_LCD_SetPixel(),而使用画矩形的函数UTIL_LCD_FillRGBRect()?
+ X1 Q0 D3 }8 k4 D; O0 g. _; ]) q# G  C1 s, v: A& `# x) P
赞 收藏 评论0 发布时间:2026-7-25 07:52

举报

0个回答

所属标签

相似技术帖

官网相关资源

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