当前位置:文档之家› LCD1602液晶显示实验实验报告及程序.doc

LCD1602液晶显示实验实验报告及程序.doc

实验三 LCD1602 液晶显示实验姓名专业学号成绩一、实验目的1.掌握 Keil C51 软件与 proteus 软件联合仿真调试的方法;2.掌握 LCD1602液晶模块显示西文的原理及使用方法;3.掌握用 8 位数据模式驱动 LCM1602液晶的 C 语言编程方法;4.掌握用 LCM1602液晶模块显示数字的 C 语言编程方法。

二、实验仪器与设备1.微机一台 C51 集成开发环境仿真软件三、实验内容1.用 Proteus 设计一 LCD1602液晶显示接口电路。

要求利用 P0口接 LCD1602液晶的数据端, ~做 LCD1602液晶的控制信号输入端。

~口扩展 3 个功能键 K1~K3。

参考电路见后面。

2.编写程序,实现字符的静态和动态显示。

显示字符为第一行:“ 1. 姓名全拼”,第二行:“ 2. 专业全拼 +学号”。

3.编写程序,利用功能键实现字符的垂直滚动和水平滚动等效果显示。

显示字符为:“1. 姓名全拼 2.专业全拼+学号EXP8DISPLAY ”主程序静态显示“ My information!”四、实验原理液晶显示的原理:采用的 LCD显示屏都是由不同部分组成的分层结构,位于最后面的一层是由荧光物质组成的可以发射光线的背光层,背光层发出的光线在穿过第一层偏振过滤层之后进入包含成千上万水晶液滴的液晶层,液晶层中的水晶液滴都被包含在细小的单元格结构中,一个或多个单元格构成屏幕上的一个像素。

当 LCD中的电极产生电场时,液晶分子就会产生扭曲,从而将穿越其中的光线进行有规则的折射,然后经过第二层过滤层的过滤在屏幕上显示出来。

1.LCD1602采用标准的 14 引脚(无背光)或 16 引脚(带背光)接口,各引脚接口说明如表:编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极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.在Keil C51中编写液晶显示控制程序,编译通过后,与Proteus 联合调试;3.按动功能键,观察字符及效果是否正确显示。

