|
本帖最后由 hxdby 于 2022-7-21 22:14 編輯
各位好,
我現(xiàn)在調(diào)一塊3.5寸的TFT LCD,發(fā)現(xiàn)廠家提供的 void LCD_ShowChar()這個顯示字符串的函數(shù)執(zhí)行效率非常低下,我的程序中一使用這個函數(shù),按鍵的反應(yīng)就下降很多,按一下按鍵,LCD上幾乎1s才有反應(yīng),只要注釋掉這個函數(shù),按鍵的響應(yīng)幾乎瞬間的,非常快!
這個函數(shù)如下:
void LCD_ShowChar(uint16_t x,uint16_t y,uint8_t num,uint8_t size,uint8_t mode, uint16_t pcolor, uint16_t bcolor)
{
uint8_t temp,t1,t;
uint16_t y0=y;
uint8_t csize=(size/8+((size%8)?1:0))*(size/2); //得到字體一個字符對應(yīng)點陣集所占的字節(jié)數(shù)
num=num-' ';//得到偏移后的值(ASCII字庫是從空格開始取模,所以-' '就是對應(yīng)字符的字庫)
//Address_set(x,y,x+size/2-1,y+size-1); //如果把坐標(biāo)設(shè)置放在這里,不放循環(huán)中可以解決響應(yīng)問題,但是商家給我的程序,這里被注釋掉了,不知道為啥?我啟用后,發(fā)送字符顯示亂碼------1
for(t=0; t<csize; t++)
{
if(size==24)temp=asc2_2412[num][t]; //調(diào)用1206字體
else if(size==16)temp=asc2_1608[num][t]; //調(diào)用1608字體
else if(size==38)temp=asc2_38x19[num][t]; //調(diào)用3216字體
else if(size==48)temp=asc2_4824[num][t]; //調(diào)用4824字體
// else if(size==64)temp=asc2_6432[num][t]; //調(diào)用4824字體
else return; //沒有的字庫
for(t1=0; t1<8; t1++)
{
if(temp&0x80)LCD_DrawPoint(x,y,pcolor); //發(fā)現(xiàn)問題在畫點函數(shù)這里,畫點函數(shù)帶了坐標(biāo)設(shè)置,導(dǎo)致每循環(huán)一次就會發(fā)一次坐標(biāo),而坐標(biāo)是通過SPI發(fā)給LCD,SPI速度不高拖慢整個程序
else if(mode==0)LCD_DrawPoint(x,y,bcolor);
temp<<=1;
y++;
if(y>=240)return; //超區(qū)域了
if((y-y0)==size)
{
y=y0;
x++;
if(x>=320)return; //超區(qū)域了
break;
}
}
}
}
后來我調(diào)了好久,發(fā)現(xiàn)并非是這整個函數(shù)問題,而是在這個函數(shù)中的循環(huán)里的畫點函數(shù)帶了坐標(biāo)設(shè)置,每循環(huán)一次都會通過SPI發(fā)坐標(biāo)給LCD,嚴(yán)重拖慢了整個系統(tǒng)。而發(fā)一次坐標(biāo)SPI要發(fā)8次數(shù)據(jù),所以導(dǎo)致系統(tǒng)變慢。
如果把發(fā)坐標(biāo)的部分單獨拿出來,放在上面代碼都1處,系統(tǒng)就正常了,響應(yīng)非常快,但是放在1處,字符顯示不正常了,這個坐標(biāo)設(shè)置函數(shù)Address_set(x,y,x+size/2-1,y+size-1); 也沒看出來有什么問題啊,是哪里有問題呢?
各位有沒有什么方法不要在循環(huán)里發(fā)坐標(biāo),循環(huán)里只發(fā)顏色數(shù)據(jù),坐標(biāo)放在外面設(shè)置,有什么寫法可以分享,我自己在網(wǎng)上查了很多,發(fā)現(xiàn)很多都是這種循環(huán)帶坐標(biāo)的寫法,難道坐標(biāo)非得放在循環(huán)里嗎。
|
|