近段时间用STM8驱动1602,采用4线方式,首次上电出现乱码,现在网上找到解决方法,做此总结。
网上大佬分析,出现乱码原因是在单片机发送0x28初始化时,高4位发送就已经完成初始化,低4位发送导致出现乱码,需要延时后再初始化可解决。这位大佬提供的方法确实可以解决问题,但感觉问题应该不在这,具体原因还没得出。
#include
#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned long uint32_t;
#define LCDRS PB_ODR_ODR0
#define LCDRW PB_ODR_ODR1
#define LCDEN PB_ODR_ODR2
#define LCDDATA PC_ODR
u8 table1[]="====LCD 1602===="; //第一行显示数据
u8 table2[]="****************"; //第二行显示数据
void delay(u16 Count);
void LCD1602_Write(u8 cmdordata,u8 writetype);
void LCD1602_init(void);
void LCD1602_DIS(void);
int main(void)
{
PB_DDR_DDR0=1;
PB_CR1_C10=1;
PB_CR2_C20=0;
PB_DDR_DDR1=1;
PB_CR1_C11=1;
PB_CR2_C21=0;
LCDRW=0;
PB_DDR_DDR2=1;
PB_CR1_C12=1;
PB_CR2_C22=0;
PC_DDR=0xFF;
PC_CR1=0xFF;
PC_CR2=0x00;
LCDDATA=0xFF;
LCD1602_init();
LCD1602_DIS();
while(1);
}
void delay(u16 Count)
{
u8 i,j;
while (Count--)
{
for(i=0;i<50;i++)
for(j=0;j<20;j++);
}
}
void LCD1602_init(void)
{
LCD1602_Write(0x28,0);
/*区间内为加入延时,初始化部分*/
LCDEN=1;delay(5);
LCDEN=0;delay(5);
LCD1602_Write(0x28,0);
/*区间内为加入延时,初始化部分*/
LCD1602_Write(0x0C,0);
LCD1602_Write(0x06,0);
LCD1602_Write(0x01,0);
}
void LCD1602_DIS(void)
{
u8 i;
LCD1602_Write(0x80,0);
for(i=0;i<16;i++)
{
LCD1602_Write(table1[i],1);
delay(2);
}
LCD1602_Write(0xC0,0);
for(i=0;i<16;i++)
{
LCD1602_Write(table2[i],1);
delay(2);
}
}
void LCD1602_Write(u8 cmdordata,u8 writetype)
{
LCDRS=writetype;
delay(5);
LCDDATA &= 0x0F;
LCDDATA|=cmdordata & 0xF0;
LCDEN=1;delay(5);
LCDEN=0;delay(5);
cmdordata=cmdordata << 4;
LCDDATA &= 0x0F;
LCDDATA |= cmdordata & 0xF0;
LCDEN=1;delay(5);
LCDEN=0;delay(5);
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』