确定矩阵式键盘上何键被按下,介绍一种 “行扫描法”。
行扫描法 行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法 .
判断键盘中有无键按下: 将全部行线置低 电平 ,然后检测列线的状态。只要有一列的 电平 为低,则表示键盘中有键被按下,而且闭合的键位于低 电平 线与 4根行线相交叉的4个按键之中。若所有列线均为高 电平 ,则键盘中无键按下。
判断闭合键所在的位置: 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低 电平 ,即在置某根行线为低 电平 时,其它线为高 电平 。在确定某根行线位置为低 电平 后,再逐行检测各列线的 电平 状态。若某列为低,则该列线与置为低 电平 的行线交叉处的按键就是闭合的按键。
org 0000h
ajmp main
org 0030h
main:
mov dptr,#tab ;将表头放入dptr
lcall key ;调用键盘扫描程序
movc a,@a+dptr ;查表后将键值送入aCC
mov p0,a ;将acc值送入p0口
clr p2.1 ;开显示
ljmp main ;返回反复循环显示
key: lcall ks ;调用检测按键子程序
jnz k1 ;有键按下继续
lcall delay2 ;无键按调用延时去抖
ajmp key ;返回继续检测按键
k1: lcall delay2
lcall delay2 ;有键按下延时去抖动
lcall ks ;再调用检测按键程序
jnz k2 ;确认有按下进行下一步
ajmp key ;无键按下返回继续检测
k2: mov r2,#0efh ;将扫描值送入 r2暂存
mov r4,#00h ;将第一列值送入r4暂存
k3: mov p1,r2 ;将r2的值送入p1口
l6: jb p1.0,l1 ;p1.0等于1跳转到l1
mov a,#00h ;将第一行值送入acc
ajmp lk ;跳转到键值处理程序
l1: jb p1.1,l2 ;p1.1等于1跳转到l2
mov a,#04h ;将第二行的行值送入acc
ajmp lk ;跳转到键值理程序进行键值处理
l2: jb p1.2,l3 ;p1.2等于1跳转到l3
mov a,#08h ;将第三行的行值送入acc
ajmp lk ;跳转到键值处理程序
l3: jb p1.3,next ;p1.3等于1跳转到next处
mov a,#0ch ;将第四行的行值送入acc
lk: add a,r4 ;行值与列值相加后的键值送入a
push acc ;将a中的值送入堆栈暂存
k4: lcall delay2 ;调用延时去抖动程序
lcall ks ;调用按键检测程序
jnz k4 ;按键没有松开继续返回检测
pop acc ;将堆栈的值送入acc
ret
next:
inc r4 ;将列值加一
本文关键字:键盘 51单片机,单片机-工控设备 - 51单片机
上一篇:定时计数2