stm32之TFT觸摸屏(ILI9320):通過(guò)LCD_ShowChar顯示的過(guò)程分析
使用TFT觸摸屏?xí)r,想要對(duì)字符串,圖形或者數(shù)字進(jìn)行顯示時(shí),發(fā)現(xiàn)他們的庫(kù)函數(shù)中都有一個(gè)最重要的函數(shù)LCD_ShowChar,貌似目前很少有人分析這個(gè)函數(shù),雖然簡(jiǎn)單但是還是有點(diǎn)繞的。
先貼一下這個(gè)函數(shù)的代碼,由于函數(shù)顯示分為疊加顯示和非疊加顯示,原理類(lèi)似,所以只分析非疊加方式的部分應(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),從判斷語(yǔ)句可以看出,二者對(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},
' '是碼表的開(kāi)始,由字母減去' '得到偏移量,也就是二維數(shù)組的第幾行。第一個(gè)循環(huán)開(kāi)始,就給臨時(shí)變量temp賦值為數(shù)組的第一個(gè)值,由于是1608字體,因此也有一個(gè)數(shù)組中有16個(gè)數(shù),第一個(gè)循環(huán)就是為了讓temp遍歷這16個(gè)數(shù)。
之后第二個(gè)循環(huán)開(kāi)始,由于數(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)單滴,總的來(lái)說(shuō)就是向?qū)慓RAM寄存器R20h,R21h寫(xiě)入我們希望寫(xiě)的點(diǎn)顏色,基本操作O(∩_∩)O)
每次移位,y都會(huì)自加,第二個(gè)循環(huán)是8次,而size為16,也就是說(shuō)數(shù)組中每讀過(guò)兩個(gè)數(shù),y自加16次之后都會(huì)清零,然后x加1,就像列掃描一樣,一列16個(gè)點(diǎn)結(jié)束后會(huì)進(jìn)行到下一列。
超區(qū)域那部分就是說(shuō)超過(guò)size了,描個(gè)點(diǎn)就返回啦。下面以“M”為例描述下描點(diǎn)的過(guò)程。
碼表前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 無(wú)
0x00 無(wú)
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 無(wú)
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 無(wú)
0x00 無(wú)
這個(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)的全過(guò)程。希望第一次學(xué)的小伙伴看了能明白