单片机中lcd12864的时序程序

单片机中lcd12864的时序程序,第1张

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程序求救在线等 定有重赏!!!!!!!!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10179027.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-06
下一篇2023-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存