stm32之TFT觸摸屏(ILI9320):通過LCD_ShowChar顯示的過程分析
使用TFT觸摸屏?xí)r,想要對(duì)字符串,圖形或者數(shù)字進(jìn)行顯示時(shí),發(fā)現(xiàn)他們的庫函數(shù)中都有一個(gè)最重要的函數(shù)LCD_ShowChar,貌似目前很少有人分析這個(gè)函數(shù),雖然簡(jiǎn)單但是還是有點(diǎn)繞的。
先貼一下這個(gè)函數(shù)的代碼,由于函數(shù)顯示分為疊加顯示和非疊加顯示,原理類似,所以只分析非疊加方式的部分應(yīng)該就都懂了。
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]; //調(diào)用1206字體
else temp=asc2_1608[num][t]; //調(diào)用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;}//超區(qū)域了
if((y-y0)==size)
{
y=y0;
x++;
if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超區(qū)域了
break;
}
}
}
}
1206字體和1608字體是兩種不同的字號(hào),就是一個(gè)橫向6點(diǎn),縱向12點(diǎn),一個(gè)橫向8點(diǎn),縱向16點(diǎn),從判斷語句可以看出,二者對(duì)應(yīng)的碼表是不一樣的,這個(gè)碼表在工程里搜索一下,在font.h里,是一個(gè)二維數(shù)組。我們這里使用1608字體,以字母“M”為例。查一下碼表中“M”對(duì)應(yīng)的數(shù)組,如下:
{0x10,0x04,0x1F,0xFC,0x1F,0x00,0x00,0xFC,0x1F,0x00,0x1F,0xFC,0x10,0x04,0x00,0x00},
' '是碼表的開始,由字母減去' '得到偏移量,也就是二維數(shù)組的第幾行。第一個(gè)循環(huán)開始,就給臨時(shí)變量temp賦值為數(shù)組的第一個(gè)值,由于是1608字體,因此也有一個(gè)數(shù)組中有16個(gè)數(shù),第一個(gè)循環(huán)就是為了讓temp遍歷這16個(gè)數(shù)。
之后第二個(gè)循環(huán)開始,由于數(shù)組中的每一個(gè)數(shù)均是8位,由于每次循環(huán)都會(huì)對(duì)temp左移一位,因此第二個(gè)循環(huán)的次數(shù)是8次。經(jīng)if(temp&0x80)判斷,如果數(shù)字的最高位為1,則進(jìn)行描點(diǎn)的顏色為字體顏色,如果不是1,則描點(diǎn)顏色為底色。(PS:描點(diǎn)函數(shù)LCD_DrawPoint還是很簡(jiǎn)單滴,總的來說就是向?qū)慓RAM寄存器R20h,R21h寫入我們希望寫的點(diǎn)顏色,基本操作O(∩_∩)O)
每次移位,y都會(huì)自加,第二個(gè)循環(huán)是8次,而size為16,也就是說數(shù)組中每讀過兩個(gè)數(shù),y自加16次之后都會(huì)清零,然后x加1,就像列掃描一樣,一列16個(gè)點(diǎn)結(jié)束后會(huì)進(jìn)行到下一列。
超區(qū)域那部分就是說超過size了,描個(gè)點(diǎn)就返回啦。下面以“M”為例描述下描點(diǎn)的過程。
碼表前8個(gè)
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個(gè)
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 無
這個(gè)不直觀啊,用matlab的scatter(x,y)描個(gè)點(diǎn),正好就是TFT屏幕顯示的“M”圖形
以上就是ILI9320描點(diǎn)函數(shù)LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)的全過程。希望第一次學(xué)的小伙伴看了能明白