近段时间用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); }
上一篇:STM8 LCD液晶
下一篇:STM8S105K6T6单片机的IIC配置问题