1602 显示乱码

2019-07-16 01:29发布

要实现在第一行显示字符后清屏 再在第二行显示 这样循环。但是循环多次后,就会乱码?实在不解,个人觉得是延时的问题。但调来挑去还不行?希望大侠们给看看,还有一个问题就是1602初始化顺序,各个初始化命令的前后顺序也会影响程序的在单片机上的运行,这又是为什么呢???实在不解??望大神们指点。!
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit lcdEP=P2^7;
sbit lcdRS=P2^6;
sbit lcdRW=P2^5;
uchar code str[]={"shan bo ke ji"};
void delay(uchar ms
{
uchar j;  
while(ms--)
{
  for(j=249;j>0;j--)
{
_nop_();
_nop_();//250us*4=1ms
_nop_();
_nop_();
}
}
}
/****侧忙****/
bit lcd_testb()
{
bit result;
lcdEP=1;
lcdRS=0;
lcdRW=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=(bit)(P0 & 0x80);
lcdEP=0;//使能置回低电平
return result;
}
/*****写命令****/
void lcd_wcmd(uchar cmd)
{
// while(result);//
while(lcd_testb());
lcdEP=0;
lcdRS=0;
lcdRW=0;
_nop_(); //这里初始化需要一些延时
_nop_();
_nop_();
P0=cmd;
_nop_();//这里还没有写数据不用延时。
_nop_();
_nop_();
lcdEP=1;
_nop_();
_nop_();
_nop_();
_nop_();
lcdEP=0;
}
/*****设置显示位置**/
void lcd_pos(uchar x,uchar y)//好好理解这样写的原因
{
  //uchar pos;
  if(y==0)
  lcd_wcmd(x+0x80);
  else
  lcd_wcmd(x+0xc0);
}
/******写数据*****/
void lcd_wdat(uchar dat)
{
lcdEP=0;
lcdRS=1;
lcdRW=0;
_nop_();
_nop_();
_nop_();
P0=dat;
_nop_();//这里还没有写数据不用延时。
_nop_();
_nop_();
lcdEP=1;
_nop_();
_nop_();
_nop_();
lcdEP=0;
}
/****初始化***/
lcd_init()
{                   //LCD初始化设定
lcd_wcmd(0x38);     //16*2显示,5*7点阵,8位数据
delay(1);
lcd_wcmd(0x0c);     //显示开,关光标
delay(1);
lcd_wcmd(0x06);     //移动光标
delay(1);
lcd_wcmd(0x01);     //清除LCD的显示内容
delay(1);
}

void main()  //慎用while(1)一个主函数中只能用一个 否则函数必定会出现问题。
{
  uchar i;
  lcd_init();
  delay(10);
  while(1)
   {
   i=0;
   lcd_pos(0,0);
   delay(50);
while(str !='')
{
   lcd_wdat(str[i++]);
   delay(30);
  }
  delay(500);
  lcd_wcmd(0x01);
  delay(50);   //这个延时非常重要 没有他就会乱码 因为清屏需要一定的时间来完成
  i=0;
  lcd_pos(0,1);
  delay(50);
while(str!='')
{
   lcd_wdat(str[i++]);
   delay(30);
  }
  delay(500);
  lcd_wcmd(0x01);
  delay(100);  
}
  
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。