LCD1602实现两屏切换
一、 设计任务
在单片机AT89S51的控制下,利用LCD1602和两只按键完成两屏信息的切换显示。第一屏信息:第一行为自己姓名的拼音,第二行为自己学号。第二屏信息:第一行自己籍贯的拼音,第二行为自己生日。
显示方式利用LCD 1602命令1~8进行设置,自定,要求至少要使用四个命令。
二、 设计思路
1通过设计要求“利用LCD1602和两个按键完成两屏信息的切换显示”。需要设置键盘扫描方式,这里我们引用中段扫描函数⑤:即键盘只有在有按键按下时,才会像单片机发出中断请求信号,单片机响应中断。如果确实按键按下则把按键按下的标志位置1,并读出键值。主循环内才能执行if语句。
设置中段扫描函数⑤
a 从硬件线路上可知当有按键按下时,与门输出低电平,向单片机的INT0引脚发出中断请求信号,从而执行INT0的中断函数。
b 设置一个重读变量reread_key,并屏蔽INT0中断,让按键按下标志位清零,
向P1口写1,设置P1为输入。
c 用key从P1口读入键值,引用延时10ms函数⑥,用重读变量读取键值,比较key和reread_key是否相同,若相同,则键盘按下,按键按下标志位置1。从而做到软件消抖。
d 运行结束,重新允许INT0中断。
设置延时10ms函数⑥
a 利用for语句嵌套一个for语句,从而达到加长延时的目的。
b 延时函数的设置⑦与延时10ms函数类似,不再多述。
2接下来设置显示函数⑴,第一步引用初始化函数①,第二步引用显示字符串函数④,输入第一行显示地址0x81,和显示字符串WAN ER。输入第二行显示地址0xC3,和显示字符串0000000000。需要注意:显示函数并没有用循环语句,且引用显示字符串函数前,必须加初始化函数,这样做的优点是:在按下一个按键的时候,相关的屏幕信息将会显示,并在下一个按键按下前不会消失,且不影响下一个按钮的显示。
3设置显示函数⑵同理。
设置初始化函数①,这里我们引用写命令函数②
a设置两行显示,57点阵,八位数据接口。引用命令字0x38。
b设置屏幕开显示,有光标,不闪烁。引用命令字0x0e。
c设置地址指针-1,整屏显示不移动。引用命令字0x04。
d设置清屏,引用命令字0x01。
设置写命令函数②
a 引用查忙函数③,检测LCD 1602的状态是否“忙”?
b 列出写命令条件:RS=0,RW=0,E上跳变
c 将命令字符串写入P0口
d 结束操作
设置查忙函数③
a 采用do-while语句先执行循环体,读出LCD 1602的状态,观察忙标志位是否为0,为0脱离循环。为1继续循环。
b 注意读状态条件:RS=0,RW=1,E=1
设置显示字符串函数④
a 它有两个形式参数,一个为无符号字符串ad,显示地址命令字;一个为无符号字符串s,显示字符。
b 引用while循环,结束条件为字符串的结尾‘\0’
c 引用写命令函数,输入显示地址命令字ad
d 引用写数据函数,输入无符号字符串*s,并指针加1。
e 注意ad因为初始化命令c:整屏不移动 ,需要与指针同时加1;
4将按键与屏幕信息建立联系,当按键按下时,通过中断扫描函数,使按键按下的标志位置1,并读出键值,此时主循环if函数打开,因为按键的键值为八位,而且高六位为高电平,为了取值简单,需要对键值取反,之后引用switch语句,并按键按下标志位清0。从而使按键与屏幕信息建立联系。
5把1,2,3,4步放入主函数,其他为自定义函数。
三、 硬件电路
四、 软件设计
#include <reg51.h> //包含SFR的定义
#include <intrins.h> //包含_nop_( )空函数
#define uchar unsigned char
#define uint unsigned int
#define out P0 //定义P0寄存器为out
sbit RS=P2^0; //sbit特殊功能寄存器的可寻址位
sbit RW=P2^1;
sbit E=P2^2;
sbit L1=P1^0;
sbit L2=P1^1;
bit keyflag; //keyflag为按键按下的标志位
uchar key; //key为键值
void lcd_initial(void); //对被调函数的返回值类型做出说明
void check_busy(void);
void write_command(uchar com);
void write_data(uchar dat);