各位好,
我现在调一块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;
}
}
}
}
如上所述,导致LCD_ShowChar()这个函数执行效率低的主要原因是,在循环中的画点函数带了坐标设置,每循环一次都会通过SPI发地址给LCD,严重拖慢了整个系统,如果把发坐标的部分单独拿出来,放在上面代码都1处,系统就正常了,响应非常快,但是放在1处,字符显示不正常了,这个坐标设置函数Address_set(x,y,x+size/2-1,y+size-1); 也没看出来有什么问题啊,是哪里有问题呢?各位有没有什么方法不要在循环里发坐标,循环里只发颜色数据,坐标放在外面设置,有什么写法可以分享,我自己在网上查了很多,发现很多都是这种循环带坐标的写法,难道坐标非得放在循环里吗
|