;*************************************************************************************************************;<br />;(+)功能:获得按下的键值(含有两个组合键:K17&K18,K19&K20)<br />;出口:A(键码) C(键值是否有效识别位:= 1 键值有效,=0 无效.)<br />;用到资源:R2\3\4\5 B ACC C c<br />;-------------------------------------------------------------------------------------------------------------;<br />;说明: 1. 键盘采用4*5矩阵键盘,含有两个组合键.<br />; 2. 硬件连接比较混乱,且各个按键的排列与面贴上的键码对应混乱.如果采用教科书上常规矩阵键盘的<br />; 扫描方式实现比较繁琐.<br />; 3. 需要识别两个双键,但这两个双键位置比较特殊K17,K18和K19,K20.<br />; 4. 基于2,3两点.这里采用列,行分别输出全零,读取行,列的引脚电平信息.综合这两组信息查表获取键值.<br />; 对于单键按下,有两个位为0.对于两个按键按下,有3或4个位为0.<br />;-------------------------------------------------------------------------------------------------------------;<br />; p2.0 p2.1 p2.2 p2.3 p2.4<br />; | | | | | 按键对应键码对照<br />; p2.5 ---k1---k5---k9---k13--k17 SK键盘: k1-'7'; k2-'8'; k3-'9'; k4-'G' <br />; | | | | | k5-'4'; k6-'5'; k7-'6'; k8-'B'<br />; p2.6 ---k2---k6---k10--k14--k18 k9-'1'; k10-'2'; k11-'3'; k12-'N'<br />; | | | | | k13-'0'; k14-'E'; k15-'I'; k16-'L'<br />; p2.7 ---k3---k7---k11--k15--k19 SP键盘: k17-'+'; k18-'-'; k19-'U'; k20-'D'<br />; | | | | |<br />; p1.0 ---k4---k8---k12--k16--k20 组合(SP): k17&k18-'T'; k19&k20-'H'<br />;-------------------------------------------------------------------------------------------------------------;<br />get_keybd_3_code:<br /><br /> mov P2, #1FH ; 行引脚输出0,读取列引脚电平<br /> clr P1.0<br /> nop<br /> mov a, P2<br /> anl a, #1FH<br /> mov r2, a<br /> <br /> mov P2, #0E0H ; 列引脚输出为0,读取行引脚电平<br /> setb P1.0<br /> mov a, P2<br /> anl a, #0E0H<br /> orl a, r2<br /> mov r5, a<br /> clr a<br /> mov c, P1.0<br /> mov ACC.0, c<br /> mov r4, a ; 两组引脚电平信息保存在R4R5<br /> <br /> mov a, r5 ;<br /> mov r3, #8<br /> mov r2, #0<br /> jb P1.0, get_keybd_3_code_1<br /> mov r2, #1<br />get_keybd_3_code_1: <br /> rlc a<br /> jc get_keybd_3_code_2<br /> inc r2 ; 本位为0,计数器加一<br />get_keybd_3_code_2:<br /> djnz r3, get_keybd_3_code_1<br /> <br /> cjne r2, #4, $+3 ;这里所有可能情况下的取值为2-9,其中有效为2,3<br /> jnc get_keybd_3_code_err<br /> <br /> mov dptr, #keycode_table <br /> mov r2, #22 ;共22个键码<br />get_keybd_3_code_3: <br /> clr a<br /> movc a, @a+dptr<br /> mov b, r4<br /> cjne a, b, get_keybd_3_code_4 ;前一部分信息不同<br /> inc dptr<br /> clr a<br /> movc a, @a+dptr<br /> mov b, r5<br /> cjne a, b, get_keybd_3_code_5 ;后一部分信息不同<br /> inc dptr ; 找到按下按键对应的键码<br /> clr a<br /> movc a, @a+dptr ;取出键码<br /> setb c<br /> sjmp get_keybd_3_code_end<br />get_keybd_3_code_4: <br /> inc dptr<br />get_keybd_3_code_5: <br /> inc dptr<br /> inc dptr<br /> djnz r2,get_keybd_3_code_3<br />get_keybd_3_code_err: <br /> clr c <br />get_keybd_3_code_end: <br /> ret<br />;-------------------------------------------------------------------------------------------------------------;<br />keycode_table: ;76543210<br /> db 1H, 11011110B, '7'<br /> db 1H, 10111110B, '8'<br /> db 1H, 01111110B, '9'<br /> db 0H, 11111110B, 'G'<br /> db 1H, 11011101B, '4'<br /> db 1H, 10111101B, '5'<br /> db 1H, 01111101B, '6'<br /> db 0H, 11111101B, 'B'<br /> db 1H, 11011011B, '1'<br /> db 1H, 10111011B, '2'<br /> db 1H, 01111011B, '3'<br /> db 0H, 11111011B, 'N'<br /> db 1H, 11010111B, '0'<br /> db 1H, 10110111B, 'E'<br /> db 1H, 01110111B, 'I'<br /> db 0H, 11110111B, 'O'<br /> db 1H, 11001111B, '+'<br /> db 1H, 10101111B, '-'<br /> db 1H, 01101111B, 'U'<br /> db 0H, 11101111B, 'D'<br /> db 1H, 10001111B, 'T'<br /> db 0H, 01101111B, 'H' <br /> <br /> |
|