主要记录实际使用中的一些注意点。
1.LCD1602
电路图:
看手册:电源和背光可以使用5v或者3.3v,数据和控制引脚直接和单片机引脚连接即可。
单片机型号:stm32c031c6t6 可以直接使用推完输出连接D0--D7,RS,EN,RW引脚,3.3v就可以驱动(我使用的是这种方式);或者使用开漏输出,外面加上拉电阻5v驱动(没有用,不知道效果)。
两个间隔时间:
1.控制时序的延时:这个用的多,时间太短会显示不正常,或者不显示。
2.发给lcm指令之间的延时:一般初始化的时候回用一下
/*液晶初始化*/
void Lcm1602A_Init(void)
{ Lcm1602A_Wr_Command(0x38);
Lcm1602A_Wr_Command(0x38); //2次显示模式设置
Lcm1602A_Wr_Command(0x0c); //显示及光标设置
Lcm1602A_Wr_Command(0x01); //显示清屏
HAL_Delay(2);
Lcm1602A_Wr_Command(0x06); //显示光标移动设置
Lcm1602A_Display_String();
}
/*发送指令给lcd*/
void Lcm1602A_Wr_Command(uint8_t wrcommand)
{
RS_1602A(0);//控制引脚
RW_1602A(0);//控制引脚
Lcm_Delay(LCM_DELAY_TIME);//这个延时很重要
Lcm1602A_Data_Write(wrcommand);//写入数据(指令)
Lcm_Delay(LCM_DELAY_TIME);
E_1602A(1);//使能引脚
Lcm_Delay(LCM_DELAY_TIME);
E_1602A(0);
}
遇到的问题:减少Lcm_Delay(LCM_DELAY_TIME)时间;导致初始化失败,可是看手册的话,接受一个指令1us就够了,可是实际使用却需要几十us或者更长时间才够,不知道哪里的问题。先不管了。
Lcm_Delay(LCM_DELAY_TIME)不同时间下:
初始化效果:
正常如下
间隔100us如下
间隔50us:
间隔10us如下
间隔2us如下
其他状况:
本来应该是第一行显示0--9 符号 第二行显示字母的,
不知道是程序被动过了,还是编译环境,还是什么有变化,初始化完成就变成了这样。
同样的时间下,连续两行显示全部显示不成功,但是一次显示几个字符却可以正常显示,当时调试的时候,就是这原因没注意到初始化没成功。
处理方式:增长延时的时间,lcd显示不需要很实时。
原因:同样的Lcm_Delay(LCM_DELAY_TIME) (大概延时10us),
(外部晶振用的是25mhz)定时器tim3的Prescaler = 47; Period = 1;可以正常初始化
改成Prescaler = 24; Period = 999; 初始化会出错。