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