实验五阵列式键盘实验指导书

  • 格式:doc
  • 大小:46.50 KB
  • 文档页数:5

下载文档原格式

  / 5
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验五阵列式键盘驱动实验

一、实验目的

掌握用扫描法驱动键盘

二、实验原理

对于一些比较复杂的系统和按键较多的场合,一般采用矩阵式键盘,矩阵式键盘有很多种,下面以应用最广泛的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) //等待按键释放