lcd1602乱码
时间:10-02
整理:3721RD
点击:
有时能正常亮,但过一会儿,关闭电源再打开和复位后就又乱码了,让他循环跑后,跑个三十、四十遍又可以了,这是什么原因,求解?
#include<reg52.h>
sbit RS=P3^5;
sbit RW=P3^6;
sbit E=P3^7;
/**********************************
延时
**********************************/
void delay(int x)
{
x=x*20;
for(;x>0;x--)
;
}
/**********************************
写指令
**********************************/
void order(int x)
{
E=0;
RS=0;
RW=0;
P0=x;
delay(10);
E=1;
delay(20);
E=0;
}
/*****************************
读出数据
*****************************/
void out(char y)
{
E=0;
RS=1;
RW=0;
P0=y;
delay(10);
E=1;
delay(20);
E=0;
}
/****************************************
主函数
****************************************/
void main()
{
int x,y,z;
int code a[]={0x4d,0x79,0x20,0x6e,0x61,0x6d,0x65,0x20,0x69,0x73,0x20};
int code b[]={0x59,0x75,0x20,0x50,0x65,0x6e,0x67};
int code c[]={0x49,0x20,0x4c,0x4f,0x56,0x45,0x20,0x59,0x4f,0x55};
int code d[]={0x28,0x5e,0x6f,0x5e,0x20,0x29};
while(1)
{
/******************
初始化
******************/
delay(300);
order(0x38);
delay(100);
order(0x38);
delay(100);
order(0x38);
delay(100);
order(0x01);
order(0x0c);
order(0x06);
y=0x80; //显示地址
order(y);
delay(400);
/*******************************
My name is
*******************************/
for(x=0;x<11;x++)
{
//输出字符所在地址
delay(200);
out(a[x]); //输出字符
}
y=0xc8; //显示地址
delay(400);
order(y);
/*******************************
Yu Peng
*******************************/
for(x=0;x<7;x++)
{
delay(200);
out(b[x]); //输出字符
}
for(z=0;z<50;z++)
{
delay(6000);
}
/******************
初始化
******************/
order(0x38);
delay(300);
order(0x38);
delay(300);
order(0x0c);
delay(300);
order(0x06);
delay(300);
order(0x01);
delay(300);
y=0x80; //显示地址
delay(400);
order(y);
/**********************************
I LOVE YOU
**********************************/
for(x=0;x<10;x++)
{
delay(200);
out(c[x]); //输出字符
}
y=0xc8; //显示地址
delay(400);
order(y);
/**********************************
( ^O^ )
**********************************/
for(x=0;x<6;x++)
{
delay(200);
out(d[x]); //输出字符
}
}
}
#include<reg52.h>
sbit RS=P3^5;
sbit RW=P3^6;
sbit E=P3^7;
/**********************************
延时
**********************************/
void delay(int x)
{
x=x*20;
for(;x>0;x--)
;
}
/**********************************
写指令
**********************************/
void order(int x)
{
E=0;
RS=0;
RW=0;
P0=x;
delay(10);
E=1;
delay(20);
E=0;
}
/*****************************
读出数据
*****************************/
void out(char y)
{
E=0;
RS=1;
RW=0;
P0=y;
delay(10);
E=1;
delay(20);
E=0;
}
/****************************************
主函数
****************************************/
void main()
{
int x,y,z;
int code a[]={0x4d,0x79,0x20,0x6e,0x61,0x6d,0x65,0x20,0x69,0x73,0x20};
int code b[]={0x59,0x75,0x20,0x50,0x65,0x6e,0x67};
int code c[]={0x49,0x20,0x4c,0x4f,0x56,0x45,0x20,0x59,0x4f,0x55};
int code d[]={0x28,0x5e,0x6f,0x5e,0x20,0x29};
while(1)
{
/******************
初始化
******************/
delay(300);
order(0x38);
delay(100);
order(0x38);
delay(100);
order(0x38);
delay(100);
order(0x01);
order(0x0c);
order(0x06);
y=0x80; //显示地址
order(y);
delay(400);
/*******************************
My name is
*******************************/
for(x=0;x<11;x++)
{
//输出字符所在地址
delay(200);
out(a[x]); //输出字符
}
y=0xc8; //显示地址
delay(400);
order(y);
/*******************************
Yu Peng
*******************************/
for(x=0;x<7;x++)
{
delay(200);
out(b[x]); //输出字符
}
for(z=0;z<50;z++)
{
delay(6000);
}
/******************
初始化
******************/
order(0x38);
delay(300);
order(0x38);
delay(300);
order(0x0c);
delay(300);
order(0x06);
delay(300);
order(0x01);
delay(300);
y=0x80; //显示地址
delay(400);
order(y);
/**********************************
I LOVE YOU
**********************************/
for(x=0;x<10;x++)
{
delay(200);
out(c[x]); //输出字符
}
y=0xc8; //显示地址
delay(400);
order(y);
/**********************************
( ^O^ )
**********************************/
for(x=0;x<6;x++)
{
delay(200);
out(d[x]); //输出字符
}
}
}
没有忙检查函数。液晶屏属于慢显示器件。
查忙,可以解决这个问题
LCD初始化判忙看看.
你这个
for(z=0;z<50;z++)
{
delay(6000);
}
6000超区了,你delay里面是*20,你自己看一下,然后你自己检查一下,是不是有检测lcd的busy状态.