调试LCD问题汇总
一、LCD帧数问题:
1. STM32F103C8T6
HSE 晶振的问题导致刷屏速度慢。
STM32F103 ,虽然SPI速度可以达到16M/S 由于刷新运算所需的时间,实际当SPI速度高于4.5以上时,再提升SPI的速度已无法提升刷新率。 应提升主频速度。
主频36M SPI 速度16M 刷新时间 270ms
主频36M SPI速度4.5M, 刷新时间 270ms 再提升SPI的速度已无法提升刷新率
主频64M SPI 速度16M 刷新时间 171ms
主频64M SPI 速度4M 刷新时间 171ms 再提升SPI的速度已无法提升刷新率。
1.8寸 128*160
主频100M SPI 速度25M 刷新时间65ms //15.38帧
主频100M SPI 速度12.5M 刷新时间77ms
主频100M 软件SPI 刷新时间58ms //17.2帧
主频100M SPI 25M 刷新时间15ms //66.6帧 优化函数。//画面无撕裂,SPI稳定
主频100M SPI 50M 刷新时间12ms //83.3帧 优化函数。。//但过高速的 SPI 会有错误和画面撕裂
2. STM32F411CEU6
1.8寸 128*160
主频100M SPI 速度25M 刷新时间65ms //15.38帧
主频100M SPI 速度12.5M 刷新时间77ms
主频100M 软件SPI 刷新时间58ms //17.2帧
主频100M SPI 25M 刷新时间15ms //66.6帧 优化函数。//画面无撕裂,SPI稳定
主频100M SPI 50M 刷新时间12ms //83.3帧 优化函数。。//但过高速的 SPI 会有错误和画面撕裂
1.3寸240*240
主频100M SPI 25M 刷新时间15ms //22.7帧
二、复位后背光亮但显示屏无颜色问题:
偶尔情况下的,CPU复位后导致的LCD白屏问题:
1.LCD_Res引脚复位时序问题
复位时间如果低于5us,显示器无变化。
Trw 复位脉冲边沿持续的最小时间为10us
Trt 复位取消 复位后再置位,最大时间
可以得出:
1.首先复位引脚RES拉低,持续时间低于5us 显示器无反应,大于10us之后,如果在5ms之内,适用于睡眠模式的复位,在5-120ms之内的适用于非睡眠模式的复位。
2.复位之后如果要发送命令,必须在复位之后有5ms的等待时间。
3.发送Sleep Out命令后的等待时间不能低于120ms。
2.GPIO初始化电平问题
复位引脚 LCD_Res 在GPIO初始化时应该为高电平。即高电平被拉低,而不应该是低电平被拉低。//虽然初始化被置为低可以运行,但这也可能是导致复位后显示不正确的原因之一。
最终原因是 电流的问题
在系统启动时,由于各个器件都会在这一瞬间初始化,所以会有瞬间大电流,导致芯片和各元器件工作不稳定,导致的初始化失败。
三、函数
Lcd_Init()
void Lcd_Init(void)
{
LCD_RST_CLR;
HAL_Delay(10); //数据手册 5-120ms
LCD_RST_SET;
HAL_Delay(10);
LCD_BL_SET;
Lcd_WriteIndex(0x11); //退出睡眠,要有120ms的延时
HAL_Delay(120);
Lcd_WriteIndex(0x36);
Lcd_WriteData(0x00);
Lcd_WriteIndex(0x3A);
Lcd_WriteData(0x05);
Lcd_WriteIndex(0xB2);
Lcd_WriteData(0x0C);
Lcd_WriteData(0x0C);
Lcd_WriteData(0x00);
Lcd_WriteData(0x33);
Lcd_WriteData(0x33);
Lcd_WriteIndex(0xB7);
Lcd_WriteData(0x35);
Lcd_WriteIndex(0xBB);
Lcd_WriteData(0x19);
Lcd_WriteIndex(0xC0);
Lcd_WriteData(0x2C);
Lcd_WriteIndex(0xC2);
Lcd_WriteData(0x01);
Lcd_WriteIndex(0xC3);
Lcd_WriteData(0x12);
Lcd_WriteIndex(0xC4);
Lcd_WriteData(0x20);
Lcd_WriteIndex(0xC6);
Lcd_WriteData(0x0F);
Lcd_WriteIndex(0xD0);
Lcd_WriteData(0xA4);
Lcd_WriteData(0xA1);
Lcd_WriteIndex(0xE0);
Lcd_WriteData(0xD0);
Lcd_WriteData(0x04);
Lcd_WriteData(0x0D);
Lcd_WriteData(0x11);
Lcd_WriteData(0x13);
Lcd_WriteData(0x2B);
Lcd_WriteData(0x3F);
Lcd_WriteData(0x54);
Lcd_WriteData(0x4C);
Lcd_WriteData(0x18);
Lcd_WriteData(0x0D);
Lcd_WriteData(0x0B);
Lcd_WriteData(0x1F);
Lcd_WriteData(0x23);
Lcd_WriteIndex(0xE1);
Lcd_WriteData(0xD0);
Lcd_WriteData(0x04);
Lcd_WriteData(0x0C);
Lcd_WriteData(0x11);
Lcd_WriteData(0x13);
Lcd_WriteData(0x2C);
Lcd_WriteData(0x3F);
Lcd_WriteData(0x44);
Lcd_WriteData(0x51);
Lcd_WriteData(0x2F);
Lcd_WriteData(0x1F);
Lcd_WriteData(0x1F);
Lcd_WriteData(0x20);
Lcd_WriteData(0x23);
Lcd_WriteIndex(0x21);
Lcd_WriteIndex(0x29);
}
//Lcd_Init()用到的函数
void Lcd_WriteIndex(u8 Index) //SPI 写命令
{
// LCD_CS_CLR; //CS片选信号在1.3寸显示屏模块上被拉低
LCD_RS_CLR;
SPI_WriteData(Index);
// LCD_CS_SET;
}
void Lcd_WriteData(u8 Data) //SPI 写8位数据
{
// LCD_CS_CLR;
LCD_RS_SET;
SPI_WriteData(Data);
// LCD_CS_SET;
}
void SPI_WriteData(u8 Data)
{
HAL_SPI_Transmit(&hspi1,&Data,1,0xffff);
}
void LCD_WriteData_16Bit(u16 Data)//SPI 写16位数据
{
unsigned char op_code[2] = {0X00,0X00};
op_code[0] = Data /256;
op_code[1] = Data %256;
// LCD_CS_CLR;
LCD_RS_SET;
HAL_SPI_Transmit(&hspi1,op_code,2,0xffff);
// LCD_CS_SET;
}
showimage()
void showimage(const unsigned char *p) //显示40*40 QQ图片
{
extern SPI_HandleTypeDef hspi1;
Lcd_SetRegion(0,0,240,240); //坐标设置
// LCD_CS_CLR;//片选
LCD_RS_SET;//数据模式
//整张图片有115200个数据
HAL_SPI_Transmit(&hspi1,(uint8_t *)p,57600,0xffff);//0-57599
HAL_SPI_Transmit(&hspi1,(uint8_t *)(p+57600),57600,0xffff);//57600-115199
//HAL_SPI_Transmit_DMA(&hspi1,gImage_1,40960);
//DMA错误的原因未知。
// LCD_CS_SET;
}
//函数调用了设置坐标点函数
void Lcd_SetRegion(u16 x_start,u16 y_start,u16 x_end,u16 y_end)
{
Lcd_WriteIndex(0x2a);
Lcd_WriteData(x_start>>8);
Lcd_WriteData(x_start);
Lcd_WriteData(x_end>>8);
Lcd_WriteData(x_end);
Lcd_WriteIndex(0x2b);
Lcd_WriteData(y_start>>8);
Lcd_WriteData(y_start);
Lcd_WriteData(y_end>>8);
Lcd_WriteData(y_end);
Lcd_WriteIndex(0x2c);
}
四、SPI
LCD的SPI模式
使用的是4线Ⅰ模式(4-line serial interface Ⅰ)
片选、数据选择、时钟、数据
写数据时序图
(—DataSheet Page 57 )
读数据时序图
(—DataSheet Page 60 )
关于读的原文说明
# 软件消抖的好的方法
//开一个定时器 ,有一个按键标志位key_lock,只有定时器时到了,进入定时器中断,才能解除key_lock,主程序才能执行按键输入。
//定时器的溢出时间确定你允许的本次按键输入与下次输入的之间的时间最小值。
//也可以在定时器中断内处理按键的键值判断。