NOP; NOP; CLR VSDA; NOP; CLR VSDA; NOP; NOP; NOP; NOP; CLR VSCL; RET;
STOP:CLR VSDA; SETB VSCL; NOP; NOP; NOP; NOP; SETB VSDA; NOP; NOP; NOP; NOP;
CLR VSDA; CLR VSCL; RET;
MACK: CLR VSDA;SETB VSCL; NOP; NOP; NOP; NOP;
CLR VSCL; SETB VSDA; RET;
MNACK:SETB VSDA;
40
SETB VSCL; NOP; NOP; NOP; NOP; CLR VSCL; CLR VSDA; RET;
CACK: SETB VSDA; SETB VSCL; CLR F0; MOV C,VSDA; JNC CEND; SETB F0; CEND:CLR VSCL; RET;
WRBYT: MOV R0,#08H;WLP: RLC A; JC WR1; AJMP WR0;
WLP1:DJNZ R0,WLP; RET;
WR1:SETB VSDA; SETB VSCL; NOP; NOP; NOP; NOP; CLR VSCL; CLR VSDA; AJMP WLP1; WR0:CLR VSDA; SETB VSCL; NOP; NOP;
41
NOP; NOP; CLR VSCL; AJMP WLP1;
RDBYT:MOV R0,#08H; RLP: SETB VSDA; SETB VSCL; MOV C,VSDA; MOV A,R2; RLC A; MOV R2,A; CLR VSCL; DJNZ R0,RLP; RET;
WRNBYT:MOV R3,NUMBYT;LCALL STA; MOV A,SLA; LCALL WRBYT; LCALL CACK; JB F0,WRNBYT; MOV R1,#MTD; WRDA:MOV A,@R1; LCALL WRBYT; LCALL CACK; JB F0,WRNBYT; INC R1; DJNZ R3,WRDA; LCALL STOP; RET;
RDNBYT:MOV R3,NUMBYT;LCALL STA; MOV A,SLA; LCALL WRBYT; LCALL CACK; JB F0,RDNBYT;
42
RDN:MOV R1,#MRD; RDN1:LCALL RDBYT; MOV @R1,A; DJNZ R3,ACK; LCALL MNACK; LCALLSTOP; RET;
ACK:LCALL MACK; INC R1; SJMP RDN1;
中断服务子程序:
X0S: MOV DPTR,#2000H MOVX @DPTR,A SETB TR0 MOV 3AH,#20H MOV 3BH,#00H MOV R7,#00H MOV R6,#04H CLR 70H
X0S0: CLR01H X0S1: JNB 01H,X0S1 CJNE R6,#00H,X0S0 CJNE R7,#00H,X0S0 CLR TR0 CLR EX0 SETB 00H RETI
键盘程序:
KEYI:ACALL KS1 JNZ LK1
NI: ACALL DIR
;调用判有无键闭合子程序 ;有键闭合,跳LK!
;无键闭合,调用显示子程序,延时
43
AJMP KEYI LK1: ACALL DIR ACALL DIR ACALL KS1 JNZ LK2 ACALL DIR
;调用判有无子程序 ;经去消抖,判断确实有键按下跳 ;抖动引起跳KEYI去处理 ;调用显示子程序延时6MS ;可能有键闭合,延时12MS软件区
AJMP KEYI
MOV A,R2 MOVX @DPTR,A INC DPTR
INC DPTR MOVX A,@DPTR
JB Acc.0,LONE MOV A,#00H AJMP LKP
LONE: JB Acc.1,LTOW
LTW0: JB Acc.2,LTHR
AJMP LKP
LTHR: JB Acc.3,NEXT
LKP: ADD A,R4 PUSH A
LK3: ACALL DIR
ACALL DIR JNZ LK3
;列选码—〉R2 ;R4 为列号计数器
;列选码—〉8155H
;数据指针增2,指向PC口
;读8155H的PC口 ;第0行线为高,无键闭合,跳LONE ;转判第1行
;第0行有键闭合,首键号—〉A ;跳LKP,计算键号
;1行线为高,无键闭合,跳LTW0 ;转判断第2行
;1行有键闭合,首键号8—〉A ;跳LKP ,计算键号
;2行线为高,无键闭合跳LTHR ;转判;第3行
;2行有键闭合,首键号10H—〉A ;跳LKP,计算键号
;3行线为高,无键闭合跳NEXT,;准备下一列的扫描
;3行有键按下,首键号18H—>A ;计算键号
;键号进栈保护
;调用显示子程序,延时6MS ;调用判有无键闭合子程序,延时6MS
;判键释放否,未释放,则循环
44
LK2: MOV R2,#0FEH MOV R4,#00H LK4: MOV DPTR,#7F01H
MOV A,#08H AJMP LKP
MOV A,#10H MOV A,#18H