矩阵键盘的驱动(汇编版)

来源:互联网 发布:拍视频特效软件 编辑:程序博客网 时间:2024/04/28 08:23

写大作业时还用到了矩阵键盘。以前都是直接拿别人的驱动用,这次自己写了一个

识别矩阵键盘的按下的按键主要有两种方法,一种是行扫描法:即逐行、逐个判断按键是否被按下,由于过程较长所以没选用这种方法

另外一种是所谓的高低电平翻转法,具体过程如下:

首先让P1口高四位为1,低四位为0,。若有按键按下,则高四位中会有一个1翻转为0,低四位不会变,此时即可确定被按下的键的行位置。
然后让P1口高四位为0,低四位为1,。若有按键按下,则低四位中会有一个1翻转为0,高四位不会变,此时即可确定被按下的键的列位置。
最后将上述两者进行或运算即可确定被按下的键的位置。
结合单片机上的引脚描述,可用用查询方式读取按键值


尝试性写出如下程序

MOV R6,#0MOV P2,#0F0H;翻转法判断按键所在的行与列MOV R6,P2MOV P2,#00FHMOV A,P2ORL A,R6

却发现无法判断列所在位置。debug发现是第二次给P2赋值无效。重新看按键原理图发现按键在列方向上没有上拉电阻,所以在开漏情况下电平无法拉高。

于是改为赋值前先设置成推挽输出,读取时设置为开漏模式。问题解决

完整驱动如下




<span style="font-size:10px;">;############矩阵键盘驱动###############接口:R6KEYS:PUSH ACCMOV R6,#0MOV P2MDOUT,#0FFh;设置为推挽方便输出MOV P2,#0F0H;翻转法判断按键所在的行与列MOV  P2MDOUT,#000h;设置为开漏以输入MOV R6,P2MOV  P2MDOUT,#0FFhMOV P2,#00FHMOV  P2MDOUT,#000hMOV A,P2ORL A,R6CJNE A,#0EEH,BUT0MOV R6,#0LJMP OVERBUT0:CJNE A,#0EDH,BUT1;将键值转化为相应的输入值MOV R6,#1LJMP OVERBUT1:CJNE A,#0EBH,BUT2MOV R6,#2LJMP OVERBUT2:CJNE A,#0E7H,BUT3MOV R6,#3LJMP OVERBUT3:CJNE A,#0DEH,BUT4MOV R6,#4LJMP OVERBUT4:CJNE A,#0DDH,BUT5MOV R6,#5LJMP OVERBUT5:CJNE A,#0DBH,BUT6MOV R6,#6LJMP OVERBUT6:CJNE A,#0D7H,BUT7MOV R6,#7LJMP OVERBUT7:       CJNE A,#0BEH,BUT8MOV R6,#8LJMP OVERBUT8:CJNE A,#0BDH,BUT9MOV R6,#9LJMP OVERBUT9:CJNE A,#0BBH,BUT10MOV R6,#10LJMP OVERBUT10:CJNE A,#0B7H,BUT11MOV R6,#11LJMP OVERBUT11:CJNE A,#07EH,BUT12MOV R6,#12LJMP OVERBUT12:CJNE A,#07DH,BUT13MOV R6,#13LJMP OVERBUT13:CJNE A,#07BH,BUT14MOV R6,#14LJMP OVERBUT14:CJNE A,#077H,BUT15MOV R6,#15LJMP OVERBUT15:MOV R6,#0FFHOVER:POP ACCRET</span>
实际使用时必须经过按键消抖(查询过程增加延时)和按起判断。程序大致如下
<span style="font-size:10px;">K:<span style="white-space:pre"></span>LCALL<span style="white-space:pre"></span>KEYS<span style="white-space:pre"></span>;查询方式检测按键<span style="white-space:pre"></span>CJNE R6,#0FFH,NEXT<span style="white-space:pre"></span>;没有按键按下</span>
<span style="font-size:10px;"><span style="white-space:pre"></span>SJMP K</span>
<span style="font-size:10px;"><span style="white-space:pre"></span>LCALL DELAY</span>
<span style="font-size:10px;"><span style="white-space:pre"></span>(对于按键的操作)</span>
<span style="font-size:10px;">PRE:<span style="white-space:pre"></span>LCALL KEYS;判断按键是否按起CJNE R6,#0FFH,PRE</span>

经检验完美运行

参考资料:百度百科“矩阵键盘”

0 0
原创粉丝点击