一、实验原理
矩阵键盘是使用8个IO口控制的16按键的控制读取的器件。具体原理如下图所示,当4号键被按下的时候,与此键连接的行线电平将由与此键连接的列线甲平决定,而行线电平在没有按下时为高电平。如果让所有的列线都处于高电平,那么天论是否按下键都不会影响行线的电平状态。所以,让所有的列线处于高电平是无法检测到按键的。反过来,如果让所有的列线都处于低电平,很明显按键后,所有的行线都变成低电平,能够判断出一定有键按下,但是不能确定到底是哪个键按下。所以,让所有的列线处于低电平是不合理的。为了进一步判断到底是哪列的键被按下,可以在某一时刻让一条列线处于低电平,其余的列线处于高电平。当第一列为低电平,其余列为高电平时,因为是4键按下,所以第一行仍为高电平;当第二列为低电平,其余列为高电平时,因为是4键按下,所以第一行仍为高电平。直到当第四列为低电平,其余列为高电平时,因为是4键按下,所以第一行将变为低电平,据此,确信第一行第四列交叉处的按键被按下。
根据以上分析,很容易得到键盘识别的方法,此方法分两步进行:第一步,识别有无键按下;第二步,如果有键按下,识别具体的键值。
识别键盘有无键按下的方法是:让所有列线都置零,检查行线有无变化,如果有变化贝说明有键按下,否则没有,这个过程中要注意软件去抖。
识别具体按键的方法是:逐列置低电平,其余列为高电平,检查各行线的电平变化,如果某行为低电平,可确定相应的此行此列交点的键被按下。
二、实验电路图
三、源代码
ORG 0000H
SETB P2.7
MOV A,#0DFH
MOV P0,A
CLR P2.7
MOV A,#000H
MOV P0,A
CHECK:
MOV P3,#00FH
MOV A,P3
CLR C
SUBB A,#00FH
JZ CHECK
LCALL DL
MOV P3,#00FH
MOV A,P3
CJNE A,#00FH,TTK
SJMP CHECK
TTK: MOV P3,#0F0H
MOV B,P3
ORL A,B
MOV R0,A
MOV R1,#000H
MOV DPTR,#KEYTAB
SEARCH:
MOV A,#0
MOVC A,@A+DPTR
CLR C
SUBB A,R0
INC DPTR
INC R1
JNZ SEARCH
DEC R1
MOV A,R1
MOV DPTR,#LEDTAB
MOVC A,@A+DPTR
SETB P2.6
MOV P0,A
CLR P2.6
AJMP DRIVER
DL: MOV R6,#50
DL1: MOV R5,#250
DL2: DJNZ R5,DL2
DJNZ R6,DL1
RET
ORG 1000H
KEYTAB:
DB 0EEH,0DEH,0BEH,07EH,0EDH,0DDH,0BDH,07DH,0EBH,0DBH,0BBH,07BH,0E7H,0D7H,0B7H,077H
LEDTAB:
DB 03FH,006H,05BH,04FH,066H,06DH,07DH,007H,07FH,06FH,077H,07CH,039H,05EH,079H,071H
END