2×2矩阵式键盘
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2×2矩阵式键盘
摘要:本设计主要是用来学习键盘扫描程序的设计,数码管的动态显示程序设计。设计中,将单片机8051的并行口P1的P1.0,P1.1接键盘的行,将P1.2,P1.3接键盘的列,将并行口P2的P2.7~P2.0分别接数码管的数据段g,f,a,b,d,h,e,c. 以及将P3.6,P3.7分别接数码管的偏选端,当按下第0行0列时数码管就显示00,按下第0行1列时数码管就显示01,第1行0列时数码管就显示02,第1行1列时数码管就显示03。本设计一共四个按键,用双数码管动态显示。
关键字:单片机,数码管动态显示,行列式键盘,共阴数码管
一、矩阵式键盘工作原理
如下图1,I/O接口线组成行、列结构,按键设置在行、列的交点上。行线通过上拉电阻接+5V。
第一步是CPU检测键盘上是否有按键。具体过程如下:P1.2, P1.3输出0,即将列P1.2, P1.3置成低电平,然后将行线P1.0,P1.1电平状态读入累加器A中。如果有键按下,总有一根行线电平被拉至低电平,从而使行输入状态不全为“1”。
第二步是识别是哪一个键按下。具体过程如下:先将P1.2输出为0,即将列P1.2置成低电平。然后读入行线P1.0,P1.1电平状态,如果全为“1”,则按下的键不在此列;如果不全为“1”,则按下的键必在此列;而且是该列与“0”电平线相交的交点上的那个键。再将P1.3输出为0,即将列P1.3置成低电平。做法如上。
二、数码管动态显示原理
A.数码管原理:在单片机应用系统中,经常用到LED数码管作为显示输出设备。LED数码管虽然显示信息简单,但它具有显示清晰、亮度高、使用电压低、寿命长、与单片机接口方便等特点,所以在应用中经常使用它。
LED数码管显示器是由发光二极管按一定的结构组合起来的显示器件。在单片机应用系统中通常使用的是8段式LED数码管显示器,他有公阳极和共阴极两种。如图1—1所示。其中共阳极8段发光二极管的阳极端连接在一起,阴极端分开控制,使用时公共端接电源,要使哪根数码管亮,则对应的阴极接低电平。而共阴极8段发光二极管的阴极端连接在一,阳极端分开控制,使用时公共端接地,要使哪根数码管亮,则对应的阳极接高电平即可。从a~g引脚输入不同的8位二进制编码,可显示不同的数字或字符。h为小数点位。
图1—1
在此我们着重介绍下本次实验中用到的共阴极结构的数码管。在共阴极结构中,各段发光二极管的阴极连在一起,将此公共点接地,某一段发光二极管的阴极为高电平时,该段发光。共阴极字段码:LED显示0~9某个字符时,则要求在a~dp送固定的字段码,如要使LED 显示“0”,则要求a、b、c、d、f各引脚为高电平,g和dp为低电平,字段码为“3fh” 。dp g f e d c b a对应为0 0 1 1 1 1 1 1 。共阴极字符0~9七段码如下:
字符:0 1 2 3 4 5 6 7 8 9
字段码:3fh 06h 5bh 4fh 66h 6dh 7dh 07h 7fh 6fh
B.LED的动态显示方式
LED动态显示是将所有的数码管的段选线并接在一起,用一个I/O接口控制,公共端不是直接接地(共阴极)或电源(用阳极),而是通过相应的I/O接口控制。它是循环依次使每个LED的公共端接地(共阴极)或电源(用阳极),每次接通的时间为几毫秒的时间,一次循环完毕后,下一次循环又这样的开始依次进行,从计算机的角度看是一个一个的显示,但由于人的视觉暂留效应,只要循环周期足够快,看起来所有的数码管都是一起显示的了,这就是动态显示原理。
三、系统设计部分
如图1-0所示,此按键设计是以单片机8051为核心,以按键和数码管为扩展,实现键盘识别和动态显示的功能。
图1-0
3.2总体设计方案
3.2.1 设计思路
将单片机8051的并行口P1的P1.0,P1.1接键盘的行,将P1.2,P1.3接键盘的列,将并行口P2的P2.7~P2.0分别接数码管的数据段g,f,a,b,d,h,e,c. 以及将P3.6,P3.7分别接数码管的偏选端,当按下第0行0列时数码管就显示00,按下第0行1列时数码管就显示01,第1行0列时数码管就显示02,第1行1列时数码管就显示03。
3.2.2 方案论证与选择
方案一:将单片机8051的并行口P1的P1.0,P1.1接键盘的行,将P1.2,P1.3接键盘的列,将并行口P2的P2.7~P2.0分别接数码管的数据段g,f,a,b,d,h,e,c. 以及将P3.6,P3.7分别接数码管的偏选端。
方案二:将单片机8051的并行口P0的P00,P01接键盘的行,将P0.2,P0.3接键盘的列,将并行口P2的P2.7~P2.0分别接数码管的数据段g,f,a,b,d,h,e,c. 以及将P3.6,P3.7分别接数码管的偏选端。
点评:由于在方案二中,P0口内部没有上拉电阻,如用此方案,就要比方案一多接几个上拉电阻,在键盘多的时候很容易弄错,所以在这里我们选择方案一。
四. 单元电路设计部分
4.1 数码管显示电路的设计
这里是将单片机8051的并行口P2的P2.7~P2.0分别接数码管的数据段g,f,a,b,d,h,e,c. 以及将P3.6,P3.7分别接数码管的偏选端,如图1-1。
图1-1
4.2 矩阵式键盘的设计
将单片机8051的并行口P1的P1.0,P1.1接键盘的行,将P1.2,P1.3接键盘的列。如图1-2。
五. 软件设计
N N
Y Y
N N
Y Y
六. 动态显示及键盘扫描程序
#include
unsigned char code table[]={0x3f,0x06,0x5b,0x4f}; unsigned char temp;
unsigned char key1,key2;
unsigned char i,j;
void delay1() //延迟函数1
{
for(i=0;i<50;i++)
{ for(j=0;j<50;j++);
}
}
void delay2() //延迟函数2
{ for(i=0;i<50;i++)
{ for(j=0;j<200;j++);
}
}
void main(void) //主函数
{
while(1)
{
P1=0x03; //置行P1.0,P1.1为1,列P1.2,P1.3为0 temp=P1; //检测P1口
temp=temp&0x0f; //检测列p1.2, p1.3是否有按键
while(temp!=0x03)
{
delay2();
temp=P1; //再次检测是否有按键
temp=temp&0x03;
while(temp!=0x03)
{