KEY1: LCALL KS1;查有无键闭合 MOVA,R2;取出此次行扫描值 JNZ LK1;有键闭合转消颤 JⅠNBAC.7,LK8;若已扫过最后 LJMP LK8;无键闭合则退出 行就退出扫描,否则扫下一行。 LK1: LCALL DL6ms;消颤12ms RLA;Acc中的“0”左移一位 LCALL DL6mS MOVR2,A;新扫描值仍存进R2 LCALL KS1;再查有无键闭合NCR3;行号加1指向下一行 JNZ LK2;的确有,转处理 SJMP LK3;转LK3去扫描下一行 LJMP LK8;确实无,退出去LK4:MOwA,R3;此行有按键,取行号 LK2:MoVR3,#00H;(R3)←行号初值 ADDA,R3行号乘4 MOVR2,#OFEH;(R2)←行扫描初值 MOVR5,A得行首值 LK3: MOV DPTR#0101H;指向8155A口 ADDA,R5即:0,48,12. Mov A, R2 取行扫描值 MOVR5,A暂存进R5 MOVX,@DPTR,A;送到行线上去1 MOA,R4;列值只可能 INC DPTR #OF,#OE,#0D,#0B,#07H INC DPTR 指向8155C口1LK5:RRCA;取列值的最低位到y MoXA, @DPTR;读列线的电平 JNC LK6;Cy=0就找到了,即R5 ANLA,#0FH;保留C口低4位 INCR5;否则行值增1,即同 MOV R4, A 列值暂存进R4 行中的下一个键值 CJNE A,#OFH,LK4;列值≠全“1” SJMP LK5;再转LK5判C键值 表明此次送0的行有键按下,转LK4处理,LK6:PUSH05H;将找到的键值压栈 若=全1,表明此次送0的行无键按下 保存起来
KEY1:LCALL KS1 ;查有无键闭合 JNZ LK1 ;有键闭合转消颤 LJMP LK8 ;无键闭合则退出 LK1:LCALL DL6ms ;消颤12ms LCALL DL6ms LCALL KS1 ;再查有无键闭合 JNZ LK2 ;的确有,转处理 LJMP LK8 ;确实无,退出去 LK2:MOV R3,#00H ;(R3)←行号初值 MOV R2,#0FEH;(R2)←行扫描初值 LK3:MOV DPTR #0101H;指向8155 A口 MOV A, R2 ;取行扫描值 MOVX,@DPTR,A ;送到行线上去 INC DPTR INC DPTR ;指向8155 C口 MOVX A,@DPTR ;读列线的电平 ANL A,#0FH ;保留C口低4位 MOV R4,A ;列值暂存进R4 CJNE A,#0FH,LK4;列值≠全“1” 表明此次送0的行有键按下,转LK4处理, 若=全1,表明此次送0的行无键按下。 MOV A,R2 ;取出此次行扫描值 JNB ACC.7,LK8 ;若已扫过最后 一行就退出扫描,否则扫下一行。 RL A ;Acc中的“0”左移一位 MOV R2,A ;新扫描值仍存进R2 INC R3 ;行号加1指向下一行 SJMP LK3 ;转LK3去扫描下一行 LK4:MOV A, R3;此行有按键,取行号 ADD A, R3 ;行号乘 4 MOV R5, A ;得行首值 ADD A, R5 ;即:0,4,8,12… MOV R5, A ;暂存进 R5 MOV A, R4 ;列值只可能= #0F,#0E,#0D,#0B,#07H LK5: RRC A ;取列值的最低位到Cy JNC LK6 ;Cy=0就找到了,即R5 INC R5 ;否则行值增1,即同 行中的下一个键值 SJMP LK5 ;再转LK5判C键值 LK6: PUSH 05H ;将找到的键值压栈 保存起来
KEYI: LCALL KSI MOV A, R2 LK7: LCALL DL6ms;延6ms JNZ LKl JNB ACC. 7, LK8 LCALL KS1;键释放? LJMP LK8 RL A JⅠNZLK7;未释放,等 LK1: LCALL DLms MOV R2.A LCALL DL6ms;消颤 LCALL DLGmS INC R3 LCALL DL6mS LCALL KSI SJMP LK3 POP ACC;键值→A JNZ LK2 LK4: mOVA. R3 I RND RET LJMP LK8 Add A R3 LK2: moV R3, #OOH mov r5. a lK8: MOV a,#OFFH MoV R2. #OFEH add A R5 无键闭合标志→A LK3: MOV DPTR #0101H MOV R5. A RET Mov A, R2 MOv A. R4 M0wx,@DPTR,ALK5:RCA;取列值的最低位到Cy INC DPTR JNC LK6;Cy=0就找到了,即R5 INC DPTR INCR5;否则行值增1,即同 MOVX A, ODPTR 行中的下一个键值 ANL A,#OFH SJMP LK5;再转LK5判C键值 Mov R4, A 1LK6:PUSH05H;将找到的键值压栈 CJNE A, #OFH, LK4 保存起来
KEY1:LCALL KS1 JNZ LK1 LJMP LK8 LK1:LCALL DL6ms LCALL DL6ms LCALL KS1 JNZ LK2 LJMP LK8 LK2:MOV R3,#00H MOV R2,#0FEH LK3:MOV DPTR #0101H MOV A, R2 MOVX,@DPTR,A INC DPTR INC DPTR MOVX A,@DPTR ANL A,#0FH MOV R4,A CJNE A,#0FH,LK4 MOV A,R2 JNB ACC.7,LK8 RL A MOV R2,A INC R3 SJMP LK3 LK4:MOV A, R3 ADD A, R3 MOV R5, A ADD A, R5 MOV R5, A MOV A, R4 LK5: RRC A ;取列值的最低位到Cy JNC LK6 ;Cy=0就找到了,即R5 INC R5 ;否则行值增1,即同 行中的下一个键值 SJMP LK5 ;再转LK5判C键值 LK6: PUSH 05H ;将找到的键值压栈 保存起来。 LK7:LCALL DL6ms;延6ms LCALL KS1;键释放? JNZ LK7;未释放,等 LCALL DL6ms ;消颤 LCALL DL6ms POP ACC ;键值→A RND:RET LK8:MOV A,#0FFH ;无键闭合标志→A RET