目的:利用“模块化单片机教学实验平台”,加深对单片机与矩阵键盘的接口电路设计以及程序设计的理解。
任务:1、学习独立式按键的查询识别方法。
2、非编码矩阵键盘的行反转法识别方法。
3、掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。
4、掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。
5、掌握利用Keil51软件对程序进行编译。
6、会根据实际功能,正确选择单片机功能接线,编制正确程序。对实验结果
1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。
2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。
3、识别键的闭合,通常采用行扫描法和行反转法。行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。
行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。
行反转法识别按键的过程是:首先,将4个行线作为输出,将其全部置0,4个列线作为输入,将其全部置1,也就是向P1口写入0xF0;假如此时没有人按键,从P1口读出的值应仍为0xF0;假如此时1、4、7、0四个键中有一个键被按下,则P1.6被拉低,从P1口读出的值为0xB0;为了确定是这四个键中哪一个被按下,可将刚才从P1口读出的数的低四位置1后再写入P1口,即将0xBF写入P1口,使P1.6为低,其余均为高,若此时被按下的键是“4”,则P1.1被拉低,从P1口读出的值为0xBE;这样,当只有一个键被按下时,每一个键只有唯一的反转码,事先为12个键的反转码建一个表,通过查表就可知道是哪个键被按下了。
使用扫描法通过矩阵键盘(2行4列,一共八个按键)控制8个LED灯的点亮。按下第一行第一列的按键使LED1点亮,其他LED熄灭;按下第一行第二列的按键使LED2点亮,其他LED熄灭;按下第一行第三列的按键使LED3点亮,其他LED熄灭;按下第一行第四列的按键使LED4点亮,其他LED熄灭;按下第二行第一列的按键使LED5点亮,其他LED熄灭;按下第二行第二列的按键使LED6点亮,其他LED熄灭;按下第二行第三列的按键使LED7点亮,其他LED熄灭;按下第二行第四列的按键使LED8点亮,其他LED熄灭。
图1 LED电路图
图2 按键电路图
注:把拨码开关(DIP)拨到断开的一侧。该矩阵键盘只用到前两行,即2*4的矩阵键盘。
表1 硬件连线表
CPU_CORE_51 |
MAIN_BOARD |
P2:P1.0-P1.7 |
J14:LINE0-COLUM3 |
P3:P2.0-P2.7 |
J48:LED1-LED8 |
注意:实验箱的AT89S52单片机的晶振频率为11.0592MHz!
①关掉实验电源。将CPU 板插接在JK1、JK2 上,注意CPU 板的插接方向。按照前面连接关系表将硬件连接好。
②将AT89S52 芯片插在CPU 板的CPU 插座上(注意不要插反)。母板上电。
③运行Keil 开发环境,按照“模块化单片机教学实验平台配套的实验指导书1.2.3 节”介绍的方法建立工程exp11.uV2,CPU 为AT89S52,不包含启动文件STARTUP.A51。
④编写汇编语言源程序exp11.asm 完成基本实验的功能。把源程序exp11.asm加入到工程exp11.uV2,并设置工程exp11.uV2 属性,将其晶振频率设置为11.0592MHz,选择输出可执行文件。
⑤构造(Build)工程exp11.uV2。
⑥通过PROGISP 烧写软件,利用ISP 下载线(见“模块化单片机教学实验平台配套的实验指导书1.3 节”)把HEX 文件下载到单片机中。
⑦下载成功后,通过按下不同按键,观察LED1~7 的亮灭。
图3 实验结果图
本次实验需要先判别整个键盘有无按键按下,从第0列开始逐列检测检测,可以检测出哪个按键被按下。然后用到去除按键的抖动。该实验难度较高,相比以往实验更考验综合能力。如何使用扫线法判断所在行是实验的难点所在。实验中因为对扫线法的理解不深入,在实验中没能完成实验。试验后仔细阅读书上的解释和题本提供的案例程序,我知道了自己实验失败的原因所在,并重新设计了程序和实验。通过学习后,对扫描键盘的程序更加了解,将理论上的结果和自己实验做的结果相印证,对书本上知识掌握的更加牢固,对代码程序有更加深刻的理解。在实验中,对模板的使用更加熟练,对电路的连接更加熟练。我对于矩阵键盘的工作方式有了更进一步的认识,也对扫描法查询矩阵键号的方法编写有了更进一步的掌握。单片机提高重在实践,想要学好单片机,软件编程必不可少。
(1)基本实验
ORG 0000H
LJMP MAIN
MAIN:MOV P1,#11110000B;给p1口送数11110000
MOV A,P1 ;获取P1口的电平
XRL A,#11110000B
;将P1口电平与11110000异或运算
;若有按键按下,A不为0
JZ MAIN ;无按键按键则返回
LCALL TIME_ ;跳转到延时程序
MOV P1,#11110000B
MOV A,P1
XRL A,#11110000B ;该部分操作与上述操作相同
MOV R3,A ;保存此时A的值
JZ MAIN ;确认有按键按下
MOV R0,#11110111B;扫描法判断
MOV R1,#0 ;R1存储列的权值
I: MOV P1,R0 ;将R0值传递给P1
MOV A,P1 ;读取P1的值
AAA0:JNB ACC.4,AAA1
;如果ACC的第四位(即第一列)不为零
MOV R1,#0 ;r1存0
LJMP OK ;跳转到计算环节
AAA1: JNB ACC.5,AAA2 ;同上,判断第二列
MOV R1,#01
LJMP OK
AAA2:JNB ACC.6,AAA3 ;同上,判断第三列
MOV R1,#02
LJMP OK
AAA3: JNB ACC.7,AAA4 ;同上,判断第四列
MOV R1,#03
LJMP OK
AAA4:MOV A,R0
JNB ACC.2,MAIN ;判断是否结束
RR A ;环移
MOV R0,A
MOV A,R1
MOV R1,A
LJMP I
TIME_:MOV R0,#05
TT: MOV R1,#250
DJNZ R1,$
DJNZ R0,TT
RET
OK: ;判断所在行并送数
MOV A,R1
ADD A,R0
MOV R0,A
MOV A,#1
INC R0
AAA:CJNE R0,#0,BBB
RL A
INC A
LJMP AAA
BBB:MOV P2,A
LJMP MAIN
END
(2)扩展实验
ORG 0000H
LJMP MAIN
MAIN:MOV P1,#11110000B;送数11110000
MOV A,P1 ;取当前P1的值
XRL A,#11110000B;与11110000与或运算
JZ MAIN ;如果为0则跳转回
LCALL TIME_ ;延迟子系统
MOV P1,#11110000B
MOV A,P1
XRL A,#11110000B
JZ MAIN ;再次判断确定非误触
MOV R3,A ;存储当前A信息
MOV P1,#00001111B ;判断所在列
MOV A,P1
XRL A,#00001111B
MOV R4,A ;存至R4
MOV A,R3
JNB ACC.1,NEXT1
MOV R3,#4;若为第二行则若R3存4,否则存0
LJMP NEXT2
NEXT1: MOV R3,#0;判断行,依次为0,1,2,3
NEXT2:MOV A,R4
JNB ACC.4,NEXT3
MOV R4,#0
LJMP NEXT7
NEXT3:JNB ACC.5,NEXT4
MOV R4,#1
LJMP NEXT7
NEXT4:JNB ACC.6,NEXT5
MOV R4,#2
LJMP NEXT7
NEXT5:MOV R4,#3
NEXT7:MOV A,R3
ADD A,R4 ;将两个权值相加
MOV P2,A ;送至P2
LJMP MAIN
TIME_:MOV R0,#05
TT: MOV R1,#250
DJNZ R1,$
DJNZ R0,TT
RET
END