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);
}
}
#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");这个样就可以了
}
谢谢指点。