POP A RET
;键已释放,键号出栈->A
NEXT: INC R4
MOV A,R2
;列计数器加1,为下一列扫描做准备
;判是否已扫到最后一列(最右一列) ;进行整个 ;键盘的扫描
;键扫描已到最后一列,跳KND重新
NB Acc.7,KND
RL A MOV R2,A AJMP LK4 KND: AJMP KEYI
;键扫描未扫到最后一列,位选码左 ;移一位
;位选码->R2
KS1: MOV DPTR ,#7F01H ;判有无键闭合子程序,全0->扫描(PA口)
MOV A,#00H MOVX @DPTR,A ; INC DPTR INC DPTR MOVX A,@DPTR CPL A
;从PC口读行线的状态
行线的状态取反,如无键按下,则A ;中内容为0
ANL A,#0FH RET
PID: MOV R5,3 1H ;取W
MOV R4,32H MOV R3,#00H MOV R2,2AH ACALL CPL1 ACALL DSUM MOV 39H,R7 MOV 3AH,R6 MOV R5,35H
MOV R4,36H MOV R0,#4 AH ACALL MULT1
45
;列线全为低电平 ;DPTR增2,指向PC 口
;屏蔽无用的高4位
:取Yi ;取Yi的补码 ;存ei
;计算ei=W-Yi
;取I
;R0放乘积高位字节地址指针
;计算Pi=I*ei
MOV R5,39H MOV R4,3AH MOV R3,3BH MOV R2,3CH ACALL CPL1 ACALL DSUB
:取ei ;取ei-1 ;求ei-1:的补码 ;求pp=△ei=ei-ei-1: MOV A,R7
MOV R5,A MOV A,R6 MOV R4,A MOV R3,4BH MOV R2,4AH ACALL DSUM MOV 4BH,R7 MOV 4AH,R6 MOV R5,39H MOV R4,3AH MOV R3,3DH MOV R2,3EH ACALL DSUM MOV A,R7 MOV R5,A MOV A,R6 MOV R4,A MOV R3, 3BH MOV R2,3CH ACALL CPL1 ACALL DSUM MOV A,R7 MOV R5,A MOV A,R6 MOV R4,A MOV R3,3BH
MOV R3,3CH ACALL CPL1 :存△ei
;取Pi ;求Pi+Pp ;存和(Pi+即) ;取ei ;取ei-2 :计算ei=ei-2
;取ei-1 :求ei-1,补码 ;计算ei=ei-2-ei-1 ;存和
;取ei-l
:求ej-1补码
46
ACALL DSUM MOV R5,37H MOV R4,38H MOV R0,#46H ACALL MULT1 MOV R5,47H MOV R4,46H ;计算ei=ei- 2-2e i-1、 ;取D
;求出Pd=D*(ei=ei-2-2ei-1)
:存Pd MOV R3,4BH MOV R2,4AH ,33H
,34H ,#46H ,47H ,46H ,2FH ,30H ,R7 ,R6 ,3BH ,3CH ,39H ,3AH DSUM: MOV A,R4
,R2 ,A ,R5 ,R3 ,A CPLI: MOV A,R2 ;取(pi+PP) ;计算pi+pp+pd
;取Kp
;计算Kp*(Pi+Pp+Pd)
;取ui-1
;求出ui=ui-l+KP*(Pi+Pp +pd)
;存ui~ui_, ;ei-l-ei-2
:ei-ei-1
47
ACALL DSUM MOV R5 MOV R4 MOV R0 ACALL MULTl MOV R3 MOV R2 MOV R5 MOV R4 ACALL DSUM MOV 30H MOV 3DH MOV 3EH MOV 3BH MOV 3CH RET
MOV 2FH ADD A MOV R6 MOV A ADDC A MOV R7 RET
CPL A
ADD A,#0lH MOV R2,A MOV A,R3 CPL A ADDC A,#00H MOV R3,A RET
MULTI: MOV A,R7 RLC A
MOV SIGN1,C JNC POS1 MOV A,R6 CPL A ADD A,#0lH MOV R6,A MOV A,R7 CPL A ADDC A,#00H MOV R7,A POSI: MOV A,R5 RLC A
MOV SIGN2,C MOV A,R4 CPL A ADD A,#0lH MOV R4,A MOV A,R5 CPL A
:存乘数符号位 ;乘数为正转
JNC POS2
;存被乘数符号位 ;被乘数为正转 ;求补
ADDC A,#00H MOV R5,A
POSZ: ACALL MUL1,
MOV C,SIGN1 ANL C,SIGN2 JC TPL
;C=1是两个负数相乘转
48
MOV C,SIGN1 ORL C,SIGN2 JNC TPL ;C=0是两个正数相乘转
DEC R0 DEC R0 DEC R0 MOV A,@R0 CPL A ADD A,#0lH MOV @R0,A INC R0 MOV A,@RO CPL A
ADDC A,#00H TPL: RET
MULT: MOV A,R6 MOV B,R4 MUL AB MOV @Ro,A MOV R3, B MOV A, R4
MOV B,R7 MUL AB ADD A,R3 MOV R3,A MOV A,B
ADDC A,#00H MOV R2, A MOV A,R6 RETMOV B,R5 MUL AB ADD A, R3 INC R0 MOV @R0,A
CLR 55BH
;取b
;取d ;求bd ;求bdL ;求bdL~R3
;取d ;取a ;求ad
;求adL+bdH
;暂存adL+bdH ;adH+进位 ;暂存 ;取b
;取c ;求bc
;求adL+bcL+bdH ;修改指针
;乘积第三字节存入
;清标志
49