历史上的今天
今天是:2025年03月01日(星期六)
2021年03月01日 | STM32之TFT触摸屏(ILI9320):通过LCD_ShowChar显示
2021-03-01 来源:eefocus
使用TFT触摸屏时,想要对字符串,图形或者数字进行显示时,发现他们的库函数中都有一个最重要的函数LCD_ShowChar,貌似目前很少有人分析这个函数,虽然简单但是还是有点绕的。
先贴一下这个函数的代码,由于函数显示分为叠加显示和非叠加显示,原理类似,所以只分析非叠加方式的部分应该就都懂了。
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
{
u8 temp,t1,t;
u16 y0=y;
u16 colortemp=POINT_COLOR;
num=num-' ';//得到偏移后的值
if(!mode) //非叠加方式
{
for(t=0;t
{
if(size==12)temp=asc2_1206[num][t]; //调用1206字体
else temp=asc2_1608[num][t]; //调用1608字体
for(t1=0;t1<8;t1++)
{
if(temp&0x80)POINT_COLOR=colortemp;
else POINT_COLOR=BACK_COLOR;
LCD_DrawPoint(x,y);
temp<<=1;
y++;
if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
if((y-y0)==size)
{
y=y0;
x++;
if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
break;
}
}
}
}
1206字体和1608字体是两种不同的字号,就是一个横向6点,纵向12点,一个横向8点,纵向16点,从判断语句可以看出,二者对应的码表是不一样的,这个码表在工程里搜索一下,在font.h里,是一个二维数组。我们这里使用1608字体,以字母“M”为例。查一下码表中“M”对应的数组,如下:
{0x10,0x04,0x1F,0xFC,0x1F,0x00,0x00,0xFC,0x1F,0x00,0x1F,0xFC,0x10,0x04,0x00,0x00},
' '是码表的开始,由字母减去' '得到偏移量,也就是二维数组的第几行。第一个循环开始,就给临时变量temp赋值为数组的第一个值,由于是1608字体,因此也有一个数组中有16个数,第一个循环就是为了让temp遍历这16个数。
之后第二个循环开始,由于数组中的每一个数均是8位,由于每次循环都会对temp左移一位,因此第二个循环的次数是8次。经if(temp&0x80)判断,如果数字的最高位为1,则进行描点的颜色为字体颜色,如果不是1,则描点颜色为底色。(PS:描点函数LCD_DrawPoint还是很简单滴,总的来说就是向写GRAM寄存器R20h,R21h写入我们希望写的点颜色,基本操作O(∩_∩)O)
每次移位,y都会自加,第二个循环是8次,而size为16,也就是说数组中每读过两个数,y自加16次之后都会清零,然后x加1,就像列扫描一样,一列16个点结束后会进行到下一列。
超区域那部分就是说超过size了,描个点就返回啦。下面以“M”为例描述下描点的过程。
码表前8个
0x10 (0,3)
0x04 (0,13)
0x1F (1,3),(1,4),(1,5),(1,6),(1,7)
0xFC (1,8),(1,9),(1,10),(1,11),(1,12),(1,13)
0x1F (2,3),(2,4),(2,5),(2,6),(2,7)
0x00 无
0x00 无
0xFC (3,8),(3,9),(3,10),(3,11),(3,12),(3,13)
码表后8个
0x1F (4,3),(4,4),(4,5),(4,6),(4,7)
0x00 无
0x1F (5,3),(5,4),(5,5),(5,6),(5,7)
0xFC (5,8),(5,9),(5,10),(5,11),(5,12),(5,13)
0x10 (6,3)
0x04 (6,13)
0x00 无
0x00 无
这个不直观啊,用matlab的scatter(x,y)描个点,正好就是TFT屏幕显示的“M”图形

以上就是ILI9320描点函数LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)的全过程。希望第一次学的小伙伴看了能明白
史海拾趣
|
远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接。使用GDB标准远程串行 协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub是嵌入式系统中的 一段代码,作为宿主机GDB和目标机调试程序间的一 ...… 查看全部问答> |
|
环境:ARM7(S3C44B0X)+uclinux struct unit{ struct semaphore lock; u32* PCONB; u32* PDATB; u32* PCONF; u32* PDATF; u32 b; u32 f; }; s ...… 查看全部问答> |
|
高科技大型上市公司招聘: 嵌入式系统设计工程师 /通信产品设计工程师 / 系统软件设计工程师 工作地点 深圳 本公司是深圳一家高科技大型上市公司,主要经营电力系统产品生产研发,微电子产品生产研发,光磁设备,公司内有员工高层公寓,食堂,文体活动中心,员工家属楼多处,座落于美丽的深圳市福田区笔架山与莲花山之间,公司目前有员工6000多人,工程师及 ...… 查看全部问答> |
|
大家好 ,我想做一个工业控制领域的人机界面 ,我不知道是选用minigui还是QT/E,请帮我参考一下。简单需求如下: 1、界面美观(最好有皮肤控件) 2、有实时曲线 3、有多个窗口(同一时间可以显示多个窗口) 4、移植后不要太大 5、如果需要商业 ...… 查看全部问答> |
|
请问各位,使用74HC165进行开关信号并转串时,只有第5位读不出来是什么情况? 如题,我想要使用74HC165将8个按键信号扫入,但在测试时发现5号按键按键按下时无反应,请问只是什么原因?读数程序如下:CommandCode=0; //按键信息 PORTB.3=0; &nbs ...… 查看全部问答> |
|
1 产品的结构设计 如果将释放的静电看成是洪水的话,那么主要的解决方法与治水类似,就是“堵”和“疏”。如果我们设计的产品有一个理想的壳体是密不透风的,静电也就无从而入,当然不会有静电问题了。但实际的壳体在合盖处常有缝隙,而且许多还有 ...… 查看全部问答> |
|
typedef void __irq (* Isr)(void); extern Isr ISRVector[32]; extern Isr ISRVector[32]这个数组怎么解释啊?… 查看全部问答> |




