按键及显示实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验原理及电路
1、LCD显示器是通过给不同的液晶单元供电,控制其光线的通过与否,从而达到显示的目的。因此,LCD的驱动控制归于对每个液晶单元通断电的控制,每个液晶单元都对应着一个电极,对其通电,便可使用光线通过(也有刚好相反的,即不通电时光线通过,通电时光线不通过)。,
2、由于LCD已经带有驱动硬件电路,因此模块给出的是总线接口,便于与单片机的总线进行接口。驱动模块具有八位数据总线,外加一些电源接口和控制信号。而且还自带显示缓存,只需要将要显示的内容送到显示缓存中就可以实现内容的显示。由于只有八条数据线,因此常常通过引脚信号来实现地址与数据线复用,以达到把相应数据送到相应显示缓存的目的。
实验电路图
二、功能说明
设计并实现一4×4键盘的接口,键盘与1602显示单元连接,编写实验程序扫描键盘输入,并将扫描结果送1602显示,键盘采用4×4键盘。将键盘进行编号记作0—F当按下其中一个按键时将该按键对应的编号在一个1602显示出来,当按下下一个按键时便将这个按键的编号1602上显示出来
实验框图
四、实验代码
#include
#define uchar unsigned char
#define uint unsigned int
#define lcd_data P3
sbit lcd_EN=P2^2;
sbit lcd_RW=P2^1;
sbit lcd_RS=P2^0;
uchar key,a;
uchar sys_time1[]="good";
uchar sys_time2[]="morning!";
uchar sys_time3[]="play";
uchar sys_time4[]="basketball!";
uchar sys_time5[]="study";
uchar sys_time6[]="hard!";
unsigned char code key_code[]={
0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xB7,0x77 };
void delayms(uint ms)
{
uchar t;
while(ms--)
{
for(t=0;t<120;t++);
}
}
void delay_20ms(void)
{
uchar i,temp;
for(i = 20;i > 0;i--)
{
temp = 248;
while(--temp);
temp = 248;
while(--temp);
}
}
void delay_38us(void)
{ uchar temp;
temp = 18;
while(--temp);
}
void delay_1520us(void)
{ uchar i,temp;
for(i = 3;i > 0;i--)
{
temp = 252;
while(--temp);
}
}
uchar lcd_rd_status( ) /*读取lcd1602的状态,主要用于判断忙*/
{
uchar tmp_sts; //声明变量tmp_sts
lcd_data = 0xff; //初始化P3口
lcd_RW = 1; //RW =1 读
lcd_RS = 0; //RS =0 命令,合起来表示读命令(状态)
lcd_EN = 1; //EN=1,打开EN,LCD1602开始输出命令数据,100nS 之后命令数据有效
tmp_sts = lcd_data; //读取命令到tmp_sts
lcd_EN = 0; //关掉LCD1602
lcd_RW = 0; //把LCD1602设置成写
return tmp_sts; //函数返回值tmp_sts
}
void lcd_wr_com(uchar command ) /*写一个命令到LCD1602*/
{
while(0x80&lcd_rd_status()); //写之前先判断LCD1602是否忙,看读出的命令的最高位是否为1,为1表示忙,继续读,直到不忙
lcd_RW = 0;
lcd_RS = 0; //RW=0,RS=0 写命令
lcd_data = command; //把需要写的命令写到数据线上
lcd_EN = 1;
lcd_EN = 0; //EN输出高电平脉冲,命令写入
}
void lcd_wr_data(uchar wdata ) /*写一个显示数据到lcd1602*/
{
while(0x80&lcd_rd_status()); //写之前先判断lcd1602是否忙,看读出的命令的最高位是否为1,为1表示忙,继续读,直到不忙
lcd_RW = 0;
lcd_RS = 1; //RW=0,RS=1 写显示数据
lcd_data = wdata ; //把需要写的显示数据写到数据线上
lcd_EN = 1;
lcd_EN = 0; //EN输出高电平脉冲,命令写入
lcd_RS = 0;