打印

一个矩阵键盘的扫描程序,ASM.

[复制链接]
2279|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Batistuta_|  楼主 | 2009-2-21 21:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
;*************************************************************************************************************;
;(+)功能:获得按下的键值(含有两个组合键:K17&K18,K19&K20)
;出口:A(键码) C(键值是否有效识别位:= 1 键值有效,=0 无效.)
;用到资源:R2\3\4\5 B ACC C        c
;-------------------------------------------------------------------------------------------------------------;
;说明:     1. 键盘采用4*5矩阵键盘,含有两个组合键.
;    2. 硬件连接比较混乱,且各个按键的排列与面贴上的键码对应混乱.如果采用教科书上常规矩阵键盘的
;       扫描方式实现比较繁琐.
;    3. 需要识别两个双键,但这两个双键位置比较特殊K17,K18和K19,K20.
;    4. 基于2,3两点.这里采用列,行分别输出全零,读取行,列的引脚电平信息.综合这两组信息查表获取键值.
;       对于单键按下,有两个位为0.对于两个按键按下,有3或4个位为0.
;-------------------------------------------------------------------------------------------------------------;
;        p2.0 p2.1 p2.2 p2.3 p2.4
;          |    |    |    |    |               按键对应键码对照
; p2.5 ---k1---k5---k9---k13--k17    SK键盘: k1-'7';  k2-'8';  k3-'9';  k4-'G' 
;          |    |    |    |    |                 k5-'4';  k6-'5';  k7-'6';  k8-'B'
; p2.6 ---k2---k6---k10--k14--k18                k9-'1';  k10-'2'; k11-'3'; k12-'N'
;          |    |    |    |    |                 k13-'0'; k14-'E'; k15-'I'; k16-'L'
; p2.7 ---k3---k7---k11--k15--k19    SP键盘: k17-'+'; k18-'-'; k19-'U'; k20-'D'
;          |    |    |    |    |
; p1.0 ---k4---k8---k12--k16--k20    组合(SP): k17&k18-'T';  k19&k20-'H'
;-------------------------------------------------------------------------------------------------------------;
get_keybd_3_code:

        mov    P2,    #1FH            ; 行引脚输出0,读取列引脚电平
        clr    P1.0
        nop
        mov    a,    P2
        anl    a,    #1FH
        mov    r2,    a
        
        mov    P2,    #0E0H            ; 列引脚输出为0,读取行引脚电平
        setb    P1.0
        mov    a,    P2
        anl    a,    #0E0H
        orl    a,    r2
        mov    r5,    a
        clr    a
        mov     c,      P1.0
        mov    ACC.0,    c
        mov    r4,    a            ; 两组引脚电平信息保存在R4R5
        
        mov    a,    r5            ;
        mov    r3,    #8
        mov    r2,    #0
        jb    P1.0,    get_keybd_3_code_1
        mov    r2,    #1
get_keybd_3_code_1:        
        rlc    a
        jc    get_keybd_3_code_2
        inc    r2                         ; 本位为0,计数器加一
get_keybd_3_code_2:
        djnz    r3,    get_keybd_3_code_1
        
        cjne    r2, #4,    $+3            ;这里所有可能情况下的取值为2-9,其中有效为2,3
        jnc    get_keybd_3_code_err
        
        mov    dptr,    #keycode_table        
        mov    r2,    #22                 ;共22个键码
get_keybd_3_code_3:        
        clr    a
        movc    a,    @a+dptr
        mov    b,    r4
        cjne    a, b,    get_keybd_3_code_4    ;前一部分信息不同
        inc    dptr
        clr    a
        movc    a, @a+dptr
        mov    b,    r5
        cjne    a, b,    get_keybd_3_code_5    ;后一部分信息不同
        inc    dptr                            ; 找到按下按键对应的键码
        clr    a
        movc    a, @a+dptr                     ;取出键码
        setb    c
        sjmp    get_keybd_3_code_end
get_keybd_3_code_4:            
        inc    dptr
get_keybd_3_code_5:        
        inc     dptr
        inc    dptr
        djnz    r2,get_keybd_3_code_3
get_keybd_3_code_err:        
        clr    c                    
get_keybd_3_code_end:        
        ret
;-------------------------------------------------------------------------------------------------------------;
keycode_table:               ;76543210
        db    1H,    11011110B,    '7'
        db    1H,    10111110B,    '8'
        db    1H,    01111110B,    '9'
        db    0H,    11111110B,    'G'
        db    1H,    11011101B,    '4'
        db    1H,    10111101B,    '5'
        db    1H,    01111101B,    '6'
        db    0H,    11111101B,    'B'
        db    1H,    11011011B,    '1'
        db    1H,    10111011B,    '2'
        db    1H,    01111011B,    '3'
        db    0H,    11111011B,    'N'
        db    1H,    11010111B,    '0'
        db    1H,    10110111B,    'E'
        db    1H,    01110111B,    'I'
        db    0H,    11110111B,    'O'
        db    1H,    11001111B,    '+'
        db    1H,    10101111B,    '-'
        db    1H,    01101111B,    'U'
        db    0H,    11101111B,    'D'
        db    1H,    10001111B,    'T'
        db    0H,    01101111B,    'H'    
        

相关帖子

沙发
iC921| | 2009-2-22 02:00 | 只看该作者

不妨介绍一下特点有哪些

使用特权

评论回复
板凳
wb61850| | 2009-2-22 19:51 | 只看该作者

不错啊,哈哈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

777

帖子

0

粉丝