您的位置:首页单片机51单片机
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

矩阵式键盘

[日期:2008-01-29 ] [来源:网络 作者:佚名] [字体: (投递新闻)

确定矩阵式键盘上何键被按下,介绍一种“行扫描法”。

行扫描法 行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法.

     判断键盘中有无键按下: 将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与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

阅读:
录入:JETTA

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
站长推荐