矩阵按键可以说是51单片机一个比较典型的输入型的外设。它可以让人与单片机更好的进行交互。
这一小节打算写一个4X4的矩阵按键。至于2X8 , 3X4 ,3X3 这些类型的其实他们的原理都是一样的。可以仿4X4的来写。
矩阵按键扫描原理
这里使用的是8个IO口控制16个按键。
其实原理也很简单,就是对每一行一次进行扫描。比如在图中标号0处(第一行)给一个低电平,如果第一行有按键被按下,那么通过读取标号4、5、6、7处的电平就可以知道是第一行的哪一个按键被按下。其他行也是一样。
先对第一行进行扫描。
KEY_SCAN:
START:
MOV P1,#0FFH
//1、先扫描第一行
MOV R2,#0 ;用来记录行号(第0行)
MOV P1, #0FEH ;1111 1110 P1.0为低电平。
MOV A,P1 ;读取P1口的电平状态
ANL A,#0F0H ;通过逻辑与读取P1口的高四位的电平状态
CJNE A,#0F0H,ON /*判断读取的电平状态经过逻辑与后是否等于1111 0000,
如果等于1111 0000说明没有按键按下,反之有按键按下。
如果没有按键按下就继续扫描第二行。*/
对第二行的扫描
//2、扫描第二行
MOV R2,#1 ;记录行号
MOV P1, #0FDH ;1111 1101 P1.1为低电平
MOV A,P1
ANL A,#0F0H ;读取电平状态并进行逻辑与
CJNE A,#0F0H,ON
以此类推
对第三行和第四行的扫描
//3、扫描第三行
MOV R2,#2
MOV P1, #0FBH ;1111 1011
MOV A,P1
ANL A,#0F0H
CJNE A,#0F0H,ON
//4、扫描第四行
MOV R2,#3
MOV P1, #0F7H ;1111 0111
MOV A,P1
ANL A,#0F0H
CJNE A,#0F0H,ON
JMP CHU
值得注意的是这一句
CJNE A,#0F0H,ON
如果如果不等于1111 0000说明有按键按下,程序跳转到 ON处。
ON:
MOV R1,A ;将读取到的值存放在R1中待用。
在对第三行和第四行的扫描结束后如果都没有按键按下会到这一句: JMP CHU
CHU:
RET
直接结束扫描函数。
至此当有按键按下时我们会得到两个数据 行号、读取到(经过逻辑与后)的P1口数据分别放在R2,R1寄存器中。
现在我们要做的就是把这两个数据转换成0~F对应的要显示的数据。
CHANGE:
MOV A,R2 ;读取行号
MOV B,#4
MUL AB ;让A=行号*4=对应行的第一个按键所对应的显示值
;(因为这里是4X4矩阵键盘)
; 行号:0 乘后的结果:0
; 行号:1 乘后的结果:4
; 行号:2 乘后的结果:8
; 行号:3 乘后的结果:C
MOV R2,A ;将乘后的结果重新赋值给R2
MOV A,R1
SWAP A ;半字节就交换。
E0: CJNE A,#0EH,D0 ;如果半字节交换后等于 0000 1110说明是该行的第一
MOV R1,#0 ;个按键被按下,对R1赋值0 ,如果不等于则跳到下一个
D0: CJNE A,#0DH,B0
MOV R1,#1
B0: CJNE A,#0BH,LAST
MOV R1,#2
LAST: CJNE A,#07H,ER
MOV R1,#3
ER: MOV A,R2
ADD A,R1 ;最后将重新赋好的值相加就得到了对应的显示值。
MOV R0,A
把转换好的数据放在R0寄存器中。
然后就是显示的控制了
DISPLAY:
MOV DPTR ,#TAB
MOV A,R0
MOVC A,@A+DPTR ;变址寻址
MOV P2,A
CLR A
RET
;共阴数码管的编码 输入3FH时显示数字0,以此类推 ,分别显示0~F
TAB: DB 3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH,77H,7cH,39H,5eH,79H,71H
这里给一个完整的程序
ORG 0000H
LJMP MAIN
DISPLAY:
MOV DPTR ,#TAB
MOV A,R0
MOVC A,@A+DPTR
MOV P2,A
CLR A
RET
KEY_SCAN:
START:
MOV P1,#0FFH
//1、先扫描第一行
MOV R2,#0
MOV P1, #0FEH
MOV A,P1
ANL A,#0F0H
CJNE A,#0F0H,ON
//2、扫描第二行
MOV R2,#1
MOV P1, #0FDH
MOV A,P1
ANL A,#0F0H
CJNE A,#0F0H,ON
//3、扫描第三行
MOV R2,#2
MOV P1, #0FBH
MOV A,P1
ANL A,#0F0H
CJNE A,#0F0H,ON
//4、扫描第四行
MOV R2,#3
MOV P1, #0F7H
MOV A,P1
ANL A,#0F0H
CJNE A,#0F0H,ON
JMP CHU
ON:
MOV R1,A
CHANGE:
MOV A,R2
MOV B,#4
MUL AB
MOV R2,A
//E D B 7
MOV A,R1
SWAP A
E0: CJNE A,#0EH,D0
MOV R1,#0
D0: CJNE A,#0DH,B0
MOV R1,#1
B0: CJNE A,#0BH,LAST
MOV R1,#2
LAST: CJNE A,#07H,ER
MOV R1,#3
ER: MOV A,R2
ADD A,R1
MOV R0,A
CHU:
RET
MAIN:
F1: ACALL KEY_SCAN
ACALL DISPLAY
JMP F1
TAB: DB 3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH,77H,7cH,39H,5eH,79H,71H
END
仿真电路图:
矩阵键盘的程序+仿真 度盘自取
链接:https://pan.baidu.com/s/1jH5wYGY-kki2SB957ex29Q
提取码:sg6j
最后在给一个之前为期末准备的2*8矩阵键盘+IO口扩展+流水灯的实例。
度盘自取
链接:https://pan.baidu.com/s/1dQtBQqXKwYiBS8UReP6Pvg
提取码:3bjy
———————————————————-结束—————————————————————–
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38822.html