实验五阵列式键盘实验指导书
- 格式:doc
- 大小:46.50 KB
- 文档页数:5
实验五阵列式键盘驱动实验
一、实验目的
掌握用扫描法驱动键盘
二、实验原理
对于一些比较复杂的系统和按键较多的场合,一般采用矩阵式键盘,矩阵式键盘有很多种,下面以应用最广泛的4x4矩阵式键盘为例来介绍
4x4键盘的结构如下图所示
Y0 Y1 Y2 Y3
X0
X1
X2
X3
扫描法是在程序中反复扫描键盘接口,根据端口的输入情况调用不同的按键处理子程序,单片机不能再次相应按键请求。
扫描法的步骤:
(1)、先令列线Y0为低电平0,其余三根列线均为高电平,此时读取行线的状态,如果行线(X0~X3)均为高电平,则Y0这一列上没有按键按下,如果行线(X0~X3)不全为高电平,则其中为低电平的行线与Y0相交的按键按下。这样按照同样的方法依次检查到Y1、Y2和Y3有没有按键按下。
(2)、按键软件消抖,当判断有按键按下之后,程序中延迟10ms左右的时间后,再次判断一下按键的状态,如果按键仍然处于按键按下的状态,即行线不全为1,则可以肯定按键按下,否则当做按键的抖动来处理。
(3)、根据Y0~Y3中低电平的位置Y以及X0~X3中低电平的位置X就可以找到按键按下的位置,进而对按键进行编码。
三、实验内容
设计阵列式键盘驱动程序,使用静态串行显示模块显示键值。
四、实验步骤
1、单片机最小应用系统1的P2口接阵列式键盘的A1-A4口,P3.6接静态数码显示DIN,P3.7接CLK。
2、用串行数据通信线连接计算机与仿真器,把仿真器插到模块的锁紧插座中,请注意仿真器的方向:缺口朝上。
3、打开Keil uVision2仿真软件,首先建立本实验的项目文件,接着添加阵列KEY.C源程序,进行编译,直到编译无误。
4、进行软件设置,选择硬件仿真,选择串行口,设置波特率为38400。在键盘上按下某个键,观察数显是否与按键值一致。16位键盘的键值从左至右、从上至下依次为0-F(16进制数)。
阵列式键盘驱动参考程序:
ORG 0000H
LJMP START
ORG 0030H
START: MOV R0,#4
MOV R1,#0FEH
MOV P1,#0FH
MOV P0,#01H
MOV R2,#00H
START1: MOV P1,R1
LOOP: MOV A,P1
ANL A,#0F0H
CJNE A,#0F0H,KEY
AJMP BACK
KEY: MOV A,P1
ANL A,#0F0H
CJNE A,#0F0H,KEY1
AJMP BACK
KEY1: MOV B,P1
MOV R3,#00H
MOV DPTR,#KEYTAB
LOOP1: MOV A,R3
MOVC A,@A+DPTR
INC R3
CJNE A,B,LOOP1
DEC R3
MOV A,R3
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P2,A
BACK: MOV A,R1
RL A
MOV R1,A
DJNZ R0,START1
LJMP START
TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,0B9H,5EH,0F9H,71H KEYTAB:DB
0EEH,0DEH,0BEH,7EH,0EDH,0DDH,0BDH,07DH,0EBH,0DBH,0BBH,7BH,0E7H,0D7H,0 B7H,77H
END
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D //0,1,2,3,4,5 ,0x7D,0x07,0x7F,0x6F,0x77,0x7C //6,7,8,9,A,b
,0x58,0x5E,0x7B,0x71 //c、d、e、f、全暗
uchar num,temp;
void delay(uint z) //延时子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar keyscan() //键盘扫描程序,返回uchar型参数{
uchar i;
for(i=0;i<4;i++)
{
P2=_crol_(0xfe,i);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5); //延时消抖
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xee:num=1;break;
case 0xde:num=2;break;
case 0xbe:num=3;break;
case 0x7e:num=4;break;
case 0xed:num=5;break;
case 0xdd:num=6;break;
case 0xbd:num=7;break;
case 0x7d:num=8; break;
case 0xeb:num=9;break;
case 0xdb:num=10;break;
case 0xbb:num=11;break;
case 0x7b:num=12;break;
case 0xe7:num=13;break;
case 0xd7:num=14;break;
case 0xb7:num=15;break;
case 0x77:num=16;break;
}
while(temp!=0xf0) //等待按键释放