实验八 LCM1602液晶显示实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验九 LCM1602液晶显示实验
一、实验目的
1.掌握keil C51软件与protues软件联合仿真调试的方法;
2.掌握LCM1602液晶模块显示西文的原理及使用方法;
3.掌握用8位数据模式驱动LCM1602液晶的C语言编程方法;
二、实验仪器与设备
1、微机一台 2 keilC51集成开发环境 3 Protues仿真软件
三、实验内容
1.用protues设计一LCM1602液晶显示接口电路。要求利用P0接LCM1602液
晶的数据端,P2.0~P2.2做LCM1602液晶的控制信号输入端。P3.0~P3.4口扩展4个功能键K1~K4,电路如下
2.编写程序,实现字符的静态和动态显示,字符为第一行“姓名全拼”第二行
“专业全拼+学号”。液晶的初始化,字符显示程序可参考官网的程序文件。
3.编写程序,利用功能键实现字符的纵向滚动和横向滚动等效果显示,显示字
符如下:
1.姓名全拼
2.专业全拼+学号
3.MCS-51 EXP8
4.LCD DISPLAY 主程序静态显示“My Informatiom”
5.实验源程序见附录。
6.实验电路图:
四、实验说明
液晶显示的原理:采用的LCDxianshiping都是由不同部分组成的分层结构,位于最后面的一层是由荧光物质组成的可以发射光线的背景层,背景层发出的光线在穿过第一层偏振过滤层之后进入包含成千上万水晶液滴的液晶层,液晶层中的水晶液滴都被包含在细小的单元格结构中,一个或多个单元产生扭曲,从而经穿过其中的光线进行有规则的折射,然后经过第二层过滤在屏幕生显示出来。
1、LCM1602采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接
第二脚:VDD接5V正电源。
第三脚:VL为液晶显示器对比度调整端,接正电源时的对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第四脚:RS为寄存器选择高电平时选择数据寄存器,低电平时选择指令寄存器。
第五脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或显示地址,当RS为低电平R/W
为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以读写入数据。
第六脚:E端为使能端,E端由高电平跳变为低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
第15脚:背光源正极。
第16脚:背光源负极。
2、1602液晶模块内部的控制器共有11条控制指令,如下页表:
(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. 1602动态显示的原理即先写入要显示的字符,然后写入滚动的命令,从而实现不同的动态效果。
2. 实现垂直滚动显示时可以分批次先写入第1、2行,再写入2、3行,第3、4行,第4、1行,从而实现垂直滚动现实的效果。也可以设置一个二维数组,用一个for()循环控制显示的字符实现垂直滚动显示。
3.对于实验中用到的四个按键前两个接P3.0和P3.1端口,如果按顺序检测按键是否按下,因为液晶显示也会占用一定的时间可能会导致按键漏检,解决此问题可用定时器定时检测的方式,但要注意防止一次按键重复检测的情况,可设置一个标志位,反映按键是否被检测完,等一侧按键完成后在接受下一次按键触发。
4.本次程序中用到较多的标志位,对于标志位的命名要明显易懂,避免混淆。
程序1 #include
#include
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P2^2; /*使能控制*/
sbit lcdrs=P2^0; /*命令数据输入*/ sbit lcdrw=P2^1; /*命令数据输入*/ sbit busy=P0^7;
sbit K1=P3^0;
sbit K2=P3^1;
bit flag1,flag2,flag3,flag4;
uchar num,i;
uchar code tab[]="My information!"; uchar code tab1[]="1.yixifeng";
uchar code tab2[]="2.dianzi2010412337";
uchar code tab3[]="3.MCS-51 EXP8"; uchar code tab4[]="4.LCD DISPLAY"; void LCD_check_busy(void)
{
while(1)
{
lcden=0;
lcdrs=0;
lcdrw=1;
P0=0xff;
lcden=1;
if(busy==0) break;
}
lcden=0;
}
delay(int x)
{
while(x--);
}
delay_ms(int x)
{
int a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void write_com(uchar com)
{ LCD_check_busy();
lcdrs=0;
lcden=0;
lcdrw=0;
P0=com;
lcden=1;
lcden=0;
}
void write_dat(uchar dat)
{
LCD_check_busy();
lcdrs=1; /*rs=1时写数据*/
P0=dat;
delay(10);
lcdrw=0;
lcden=1;
lcden=0;
}
void lcd_init() /*初始化函数*/ {
lcden=0; /*开启LCD显示*/
write_com(0x38); delay(10);
write_com(0x0f);
write_com(0x06);
}
void write_str(uchar *str)
{
while(*str!='\0')
{
while(flag3);
if(flag4){ write_com(0x01);
break; }
write_dat(*str) ;
str++;
delay_ms(50);
}
}
main()
{
uchar *ptr=tab;