矩阵键盘的驱动(汇编版)
来源:互联网 发布:拍视频特效软件 编辑:程序博客网 时间: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
- 矩阵键盘的驱动(汇编版)
- 51 汇编编程:8255 驱动矩阵键盘和数码管
- s3c2410矩阵键盘驱动
- 矩阵键盘驱动原理
- 矩阵键盘驱动原理
- 矩阵键盘驱动
- C调用汇编语言的4*4矩阵键盘汇编源程序。
- LINUX驱动之矩阵键盘
- REAL6410 WINCE6 矩阵键盘驱动
- 单片机,矩阵键盘扫描驱动
- linux下矩阵键盘驱动
- 基于RFID无线射频的设备管理系统---矩阵键盘驱动(按键码)
- 51 单片机汇编语言--矩阵键盘的驱动
- 40 矩阵键盘在linux内核里的驱动实现
- 14 在H5上实现的矩阵键盘驱动
- OK6410矩阵键盘驱动问题(linux-2.6.36.2)
- 矩阵键盘的检测
- 矩阵键盘的检测
- 操作系统中先来先服务、短作业优先、最高相应比优先三个进程数组实现的算法
- voltDB性能
- 使用jquery操作iframe
- 类型的内存量
- NYOJ 题目88 汉诺塔(一)
- 矩阵键盘的驱动(汇编版)
- Spring配置文件所有类型的数据源dataSource
- 【Leetcode】Maximal Rectangle (DP)
- 运营商在C + +
- Ubuntu 12.04 LTS 网络配置要点
- Lua xml解析与更新的函数(二)
- C/C++常用时间函数介绍
- 数棋盘
- HDU1087 Super Jumping! Jumping! Jumping! 动态规划