;*************************************************************************************************************; ;(+)功能:获得按下的键值(含有两个组合键: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'
|