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

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

[复制链接]
老牛洋车 发布时间:2026-7-25 07:52
官方例程中显示不同大小的字符都是共用一个函数,即先指定字库、前景色和背景色,然后再将字符串及起始行列、对齐方式作为参数传送给字符串显示函数UTIL_LCD_DisplayStringAt(),如下图所示:
1 @+ y' P$ N  Z* I4 P- x9 T3 G* R! U0 a7 C2 i
char1.png 5 Q- v4 M5 k; o9 G  _% s

3 r0 P# Z  T) n% F( ]在UTIL_LCD_DisplayStringAt()函数中也仅仅是处理好显示的起始位置后,依次将字符串逐个字符传递给后续函数UTIL_LCD_DisplayChar(refcolumn, Ypos, *Text)处理:' {  {- Y. S$ R& Q* }
char2.png
4 I* ]+ v* U, q% v6 T2 \9 ]3 p) B1 |" F
后续的DisplayChar()函数如下:4 g% j: [9 _/ i. z. S
- Z4 P' V3 _8 J2 d
/**! F) w9 y6 G8 T5 H5 N5 f% H* t
  * @brief  Displays one character in currently active layer.在当前活动层中显示一个字符。2 [' ]1 Q- H4 {3 w  G0 @
  * @param  Xpos Start column address
+ D2 d, M) G# [) J) K5 I- M  * @param  Ypos Line where to display the character shape.
3 S: l# |+ b9 |  * @param  Ascii Character ascii code9 i0 g6 ]8 I; f! x
  *           This parameter must be a number between Min_Data = 0x20 and Max_Data = 0x7E
1 ]) l- ~& e0 e4 R# H  */
' U3 P' A0 ]8 Y9 d, t6 Q- B: y  Ivoid UTIL_LCD_DisplayChar(uint32_t Xpos, uint32_t Ypos, uint8_t Ascii)
( {1 e4 x& Q  h* Q7 {{$ E; Z. H6 H) y2 E& d
  DrawChar(Xpos, Ypos, &DrawProp[DrawProp->LcdLayer].pFont->table[(Ascii-' ') *\
* ]; @9 k' ^/ ]/ |# ^/ T  DrawProp[DrawProp->LcdLayer].pFont->Height * ((DrawProp[DrawProp->LcdLayer].pFont->Width + 7) / 8)]);
/ e$ a  M5 N; Q, q8 ]}/ N: Q/ C8 o5 Y: y3 s8 _# E

* r; t/ V% R9 ^/ A在这个函数中也只是将之前指定的字库设置好,继续交给DrawChar()函数执行,DrawChar函数如下:4 F# |9 b0 B' y

+ X! ^* L( q( y" {$ f% \
+ ?! c  q$ S, q( x/**" P( e6 z" @2 Y: E7 T* D
  * @brief  Draws a character on LCD.
/ V, T! c3 a$ T3 @$ c+ ~  * @param  Xpos  Line where to display the character shape
+ s# O4 B, m2 A5 _9 W; v  * @param  Ypos  Start column address' ^4 J6 M2 `3 F
  * @param  pData Pointer to the character data/ o7 [1 E; l: s6 O
  */) @+ I0 f5 T  d6 w- Z! e% S* V
static void DrawChar(uint32_t Xpos, uint32_t Ypos, const uint8_t *pData). L$ ]% o7 g9 L; T( R
{! d& \0 l3 E. o9 a( ]. m
  uint32_t i = 0, j = 0, offset;# f# |2 u3 V3 Q1 r/ X) {
  uint32_t height, width;
6 t' G4 M! w# C$ X! X  uint8_t  *pchar;
( x: J% L, X4 u' a' Z3 D  uint32_t line;: _6 k1 X. g% J/ N# r2 k
  H  i9 L9 a4 V) d
  height = DrawProp[DrawProp->LcdLayer].pFont->Height;
6 f8 t( j0 Y! K* u. |, i! d  I  width  = DrawProp[DrawProp->LcdLayer].pFont->Width;1 i7 @4 j2 ]" G0 z8 {
  uint16_t rgb565[24];
7 w7 s- j' U1 _' u- c5 @  uint32_t argb8888[24];" |+ t& h5 w  Z5 f! i* }' m+ e5 U4 F7 E

+ ~2 {: \: h' h9 g% w  offset =  8 *((width + 7)/8) -  width ;. X9 v, i( Q: k

" R" A' k" r5 u; s  l1 w  for(i = 0; i < height; i++)
6 g( l0 n+ k$ S+ v8 W1 C  {$ j$ h' X8 ?0 U5 r5 |6 ^
    pchar = ((uint8_t *)pData + (width + 7)/8 * i);
" x/ }8 {$ {" V4 K& X% O. m- r7 Z$ Z; M9 ]
    switch(((width + 7)/8)). V7 t6 d  D. c2 k2 e
    {
  s) W: N! C) W8 O, G
! V3 i- I5 K2 n- t% }) Y$ }7 y    case 1:
9 b' Q. c& w# E4 @, H3 P( P      line =  pchar[0];
' E" L+ F* J5 @8 w+ F9 H      break;
# l& T2 V2 R' u& ^+ y& s% X8 }5 g
' e9 x: P$ s* |. R' S2 i    case 2:" r, X' R$ o8 b+ [9 k& Q
      line =  (pchar[0]<< 8) | pchar[1];. x4 |! c) N  T2 d8 H
      break;$ B- X3 f7 ?% c

+ N- O* Q- u# T7 e2 G/ L    case 3:6 U9 o5 |. x: ?# X8 y* Y
    default:8 [; H: e4 A0 q8 H) r* e6 ~7 G
      line =  (pchar[0]<< 16) | (pchar[1]<< 8) | pchar[2];
; ^/ G: g4 F0 O$ V! Z      break;
  ?: h; T6 n) p, i! B    }' Z2 E# T8 [& ]  c3 e+ x

+ C& h- `; u' ~; D8 m% _    if(DrawProp[DrawProp->LcdLayer].LcdPixelFormat == LCD_PIXEL_FORMAT_RGB565); [  n. G' ?+ H
    {) Z( T" d# M( M/ m  H2 E
      for (j = 0; j < width; j++). R% m! F6 d( g  c0 G
      {7 h5 D) |( Y, c3 s3 r
        if(line & (1 << (width- j + offset- 1)))
! j5 Q- K: p, f9 X9 S- _        {
1 }/ S9 g  R8 P- O* n          rgb565[j] = CONVERTARGB88882RGB565(DrawProp[DrawProp->LcdLayer].TextColor);( l' E0 w6 i3 F' U: d
        }5 h) t+ U# p# `1 L
        else
) A; j% F% i+ A! r: a# b; `        {
$ g6 b3 L: e9 Z4 D, h          rgb565[j] = CONVERTARGB88882RGB565(DrawProp[DrawProp->LcdLayer].BackColor);
* y- C0 x) ^* l; F, P9 z        }5 g2 u, h8 b; Z% w. P* d' T1 j
      }3 i0 A/ ^) P% M0 b+ A( ]
      UTIL_LCD_FillRGBRect(Xpos,  Ypos++, (uint8_t*)&rgb565[0], width, 1);: L7 l- J' ]/ w9 |/ G
    }* Y2 Z3 a. ]2 n0 z- C/ V* p" C
    else
