
LZ 迷糊的只是 应该 先 En=1 再 P0=DATA, 还是 先 P0=DATA 再 En=1;
En 是 LCD 使能端,En=1 表示 使能 LCD *** 作,En=0 表示 禁止 LCD *** 作。
程序前面 已经 对 RS 跟 RW 进行了选择(写指令),如果 这时候 开启 En 使能端,那么 LCD 将 允许 该 *** 作(写指令),同时 将 数据端P0 的数据 读取到 LCD,这个过程的时间 是 ns 级别 的,程序还没来得及 将 DATA 的 数据 送到 P0 ,就已经发生了 数据被读取的 *** 作,也就是说,LCD 读进去的数据,并不是 LZ 想要的 DATA 数据,而是 之前 的数据,很可能是随机的。这将导致LCD 执行了错误 的命令,或是 无法识别命令。
所以 ,要在使能端 En=1 前,先将 数据 DATA 放到 数据口P0,再 使能 En,如此 LCD 就会 读取到 正确 的命令数据了。
#include <reg51h>
#define uchar unsigned char
#define uint unsigned int
#define lcd_ports P1
sbit lcdrs=P3^5;
sbit lcdrw=P3^3;
sbit lcde=P3^4;
void delay(uint z) //延迟子程序
{
uchar i,j;
for(i=z;i>0;i--)
for(j=256;j>0;j--);
}
void write_com(uchar com) //1602写指令
{
lcdrs=0;
P1=com;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void write_data(uchar date) //1602写数据,写的是你要显示数据的ASCLL码值
{
lcdrs=1;
P1=date;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void init() //初始化
{
lcdrw=0;
lcde=0;
write_com(0x38); //使液晶显示点阵
write_com(0x0e); //初始设置
write_com(0x06); //初始设置
write_com(0x01); //清零
write_com(0x80+0x00); //使指针指向第一行第一列
}
void main()
{
init();
while(1){
write_com(0x80);//从第一行第一列开始写数据。
write_data(0x73); //显示s字符
write_data(0x69);//第一行第二列显示字符i
write_data(0x6e);//第一行第三列显示字符n
write_data(0x65);//第一行第四列显示字符e;}
}
#include<reg51h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
uchar code smg_data[]="0123456789ABCDEF";
void delay(uint z);
void write_command(uchar command);
void write_data(uchar dat);
void init();
void scanf();
void main()
{
RW=0;
E=0;
init();
write_command(0x80); //写显示位置
while(1)
{
scanf();
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_command(uchar command)
{
RS=0;
P0=command;
E=1;
delay(5);
E=0;
}
void write_data(uchar dat)
{
RS=1;
P0=dat;
E=1;
delay(5);
E=0;
}
void init()
{
write_command(0x38);
write_command(0x0c);
write_command(0x06);
write_command(0x01);
}
void scanf()
{
uchar key,key_h,key_l;
P1=0x0f;
key_l=P1&0x0f;
if(key_l!=0x0f)
{
delay(10);
key_l=P1&0x0f;
if(key_l!=0x0f)
{
P1=0xf0;
key_h=P1&0xf0;
key=key_l+key_h;
while(key_l!=0x0f)//检测按键放开
{
P1=0x0f;
key_l=P1&0x0f;
}
switch(key)
{
case 0x77:write_command(0x80);write_data(smg_data[0]);break;
case 0x7b:write_command(0x80);write_data(smg_data[1]);break;
case 0x7d:write_command(0x80);write_data(smg_data[2]);break;
case 0x7e:write_command(0x80);write_data(smg_data[3]);break;
case 0xb7:write_command(0x80);write_data(smg_data[4]);break;
case 0xbb:write_command(0x80);write_data(smg_data[5]);break;
case 0xbd:write_command(0x80);write_data(smg_data[6]);break;
case 0xbe:write_command(0x80);write_data(smg_data[7]);break;
case 0xd7:write_command(0x80);write_data(smg_data[8]);break;
case 0xdb:write_command(0x80);write_data(smg_data[9]);break;
case 0xdd:write_command(0x80);write_data(smg_data[10]);break;
case 0xde:write_command(0x80);write_data(smg_data[11]);break;
case 0xe7:write_command(0x80);write_data(smg_data[12]);break;
case 0xeb:write_command(0x80);write_data(smg_data[13]);break;
case 0xed:write_command(0x80);write_data(smg_data[14]);break;
case 0xee:write_command(0x80);write_data(smg_data[15]);break;
default:;break;
}
}
}
}
//>
你的循环次数改一下要小于8,每行最多8个地址,10当然会串行了。
#include <STC12C5A60S2H>
#define uchar unsigned char
#define uint unsigned int
sbit E=P2^7;
sbit RW=P2^5;
sbit RS=P2^6;
sbit PSB=P3^2;
uchar code table1 []="当前温度:";
uchar code table2 []="剩余电量:";
void write_com(uchar com);
void write_dat(uchar dat);
void lcd_inti();
void delay(uchar i) ; //01ms
void main()
{
uchar a,b;
lcd_inti();
delay(500);
write_com(0x80);
for(a=0;a<5;a++)
{
write_dat(table1[a]);
delay(10);
}
write_com(0x90);
for(b=0;b<5;b++)
{
write_dat(table2[b]);
delay(10);
}
while(10);
}
void write_com(uchar com)
{
E=0;
RS=0;
RW=0;
E=1;
P0=com;
delay(10);
E=0;
}
void write_dat(uchar dat)
{
E=0;
RS=1;
RW=0;
E=1;
P0=dat;
delay(10);
E=0;
}
void lcd_inti()
{
delay(500);
PSB=1; //并口
write_com(0x30); //基本指令
delay(50);
write_com(0x0c); //打开显示,光标关闭
delay(50);
write_com(0x01); //清除LCD显示类容
delay(50);
}
void delay(uchar i) //01ms
{
uchar j;
while(i--)
for(j=1200;j>0;j--);
}
以上就是关于单片机中lcd12864的时序程序全部的内容,包括:单片机中lcd12864的时序程序、写出编程LCD1602液晶的初始化程序、单片机LCD程序求救在线等 定有重赏!!!!!!!!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)