适配lcd屏幕后发现个奇怪的bug,那就是,仅显示<4/5width*length的图像或者任何内容都不会有问题,但当显示整张图片时,就会出现最后1/5图片会重复显示前1/5内容而不是应当显示的内容,如图所示
然后就开始着手寻找问题出在哪里,这里尝试了只显示上半部分。
只显示下半部分
都能正常显示,看来数据没问题,指令也没问题,就在思考是不是数据传输过快了,屏幕处理不过来?
然后试了简单粗暴的慢速加载
结果问题依旧,看来不是速率的原因。
那么就猜测可能是一次指令不可同时写入太多的原因,这里就将显示图片函数切割为两次指令分步显示
/******************************************************************************
函数说明:显示图片
入口数据:x,y起点坐标
length 图片长度
width 图片宽度
pic[] 图片数组
返回值: 无
******************************************************************************/
void LCD_ShowPicture(uint16_t x, uint16_t y, uint16_t length, uint16_t width, const uint8_t pic[])
{
if(length * width >= LCD_W * LCD_H / 2)
{
Lcd_ShowPicture_lite(x, y, length, width / 2, pic);
Lcd_ShowPicture_lite(x, y + width / 2, length, width / 2, pic + length * width);
}
else
{
Lcd_ShowPicture_lite(x, y, length, width, pic);
}
}
void Lcd_ShowPicture_lite(uint16_t x, uint16_t y, uint16_t length, uint16_t width, const uint8_t pic[])
{
uint16_t num = 0;
uint16_t i, j, k = 0;
LCD_Address_Set(x, y, x + length - 1, y + width - 1);
for(i = 0; i < length; i++)
{
for(j = 0; j < width; j++)
{
LCD_WR_DATA8(pic[k * 2]);
LCD_WR_DATA8(pic[k * 2 + 1]);
k++;
}
}
}
将原来的LCD_ShowPicture()改名为Lcd_ShowPicture_lite(),新增一个判断并分割步骤的LCD_ShowPicture(),完美解决问题,如果遇到类似的问题可以尝试一下分两步、四步等尝试尝试,对于lcd运作原理其实不太清楚,如果有知道这个具体原因的欢迎讨论