微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 1602 显示乱码

1602 显示乱码

时间:10-02 整理:3721RD 点击:
要实现在第一行显示字符后清屏 再在第二行显示 这样循环。但是循环多次后,就会乱码?实在不解,个人觉得是延时的问题。但调来挑去还不行?希望大侠们给看看,还有一个问题就是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 !='\0')
{
   lcd_wdat(str[i++]);
   delay(30);
  }
  delay(500);
  lcd_wcmd(0x01);
  delay(50);   //这个延时非常重要 没有他就会乱码 因为清屏需要一定的时间来完成
  i=0;
  lcd_pos(0,1);
  delay(50);
while(str!='\0')
{
   lcd_wdat(str[i++]);
   delay(30);
  }
  delay(500);
  lcd_wcmd(0x01);
  delay(100);  
}
  
}

新手飘过!但我没有用检测忙! 1602 我一直都没用!  12864写入图片是才用! 延迟你可以试试delay() 没必要用 _nop_() 因为1602对时间要求不是那么严格!

while(str !='\0')
{
   lcd_wdat(str[i++]);
   delay(30);
  }这个函数可以打包成一个函数  
void write_strings(*s)
{
     while(*s)
    {
           lcd_wdat(*s)
           s++;
     }
如果你想是显示"shan bo ke ji" 只需要 write_strings("shan bo ke ji");这个样就可以了
}

        谢谢指点。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top