|
官方例程中显示不同大小的字符都是共用一个函数,即先指定字库、前景色和背景色,然后再将字符串及起始行列、对齐方式作为参数传送给字符串显示函数UTIL_LCD_DisplayStringAt(),如下图所示: * I4 P- x9 T3 G* R! U0 a7 C2 i
在UTIL_LCD_DisplayStringAt()函数中也仅仅是处理好显示的起始位置后,依次将字符串逐个字符传递给后续函数UTIL_LCD_DisplayChar(refcolumn, Ypos, *Text)处理:' { {- Y. S$ R& Q* }
2 \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 * @param Ypos Line where to display the character shape. * @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 */ void UTIL_LCD_DisplayChar(uint32_t Xpos, uint32_t Ypos, uint8_t Ascii) {$ E; Z. H6 H) y2 E& d DrawChar(Xpos, Ypos, &DrawProp[DrawProp->LcdLayer].pFont->table[(Ascii-' ') *\ DrawProp[DrawProp->LcdLayer].pFont->Height * ((DrawProp[DrawProp->LcdLayer].pFont->Width + 7) / 8)]); }/ N: Q/ C8 o5 Y: y3 s8 _# E 在这个函数中也只是将之前指定的字库设置好,继续交给DrawChar()函数执行,DrawChar函数如下:4 F# |9 b0 B' y /**" P( e6 z" @2 Y: E7 T* D * @brief Draws a character on LCD. * @param Xpos Line where to display the character shape * @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; uint8_t *pchar; uint32_t line;: _6 k1 X. g% J/ N# r2 k H i9 L9 a4 V) d height = DrawProp[DrawProp->LcdLayer].pFont->Height; width = DrawProp[DrawProp->LcdLayer].pFont->Width;1 i7 @4 j2 ]" G0 z8 { uint16_t rgb565[24]; uint32_t argb8888[24];" |+ t& h5 w Z5 f! i* }' m+ e5 U4 F7 E offset = 8 *((width + 7)/8) - width ;. X9 v, i( Q: k for(i = 0; i < height; i++) {$ j$ h' X8 ?0 U5 r5 |6 ^ pchar = ((uint8_t *)pData + (width + 7)/8 * i); & X% O. m- r7 Z$ Z; M9 ] switch(((width + 7)/8)). V7 t6 d D. c2 k2 e { case 1: line = pchar[0]; break; 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 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]; break; }' Z2 E# T8 [& ] c3 e+ x 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))) { rgb565[j] = CONVERTARGB88882RGB565(DrawProp[DrawProp->LcdLayer].TextColor);( l' E0 w6 i3 F' U: d }5 h) t+ U# p# `1 L else { rgb565[j] = CONVERTARGB88882RGB565(DrawProp[DrawProp->LcdLayer].BackColor); }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 {# a. J; X+ n8 y( s Z for (j = 0; j < width; j++) { if(line & (1 << (width- j + offset- 1)))% ?$ d1 k: p( G { U* r0 Y# o- p6 I argb8888[j] = DrawProp[DrawProp->LcdLayer].TextColor; }% r* O! A' X8 \: k+ A& }: \" T else { argb8888[j] = DrawProp[DrawProp->LcdLayer].BackColor; }, 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( _) ? } }4 Z6 v) L8 _$ k1 y' L+ r } 6 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 |
《STM32CubeMX2 实战课程》学习笔记--课程1:STM32CubeMX2安装
STM32L562DK探索板——串口通讯测试成功
STM32L562DK探索板——再试串口通讯仍不成
M24LR-discovery测试小结
STM32L562DK探索板——串口通讯的再测试
STM32L562DK探索板——串口通讯的测试
STM32L562DK探索板——运动传感器测试
STM32L562DK探索板——继续深入了解Audio Play的工作流程
STM32L562DK探索板——触摸菜单实验之触摸测试
STM32L562DK探索板——触摸菜单实验之LED闪烁
微信公众号
手机版