3 I( q! ^3 L8 ^# r6 p    {# a. J; X+ n8 y( s  Z
      for (j = 0; j < width; j++)
7 `4 Y1 L6 H' e; A# m1 w% Q      {
% v, m  m* j8 A( T' `( @4 ]9 m        if(line & (1 << (width- j + offset- 1)))% ?$ d1 k: p( G
        {  U* r0 Y# o- p6 I
          argb8888[j] = DrawProp[DrawProp->LcdLayer].TextColor;
8 b, _! g* b; x. I. ~        }% r* O! A' X8 \: k+ A& }: \" T
        else
/ F+ |8 F( x4 o# m        {
3 M) j4 [' l3 ]' `1 |          argb8888[j] = DrawProp[DrawProp->LcdLayer].BackColor;
( f" J3 Z2 T# T. R& W        }, n7 d! h, P/ }' d/ n6 s
      }0 u+ @+ p+ J" @% r$ e5 N- x# Z  B
      UTIL_LCD_FillRGBRect(Xpos,  Ypos++, (uint8_t*)&argb8888[0], width, 1);$ K9 c, M" S( _) ?
    }
! K' w7 D8 u% Q/ U/ o, r1 ^  }4 Z6 v) L8 _$ k1 y' L+ r
}
( K2 h+ R. B$ |( D( m6 u# @5 H, l$ S5 a, d' D# t/ v
4 t& C- z; l; F7 x- o% o5 |
在这个函数中,将字库中的字模逐个点交给写矩形的函数,在屏幕中“画”出字符来。2 e6 E! x9 Q' g
我好奇的是:为什么不使用画点的函数UTIL_LCD_SetPixel(),而使用画矩形的函数UTIL_LCD_FillRGBRect()?6 W# Q, e, F7 s+ m
* n7 P0 D7 h8 n
收藏 评论0 发布时间:2026-7-25 07:52

举报

0个回答

所属标签

相似技术帖

官网相关资源

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