1、标签: 单片机 LCD 基于 51单片机的 1602LCD显示基于 51 单片机的 1602LCD 显示LCD(liquid crystal display)为液晶显示器,它一般不会单独使用,而是将 LCD面板、驱动与控制电路组合成 LCD模块(1iquid crystal display moulde,简称为 LCM)来使用。LCM 是一种很省电的显示设备,常被应用在数字或微处理器控制的系统,做为简易的人机接口,但人们一般还是习惯称之为LCD显示器。1 硬件设计采用 51 单片机控制 1602LCD 显示器的电路如下所示。在桌面上双击图标 ,打开 ISIS 7 Professional 窗口
2、(本人使用的是 v7.4 SP3中文版)。单击菜单命令“文件”“新建设计”,选择 DEFAULT模板,保存文件名为“LCD.DSN”。在器件选择按钮中单击“P”按钮,或执行菜单命令 “库”“拾取元件符号”,添加如下表所示的元件。51 单片机 AT89C51 一片 晶体 CRYSTAL 12MHz 一只瓷片电容 CAP 22pF 二只 电解电容 CAP-ELEC 10uF 一只电阻 RES 10K 一只 排阻 RESPAC-8 10K 一只1602 液晶显示器 LM016L 一只若用 Proteus 软件进行仿真,则上图中的晶振和复位电路以及 U1 的 31 脚,都可以不画,它们都是默认的。在
3、ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标 ,在对象选择器中单击 POWER和 GROUND放置电源和地。放置好元件后,布好线。左键双击各元件,设置相应元件参数,完成电路图的设计。2 软件设计用 1602LCD 显示两行字符的流程图如下所示。用 1602LCD 显示“Welcom to China”和“Hi!Good morning!”的详细 C51 程序如下。/用 LCD 循环显示“Welcome to China“和“Hi!Good morning!“#include /包含单片机的头文件#include /包含_nop_()函数定义的头文件sbit RS=“P2“0;
4、/寄存器选择位,将 RS 位定义为 P2.0 引脚sbit RW=“P2“1; /读写选择位,将 RW 位定义为 P2.1 引脚sbit E=“P2“2; /使能信号位,将 E 位定义为 P2.2 引脚sbit BF=“P0“7; /忙碌标志位,将 BF 位定义为 P0.7 引脚unsigned char code string =“Welcome to China“;unsigned char code string1 =“Hi!Good morning!“; /*函数功能:延时 1ms(3j+2)*i=(333+2)10=1010(微秒),可以认为是 1 毫秒*/void delay1ms
5、()unsigned char i,j;for(i=0;i10;i+)for(j=0;j33;j+);/*函数功能:延时若干毫秒入口参数:n*/void delay(unsigned char n)unsigned char i;for(i=0;in;i+)delay1ms();/*函数功能:判断液晶模块的忙碌状态返回值:result。result=1,忙碌; result=0,不忙*/unsigned char BusyTest(void)bit result;RS=0; /根据规定,RS 为低电平,RW 为高电平时,可以读状态RW=1;E=1; /E=1,才允许读写_nop_(); /空操
6、作_nop_();_nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间result=BF; /将忙碌标志电平赋给 resultE=0;return result;/*函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate*/void WriteInstruction (unsigned char dictate) while(BusyTest()=1); /如果忙就等待RS=0; /根据规定,RS 和 R/W 同时为低电平时,可以写入指令RW=0; E=0; /E 置低电平_nop_();_nop_(); /空操作两个机器周期,给硬件反应时间P0=dicta
7、te; /将数据送入 P0 口,即写入指令或地址_nop_();_nop_();_nop_();_nop_(); /空操作四个机器周期,给硬件反应时间E=1; /E 置高电平(正跳变)_nop_();_nop_();_nop_();_nop_(); /空操作四个机器周期,给硬件反应时间E=0; /当 E 由高电平跳变成低电平时,液晶模块开始执行命令/*函数功能:将数据(字符的标准 ASCII 码)写入液晶模块入口参数:y(为字符常量)*/void WriteData(unsigned char y)while(BusyTest()=1); RS=1; /RS 为高电平,RW 为低电平时,可以写
8、入数据RW=0;E=0; /E 置低电平P0=y; /将数据送入 P0 口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_(); /空操作四个机器周期,给硬件反应时间E=1; /E 置高电平(正跳变)_nop_();_nop_();_nop_();_nop_(); /空操作四个机器周期,给硬件反应时间E=0; /当 E 由高电平跳变成低电平时,液晶模块开始执行命令/*函数功能:对 LCD 的显示模式进行初始化设置*/void LcdInitiate(void)delay(15); /延时 15ms,首次写指令时应给 LCD 一段较长的反应时间WriteInstr
9、uction(0x38); /显示模式设置:8 位数据,162 显示,57 点阵,delay(5); /延时 5ms WriteInstruction(0x38);delay(5);WriteInstruction(0x38);delay(5);WriteInstruction(0x0f); /显示模式设置:显示开,有光标,光标闪烁delay(5);WriteInstruction(0x06); /显示模式设置:光标右移,字符不移delay(5);WriteInstruction(0x01); /清屏幕指令,将以前的显示内容清除delay(5);void main(void) /主函数unsi
10、gned char i;LcdInitiate(); /调用 LCD 初始化函数 delay(10);while(1)WriteInstruction(0x01); /清显示:清屏幕指令WriteInstruction(0x80); /第一行显示地址 i = 0;while(stringi != 0) / 显示字符WriteData(stringi);i+;delay(150);for(i=0;i4;i+)delay(250);WriteInstruction(0xc0); /第二行显示地址 i = 0;while(string1i != 0) / 显示字符WriteData(string1i
11、);i+;delay(150);for(i=0;i4;i+)delay(250);打开 Keil程序(本人使用的是 Keil8.05中文版),执行菜单命令“工程”“新建工程”创建“LCD”项目,并选择单片机型号为 AT89C51。执行菜单命令“文件”“新建”创建文件,输入 C语言源程序,保存为“LCD.C”。在Project Workspace窗口中右击源代码组 1,选择“添加文件到组源代码组 l”将源程序“LCD.C”添加到项目中。在 Keil 中执行执行菜单命令“工程”“创建目标”(或点击“创建目标”快捷按钮),编译源程序。如果编译成功,则在“Output Window”的“创建”窗口中显
12、示没有错误,并创建了“LCD.HEX ”文件。3 仿真与调试关于 Proteus 与 Keil 的联合仿真调试,可参见我以前所写的博文或其它参考资料。启动 Proteus 的 ISIS,并将其放在屏幕的右上角(可将原理图放大到合适大小);再启动 Keil 的 Vision3 ,并将其放在屏幕的左下角。在 Keil中执行菜单命令“调试”“启动停止调试”,或直接单击图标,进入 Keil调试环境。同时,在 Proteus ISIS的窗口中可看出 Proteus也进入了程序调试状态。在 Keil代码编辑窗口中设置相应断点,断点的设置方法:在需要设置断点语句前双击鼠标左键,可设置断点;再次双击,可取消该断点。在 Keil中按 F5键(或点击“运行”快捷按钮)运行程序。1602LCD 循环显示“Welcom to China”和“Hi!Good morning!” ,如下图所示。或可以点击单步、运行到光标处、全速运行等快捷按钮,以及同时观察工程窗口寄存器页面、存储器窗口等,来进行仿真调试。