按键及显示实验

  • 格式:doc
  • 大小:80.50 KB
  • 文档页数:8

下载文档原格式

  / 8
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;