STM32F429挑战者 LCD显示字符后面出现白色竖线是什么原因造成的?
首先看下错误现象
每行行尾出现竖直亮线。出现的原因是我使用的颜色格式为RGB1555,显示函数里面却将显存地址强制为32位。
//功能: 显示一个 ASCII 字符到LCD
//参数:Row 这里可以理解为要显示字符的行位置
//参数:Column 这里可以理解为要显示字符的列位置
//参数:Ascii 要显示字符的数组数据指针
void LCD_DispChar(uint16_t Row, uint16_t Column, char Ascii)
{
const unsigned short *Chr = &LCD_Currentfonts->table[(Ascii - 32) * LCD_Currentfonts->Height]; //这里要减32是因为当前程序使用的字模数据是从ASCII的第32个字符开始取模的
uint16_t index = 0, counter = 0;
uint32_t Xaddress = 0;
Xaddress = CurrentFrameBuffer + LCD_PIXEL_SIZE*(Row*LCD_PIXEL_WIDTH + Column);
for(index = 0; index < LCD_Currentfonts->Height; index++)
{
for(counter = 0; counter < LCD_Currentfonts->Width; counter++)
{
if((((Chr[index] & ((0x80 << ((LCD_Currentfonts->Width / 12 ) * 8 ) ) >> counter)) == 0x00) &&(LCD_Currentfonts->Width <= 12))||
(((Chr[index] & (0x01 << counter)) == 0x00)&&(LCD_Currentfonts->Width > 12 )))
{
/* Write data value to all SDRAM memory */
*(__IO uint32_t*) Xaddress = CurrentBackColor;
}
else
{
/* Write data value to all SDRAM memory */
*(__IO uint32_t*) Xaddress = CurrentTextColor;
}
Xaddress += LCD_PIXEL_SIZE; //画完当前像素,就移动到下一个像素点,内存中就要移动一个像素占据的字节数
}
Xaddress += LCD_PIXEL_SIZE*(LCD_PIXEL_WIDTH - LCD_Currentfonts->Width); //画完字模的一行,移动到下一行显示空间
}
}
上面*(__IO uint32_t*) 中的uint32_t位置。
改为uint16_t之后显示正常:
if((((Chr[index] & ((0x80 << ((LCD_Currentfonts->Width / 12 ) * 8 ) ) >> counter)) == 0x00) &&(LCD_Currentfonts->Width <= 12))||
(((Chr[index] & (0x01 << counter)) == 0x00)&&(LCD_Currentfonts->Width > 12 )))
{
/* Write data value to all SDRAM memory */
*(__IO uint16_t*) Xaddress = CurrentBackColor;
}
else
{
/* Write data value to all SDRAM memory */
*(__IO uint16_t*) Xaddress = CurrentTextColor;
}
由于ASCII字符与汉字字符的显示函数是分开实现的,因此还需要将汉字显示的函数相应位置也改为uint16_t。
结论:像素格式是16位,显存地址格式就应该为16位;像素格式是32位,显存地址格式就应该为32位;使用16位的像素格式,却把显存地址格式设置为32位,会出现竖直亮线。