六、电路设计调试及程序1)实验电路LCD1LM016LS D ESW 01234567S D EVVVRREDDDDDDDD1 2 34 5 678 9 0 1 2 3 4RV11 1 1 1 1S WER R10kC1RP11 22p X1U1219393 C212MXTAL1P0.0/AD038 4P0.1/AD1375P0.2/AD218366XTAL2P0.3/AD322pR2357P0.4/AD4P0.5/AD534810k339P0.6/AD6932C3RSTP0.7/AD7RESPACK-8RSP2.0/A82122 RWP2.1/A910u23 EP2.2/A102924PSEN P2.3/A113025ALE P2.4/A123126EAP2.5/A1327P2.6/A1428P2.7/A15垂直滚动1 P1.0/T2 P3.0/RXD 10水平滚动2 11P1.1/T2EX P3.1/TXD3 12P1.2 P3.2/INT0暂停 /继续4 13 P1.3 P3.3/INT1514P1.4 P3.4/T0返回615P1.5 P3.5/T1716P1.6 P3.6/WR817P1.7 P3.7/RDAT89C522) 程序设计与调试静态显示#include<>sbit lcdrs=P2^0; #define uchar unsigned char uchar num;#define uint unsigned intuchar code table[]=" Xin "; void delay(uint z)uchar code table1[]=" 412381"; {sbit lcden=P2^2; uint x,y;sbit lcdrw=P2^1;for(x=z;x>0;x--)}for(y=110;y>0;y--); lcden=0;}void write_com(uchar com) void init() { { lcdrs=0; lcden=0; P0=com; lcdrw=0; delay(5); write_com(0x38); lcden=1; write_com(0x0c); delay(5); write_com(0x06);lcden=0;}write_com(0x01);write_com(0x80+0x00); void write_data(uchar date) }{lcdrs=1; void main()P0=date; {delay(5); init();lcden=1; delay(100);delay(5);while(1){for(num=0;num<12;num++){write_data(table[num]);delay(200);}动态显示write_com(0x02);#include<>write_com(0x80+0x40);#define uchar unsigned char for(num=0;num<16;num++)#define uint unsigned int{uchar code table[]=" Xin "; write_data(table1[num]);uchar code table1[]=" 412381"; delay(200);sbit lcden=P2^2;}sbit lcdrw=P2^1;while(1);sbit lcdrs=P2^0;}uchar num;}void delay(uint z){uint x,y;for(x=z;x>0;x--) for(y=110;y>0;y--); }delay(5); lcden=0; }void write_com(uchar com) void init(){ {lcdrs=0; lcden=0;P0=com; lcdrw=0;delay(5); write_com(0x38); lcden=1; write_com(0x0f); delay(5); write_com(0x06); lcden=0;}write_com(0x01);write_com(0x80+0x00); void write_data(uchar date) }{lcdrs=1;void main()P0=date;{delay(5);init();lcden=1;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<>#define uchar unsigned char#define uint unsigned intuchar code table[]="My information!";uchar code table1[]=" Xin";uchar code table2[]=" 412381"; uchar code table3[]=" EXP8";uchar code table4[]=" DISPLAY"; {uchar num,i,j; lcdrs=0;uchar flag1,flag2,flag3,flag4; P0=com;sbit k1=P3^0; delay(5);sbit k2=P3^1; lcden=1;sbit k3=P3^2; delay(5);sbit k4=P3^3; lcden=0;}sbit lcden=P2^2;sbit lcdrw=P2^1; void write_data(uchar date) sbit lcdrs=P2^0; {lcdrs=1;void delay(uint z)P0=date;{delay(5);uint x,y;lcden=1;for(x=z;x>0;x--)delay(5);for(y=110;y>0;y--);lcden=0;}}void write_com(uchar com)void init(){ IP=0x05;lcden=0; EX1=1;lcdrw=0; IT1=1;write_com(0x38); delay(100);write_com(0x0f); while(1)write_com(0x06); { flag3=0;write_com(0x01); write_com(0x01);} write_com(0x80+0x01);delay(50);void main()for(num=0;num<15;num++){{init();write_data(table[num]);TMOD=0x01;delay(200);TH0=(65536-10000)/256;}TL0=(65536-10000)%256;delay(200);EA=1;write_com(0x01);ET0=1;}TR0=1;}EX0=1;IT0=1; void display(){ write_data(table1[num]);if(k1==0) delay(200);{ }while(1) write_com(0x80+0x40);{ for(num=0;num<16;num++)// 显示if(flag1==1) break;" 412381"if(flag3==0)//{{if(flag1==1) break;if(flag1==1)break;//while(flag3==1) 控制返回write_com(0x01);{write_com(0x80+0x00);if(flag1==1) break; delay(50);}for(num=0;num<11;num++)write_data(table2[num]); // 显示 " Xin" delay(200);{ }if(flag1==1) break; write_com(0x01);while(flag3==1) delay(200);{ write_com(0x80+0x00);if(flag1==1)break; for(num=0;num<16;num++)// 显示}" 412381"{ }if(flag1==1) break; write_com(0x01);while(flag3==1) write_com(0x80+0x00);{ for(num=0;num<13;num++) // 显if(flag1==1)break;示" EXP8"}{write_data(table2[num]);if(flag1==1) break;delay(200);while(flag3==1)}{write_com(0x80+0x40);if(flag1==1)break;for(num=0;num<13;num++)} // 显示 " EXP8" write_data(table3[num]);{ delay(200);if(flag1==1) break; }while(flag3==1) delay(200);if(flag1==1) break;{ write_com(0x80+0x40);if(flag1==1)break; for(num=0;num<13;num++) // 显}示" DISPLAY"write_data(table3[num]);{delay(200);if(flag1==1) break;while(flag3==1) write_com(0x80+0x40);{ for(num=0;num<11;num++) // 显示if(flag1==1)break;" Xin"}{write_data(table4[num]);if(flag1==1) break;delay(200);while(flag3==1)}{write_com(0x01);if(flag1==1)break;write_com(0x80+0x00);}for(num=0;num<13;num++)write_data(table1[num]); // 显示 " DISPLAY" delay(200);{ }if(flag1==1) break;while(flag3==1)}{}if(flag1==1)break;flag3=0;}flag1=0;// 清标志位write_data(table4[num]);write_com(0x01);// 清屏}delay(200);if(k2==0)}{ write_com(0x80+0x40);//if(flag1==1)break; for(num=0;num<13;num++) // 显write_com(0x01);// 清屏示" EXP8"write_com(0x80+0x00);{for(num=0;num<11;num++) //if(flag1==1)break; 显示" Xin" write_data(table3[num]);{ delay(50);if(flag1==1)break; }write_data(table1[num]); write_com(0x80+0x50);delay(50); for(num=0;num<13;num++) // 显}示" DISPLAY"write_com(0x80+0x10);{for(num=0;num<16;num++)//if(flag1==1)break; 显示" 412381" write_data(table4[num]); { delay(50);if(flag1==1)break; }write_data(table2[num]); while(1)delay(50); {} if(flag1==1) break;write_com(0x02);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);//清屏}}void time0() interrupt 1{TL0=(65536-1000)%256; display();}void INT_0() interrupt 0 {EX0=0;delay(20);EX0=1;flag3=!flag3;}void INT_1() interrupt 2 {EX1=0;delay(20);EX1=1;flag1=1;}TH0=(65536-1000)/256;七、实验问题解决及总结实验中出现了运行垂直或水平效果时若按下暂停 / 继续按键再按返回按键后,再按垂直或水平按键不继续运行的情况。

相关主题