×
嵌入式 > 技术百科 > 详情

STM8 4线驱动1602乱码

发布时间:2020-12-18 发布时间:
|

近段时间用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);

}


 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
VR十大误区:眼睛离屏幕太近真的会瞎吗?