实验八 LCM1602液晶显示实验.docx
- 文档编号:17958143
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:17
- 大小:30.77KB
实验八 LCM1602液晶显示实验.docx
《实验八 LCM1602液晶显示实验.docx》由会员分享,可在线阅读,更多相关《实验八 LCM1602液晶显示实验.docx(17页珍藏版)》请在冰点文库上搜索。
实验八LCM1602液晶显示实验
实验八LCM1602液晶显示实验
姓名牟甜鸽专业通信工程学号2011412489成绩
一、实验目的
1.掌握keilC51软件与protues软件联合仿真调试的方法;
2.掌握LCM1602液晶模块显示西文的原理及使用方法;
3.掌握用8位数据模式驱动LCM1602液晶的C语言编程方法。
二、实验内容
1.用protues设计一LCM1602液晶显示接口电路。
要求利用P0接LCM1602液晶的数据端,P2.0~P2.2做LCM1602液晶的控制信号输入端。
P3.0~P3.4口扩展4个功能键K1~K4,电路如下
2.编写程序,实现字符的静态和动态显示,字符为第一行“姓名全拼”第二行“专业全拼+学号”。
液晶的初始化,字符显示程序可参考官网的程序文件也可参考课本程序。
3.编写程序,利用功能键实现字符的纵向滚动和横向滚动等效果显示,主程序静态显示“MyInformatiom”,显示字符如下:
1.姓名全拼2.专业全拼+学号3.MCS-51EXP84.LCDDISPLAY
三、实验原理及步骤
液晶显示的原理:
采用的LCDxianshiping都是由不同部分组成的分层结构,位于最后面的一层是由荧光物质组成的可以发射光线的背景层,背景层发出的光线在穿过第一层偏振过滤层之后进入包含成千上万水晶液滴的液晶层,液晶层中的水晶液滴都被包含在细小的单元格结构中,一个或多个单元产生扭曲,从而经穿过其中的光线进行有规则的折射,然后经过第二层过滤在屏幕生显示出来。
1、LCM1602采用标准的14脚(无背光)或16脚(带背光)接口,1602液晶模块内部的控制器共有11条控制指令,参考课本的指令代码。
2、1602LCD的一般初始化(复位)过程
(1)延时15ms
(2)写指令38H(不检测忙信号)(3)延时5ms(4)写指令38H(不检测忙信号)(5)延时5ms(6)写指令38H(不检测忙信号)以后每次写指令读/写数据操作均需要检测忙信号(7)写指令38H:
显示模式设备(8)写指令08H:
显示关闭(9)写指令01H:
显示清屏(10)写指令06H:
显示光标移动设置(11)写指令0CH:
显示开关及移动光标设置
实验步骤:
1.用protues设计1602液晶显示接口电路;
2.在KeilC51中编写液晶显示控制程序;编译通过后,与protues联合调试;
3.按动功能键,观察字符及效果是否正确显示。
四、电路设计及调试
实验电路:
实验程序:
1.动态显示
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]="moutiange";
ucharcodetable1[]="tongxin2011412489";
sbitE=P2^2;
sbitRW=P2^1;
sbitRS=P2^0;
ucharnum;
voiddelay(uintc)
{
uchara,b;
for(;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
voidwrite_com(ucharcom)
{
RS=0;
RW=0;
P0=com;
delay(5);
E=1;
delay(5);
E=0;
}
voidwrite_dat(uchardat)
{
RS=1;
RW=0;
P0=dat;
delay(5);
E=1;
delay(5);
E=0;
}
voidinit()
{
E=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
voidmain()
{
init();
delay(1000);
while
(1)
{
write_com
(1);
for(num=0;num<12;num++)
{
write_dat(table[num]);
delay(200);
}
write_com
(2);
write_com(0x80+0x40);
for(num=0;num<20;num++)
{
write_dat(table1[num]);
delay(200);
}
write_com(0x1c);
delay(200);
write_com(0x1c);
delay(200);
write_com(0x1c);
delay(2000);
}
}
2.静态显示
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]="moutiange";
ucharcodetable1[]="tongxin2011412489";
sbitE=P2^2;
sbitRW=P2^1;
sbitRS=P2^0;
ucharnum;
voiddelay(uintc)
{
uchara,b;
for(;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
voidwrite_com(ucharcom)
{
RS=0;
RW=0;
P0=com;
delay(5);
E=1;
delay(5);
E=0;
}
voidwrite_dat(uchardat)
{
RS=1;
RW=0;
P0=dat;
delay(5);
E=1;
delay(5);
E=0;
}
voidinit()
{
E=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x1);
}
voidmain()
{
init();
delay(1000);
for(num=0;num<12;num++)
{
write_dat(table[num]);
delay(200);
}
write_com
(2);
write_com(0x80+0x40);
for(num=0;num<20;num++)
{
write_dat(table1[num]);
delay(200);
}
write_com(0x1c);
delay(200);
write_com(0x1c);
delay(200);
write_com(0x1c);
delay(2000);
while
(1);
}
3.功能显示
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable1[]="Myinformation!
";
ucharcodetable2[]="Moutiange";
ucharcodetable3[]="TX2011412489";
ucharcodetable4[]="MCS-51EXP8";
ucharcodetable5[]="LCDDISPLAY";
sbitRS=P2^0;
sbitRW=P2^1;
sbitE=P2^2;
sbitK1=P3^0;
sbitK2=P3^1;
sbitK3=P3^2;
sbitK4=P3^3;
ucharnum;
bitflag1,flag2,flag3,flag4;
voiddelay(uintz)
{uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)
{RS=0;//写命令
RW=0;
P0=com;
delay(5);
E=1;
delay(5);
E=0;
}
voidwrite_data(uchardate)
{RS=1;//写数据
RW=0;
P0=date;
delay(5);
E=1;
delay(5);
E=0;
}
voidinit()
{E=0;
write_com(0x38);//初始化
write_com(0x0e);//打开光标
write_com(0x06);
write_com(0x01);
write_com(0x80+0x1);
}
voidmain()
{
init();
TMOD=0X01;
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
EA=1;
EX0=1;
EX1=1;
ET0=1;
TR0=1;
IT0=1;
IT1=1;
PX1=1;
while
(1)
{
for(num=0;num<17&&flag1==0&&flag2==0;num++)
{
while(flag3==1);
write_data(table1[num]);
delay(100);
}
write_com
(1);
if(flag1|flag2)break;
}
while(flag1==1)
{
write_com
(1);
write_com(0x80);
for(num=0;num<14&&(flag1==1||flag2==1);num++)
{
while(flag3==1);
write_data(table2[num]);
delay(100);
}
if(flag4==1)
{flag4=0;break;}
write_com(0x80+0x40);
for(num=0;num<14&&(flag1==1||flag2==1);num++)
{
while(flag3==1);
write_data(table3[num]);
delay(100);
}
if(flag4==1)
{flag4=0;break;}
write_com
(1);
write_com(0x80);
for(num=0;num<14&&(flag1==1||flag2==1);num++)
{
while(flag3==1);
write_data(table3[num]);
delay(100);
}
if(flag4==1)
{flag4=0;break;}
write_com(0x80+0x40);
for(num=0;num<14&&(flag1==1||flag2==1);num++)
{
while(flag3==1);
write_data(table4[num]);
delay(100);
}
if(flag4==1)
{flag4=0;break;}
write_com
(1);
write_com(0x80);
for(num=0;num<14&&(flag1==1||flag2==1);num++)
{
while(flag3==1);
write_data(table4[num]);
delay(100);
}
if(flag4==1)
{flag4=0;break;}
write_com(0x80+0x40);
for(num=0;num<14&&(flag1==1||flag2==1);num++)
{
while(flag3==1);
write_data(table5[num]);
delay(100);
}
if(flag4==1)
{flag4=0;break;}
write_com
(1);
write_com(0x80);
for(num=0;num<14&&(flag1==1||flag2==1);num++)
{
while(flag3==1);
write_data(table5[num]);
delay(100);
}
if(flag4==1)
{flag4=0;break;}
write_com(0x80+0x40);
for(num=0;num<14&&(flag1==1||flag2==1);num++)
{
while(flag3==1);
write_data(table2[num]);
delay(100);
}
if(flag4==1)
{flag4=0;break;}
}
while(flag2==1&&flag3==0)
{
write_com
(1);
write_com(0x80);
for(num=0;num<14&&(flag1==1||flag2==1);num++)
{
while(flag3==1);
write_data(table2[num]);
delay(100);
}
if(flag4==1)
{flag4=0;break;}
write_com(0x80+0x40);
for(num=0;num<14&&(flag1==1||flag2==1);num++)
{
while(flag3==1);
write_data(table3[num]);
delay(100);
}
if(flag4==1)
{flag4=0;break;}
for(num=0;num<16;num++)
{
write_com(0x1c);
}
write_com(0x80+0x10);
for(num=0;num<14&&(flag1==1||flag2==1);num++)
{
while(flag3==1);
write_data(table4[num]);
delay(100);
}
if(flag4==1)
{flag4=0;break;}
write_com(0x80+0x50);
for(num=0;num<14&&(flag1==1||flag2==1);num++)
{
while(flag3==1);
write_data(table5[num]);
delay(100);
}
if(flag4==1)
{flag4=0;break;}
}
}
voidint0()interrupt0
{
EX0=0;
delay(10);
EX0=1;
if(flag1==1||flag2==1);
flag3=~flag3;
}
voidint1()interrupt2
{
EX1=0;
delay(10);
EX1=1;
flag4=1;
if(flag1==1||flag2==1);
{
flag1=flag2=flag3=0;
TR0=1;
}
}
voidtime()interrupt1
{
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
if(K1==0)
delay(10);
if(K1==0&&flag2==0)
{
flag1=~flag1;
}
if(K2==0)
delay(10);
if(K2==0&&flag1==0)
{
flag2=~flag2;
}
}
实验中遇到问题及解决办法:
开始时不知道动态与静态显示的区别,在字符显示时遇到字符串过长的问题,采用移屏解决。
功能显示中,由于内容较多,很容易缺少一些内容。
五、实验后的经验总结
1.1602动态显示的原理即先写入要显示的字符,然后写入滚动的命令,从而实现不同的效果。
2.程序中用到较多的标志位,对于标志位的命名要明显易懂,且要避免混淆。
六、对实验课的建议
没有。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验八 LCM1602液晶显示实验 实验 LCM1602 液晶显示