确定矩阵式键盘上何键被按下,介绍一种“行扫描法”。
行扫描法 行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法.
判断键盘中有无键按下: 将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与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 ;将列值加一 mov a,r2 ;将r2的值送入a jnb acc.7,key ;扫描完至key处进行下一扫描 rl a ;扫描未完将a中的值右移一位进行下一列的扫描 mov r2,a ;将acc的值送入r2暂存 ajmp k3 ;跳转到k3继续 ks: mov p1,#0fh ;将p1口高四位置0低四位值1 mov a,p1 ;读p1口 xrl a,#0fh ;将a中的值与a中的值相异或 ret ;子程序返回 delay2: ;40ms延时去抖动子程序 mov r5,#08h l7: mov r6,#0fah l8: djnz r6,l8 djnz r5,l7 ret tab: db 28h,34h,28h,34h,0a9h,60h,20h,7ah, 20h,21h,61h,74h,30h,62h,0a2h,7eh ;0h0hc9878654a321 轮流显示键盘因为无法表达*# 就用h表示,b用8表示 end