LCD1602液晶显示实验实验报告及程序.docx
- 文档编号:23107290
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:20
- 大小:97.64KB
LCD1602液晶显示实验实验报告及程序.docx
《LCD1602液晶显示实验实验报告及程序.docx》由会员分享,可在线阅读,更多相关《LCD1602液晶显示实验实验报告及程序.docx(20页珍藏版)》请在冰豆网上搜索。
LCD1602液晶显示实验实验报告及程序
实验三LCD1602液晶显示实验
姓名专业学号成绩
一、实验目的
1.掌握KeilC51软件与proteus软件联合仿真调试的方法;
2.掌握LCD1602液晶模块显示西文的原理及使用方法;
3.掌握用8位数据模式驱动LCM1602液晶的C语言编程方法;
4.掌握用LCM1602液晶模块显示数字的C语言编程方法。
二、实验仪器与设备
1.微机一台2.keilC51集成开发环境3.Proteus仿真软件
三、实验内容
1.用Proteus设计一LCD1602液晶显示接口电路。
要求利用P0口接LCD1602液晶的数据端,P2.0~P2.2做LCD1602液晶的控制信号输入端。
P3.0~P3.3口扩展3个功能键K1~K3。
参考电路见后面。
2.编写程序,实现字符的静态和动态显示。
显示字符为
第一行:
“1.姓名全拼”,第二行:
“2.专业全拼+学号”。
3.编写程序,利用功能键实现字符的垂直滚动和水平滚动等效果显示。
显示字符为:
“1.姓名全拼2.专业全拼+学号3.MCS-51EXP84.LCDDISPLAY”
主程序静态显示“Myinformation!
”
四、实验原理
液晶显示的原理:
采用的LCD显示屏都是由不同部分组成的分层结构,位于最后面的一层是由荧光物质组成的可以发射光线的背光层,背光层发出的光线在穿过第一层偏振过滤层之后进入包含成千上万水晶液滴的液晶层,液晶层中的水晶液滴都被包含在细小的单元格结构中,一个或多个单元格构成屏幕上的一个像素。
当LCD中的电极产生电场时,液晶分子就会产生扭曲,从而将穿越其中的光线进行有规则的折射,然后经过第二层过滤层的过滤在屏幕上显示出来。
1.LCD1602采用标准的14引脚(无背光)或16引脚(带背光)接口,各引脚接口说明如表:
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
数据
3
VL
液晶显示偏压
11
D4
数据
4
RS
数据/命令选择
12
D5
数据
5
R/W
读/写选择
13
D6
数据
6
E
使能信号
14
D7
数据
7
D0
数据
15
BLA
背光源正极
8
D1
数据
16
BLK
背光源负极
2.1602液晶模块内部的控制器共有11条控制指令,如表所示:
3.芯片时序表:
4.1602LCD的一般初始化(复位)过程
(1)延时15ms。
(2)写指令38H(不检测忙信号)。
(3)延时5ms。
(4)写指令38H(不检测忙信号)。
(5)延时5ms。
(6)写指令38H(不检测忙信号)。
(7)以后每次写指令、读/写数据操作均需要检测忙信号。
(8)写指令38H:
显示模式设置。
(9)写指令08H:
显示关闭。
(10)写指令01H:
显示清屏。
(11)写指令06H:
显示光标移动设置。
(12)写指令0CH:
显示开及光标设置。
五、实验步骤
1.用Proteus设计1602液晶显示接口电路;
2.在KeilC51中编写液晶显示控制程序,编译通过后,与Proteus联合调试;
3.按动功能键,观察字符及效果是否正确显示。
六、电路设计调试及程序
1)实验电路
2)程序设计与调试
静态显示
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]="1.HuangXin";
ucharcodetable1[]="2.Tongxin412381";
sbitlcden=P2^2;
sbitlcdrw=P2^1;
sbitlcdrs=P2^0;
ucharnum;
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_data(uchardate)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidinit()
{
lcden=0;
lcdrw=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x00);
}
voidmain()
{
init();
delay(100);
while
(1)
{
for(num=0;num<12;num++)
{
write_data(table[num]);
delay(200);
}
write_com(0x02);
write_com(0x80+0x40);
for(num=0;num<16;num++)
{
write_data(table1[num]);
delay(200);
}
while
(1);
}
}
动态显示
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]="1.HuangXin";
ucharcodetable1[]="2.Tongxin412381";
sbitlcden=P2^2;
sbitlcdrw=P2^1;
sbitlcdrs=P2^0;
ucharnum;
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_data(uchardate)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidinit()
{
lcden=0;
lcdrw=0;
write_com(0x38);
write_com(0x0f);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x00);
}
voidmain()
{
init();
delay(100);
while
(1)
{
for(num=0;num<12;num++)
{
write_data(table[num]);
delay(200);
}
write_com(0x02);
write_com(0x80+0x40);
for(num=0;num<16;num++)
{
write_data(table1[num]);
delay(200);
}
write_com(0x01);
}
}
按键实现不同效果
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]="Myinformation!
";
ucharcodetable1[]="1.HuangXin";
ucharcodetable2[]="2.Tongxin412381";
ucharcodetable3[]="3.MCS-51EXP8";
ucharcodetable4[]="4.LCDDISPLAY";
ucharnum,i,j;
ucharflag1,flag2,flag3,flag4;
sbitk1=P3^0;
sbitk2=P3^1;
sbitk3=P3^2;
sbitk4=P3^3;
sbitlcden=P2^2;
sbitlcdrw=P2^1;
sbitlcdrs=P2^0;
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_data(uchardate)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidinit()
{
lcden=0;
lcdrw=0;
write_com(0x38);
write_com(0x0f);
write_com(0x06);
write_com(0x01);
}
voidmain()
{
init();
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
EX0=1;
IT0=1;
IP=0x05;
EX1=1;
IT1=1;
delay(100);
while
(1)
{flag3=0;
write_com(0x01);
write_com(0x80+0x01);
delay(50);
for(num=0;num<15;num++)
{
write_data(table[num]);
delay(200);
}
delay(200);
write_com(0x01);
}
}
voiddisplay()
{
if(k1==0)
{
while
(1)
{
if(flag1==1)break;
if(flag3==0)//
{
if(flag1==1)break;//控制返回
write_com(0x01);
write_com(0x80+0x00);
delay(50);
for(num=0;num<11;num++)//显示"1.HuangXin"
{
if(flag1==1)break;
while(flag3==1)
{
if(flag1==1)break;
}
write_data(table1[num]);
delay(200);
}
write_com(0x80+0x40);
for(num=0;num<16;num++)//显示"2.Tongxin412381"
{
if(flag1==1)break;
while(flag3==1)
{
if(flag1==1)break;
}
write_data(table2[num]);
delay(200);
}
write_com(0x01);
delay(200);
write_com(0x80+0x00);
for(num=0;num<16;num++)//显示"2.Tongxin412381"
{
if(flag1==1)break;
while(flag3==1)
{
if(flag1==1)break;
}
write_data(table2[num]);
delay(200);
}
write_com(0x80+0x40);
for(num=0;num<13;num++)//显示"3.MCS-51EXP8"
{
if(flag1==1)break;
while(flag3==1)
{
if(flag1==1)break;
}
write_data(table3[num]);
delay(200);
}
write_com(0x01);
write_com(0x80+0x00);
for(num=0;num<13;num++)//显示"3.MCS-51EXP8"
{
if(flag1==1)break;
while(flag3==1)
{
if(flag1==1)break;
}
write_data(table3[num]);
delay(200);
}
delay(200);if(flag1==1)break;
write_com(0x80+0x40);
for(num=0;num<13;num++)//显示"4.LCDDISPLAY"
{
if(flag1==1)break;
while(flag3==1)
{
if(flag1==1)break;
}
write_data(table4[num]);
delay(200);
}
write_com(0x01);
write_com(0x80+0x00);
for(num=0;num<13;num++)//显示"4.LCDDISPLAY"
{
if(flag1==1)break;
while(flag3==1)
{
if(flag1==1)break;
}
write_data(table4[num]);
delay(200);
}
write_com(0x80+0x40);
for(num=0;num<11;num++)//显示"1.HuangXin"
{
if(flag1==1)break;
while(flag3==1)
{
if(flag1==1)break;
}
write_data(table1[num]);
delay(200);
}
}
}
flag3=0;
flag1=0;//清标志位
write_com(0x01);//清屏
}
if(k2==0)
{
//if(flag1==1)break;
write_com(0x01);//清屏
write_com(0x80+0x00);
for(num=0;num<11;num++)//显示"1.HuangXin"
{
if(flag1==1)break;
write_data(table1[num]);
delay(50);
}
write_com(0x80+0x10);
for(num=0;num<16;num++)//显示"2.Tongxin412381"
{
if(flag1==1)break;
write_data(table2[num]);
delay(50);
}
write_com(0x02);
write_com(0x80+0x40);
for(num=0;num<13;num++)//显示"3.MCS-51EXP8"
{
if(flag1==1)break;
write_data(table3[num]);
delay(50);
}
write_com(0x80+0x50);
for(num=0;num<13;num++)//显示"4.LCDDISPLAY"
{
if(flag1==1)break;
write_data(table4[num]);
delay(50);
}
while
(1)
{
if(flag1==1)break;
while(flag3==1)
{
if(flag1==1)break;
}
if(flag3==0)
{
write_com(0x1c);//整屏左移或右移
delay(100);
if(flag1==1)break;
}
}
flag3=0;
flag1=0;//清除标志位
write_com(0x01);//清屏
}
}
voidtime0()interrupt1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
display();
}
voidINT_0()interrupt0
{
EX0=0;
delay(20);
EX0=1;
flag3=!
flag3;
}
voidINT_1()interrupt2
{
EX1=0;
delay(20);
EX1=1;
flag1=1;
}
七、实验问题解决及总结
实验中出现了运行垂直或水平效果时若按下暂停/继续按键再按返回按键后,再按垂直或水平按键不继续运行的情况。
主要原因是标志位设置及功能不明确造成,应在执行完效果程序后将暂停与返回的标志位都清零。
最好对每个按键设置一个标志位,容易控制。
将效果函数与标志位的处理放在主函数中,不涉及中断嵌套等问题。
通过本次实验,掌握了对LCD1602编程的方法,学会了运用标志位对程序进行更好的控制,并进一步培养了编程似的逻辑思维。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LCD1602 液晶显示 实验 报告 程序