小型计算器
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP INTO
ORG 0030H
; AA EQU 70H
BB EQU 71H
CC EQU 72H
DD EQU 73H
MAIN:;MOV AA,#00H ;操作缓存区
MOV BB,#00H ;存放加数值
MOV CC,#00H ;存放减数值
MOV DD,#00H ;存放显示值
CLR 20H ;数字、功能键标志位
CLR 21H ;加减法标志位
MOV SP,#2FH
MOV DPTR,#TAB
SETB PX0 ;中断初始化
CLR IT0
SETB EX0
MOV A,#11000111B
MOV P0,A
SETB EA ;开中断
LOOP:MOV A,DD ;主程序显示
MOV B,#10
DIV AB
JZ LOOP1
MOVC A,@A+DPTR
SETB P3.5
CLR P3.4
MOV P1,A
ACALL DELAY
LOOP1:MOV A,B
MOVC A,@A+DPTR
SETB P3.4
CLR P3.5
MOV P1,A
ACALL DELAY
LJMP LOOP
INTO:PUSH PSW ;中断程序
PUSH ACC
PUSH DPL
PUSH DPH
SETB RS0
CLR RS1
ACALL DELAY
MOV A,P0
ANL A,#00000111B
XRL A,#00000111B
JZ EXIT
MOV R2,#11110111B ;扫描字
MOV R3,#00H ;R3存放行号
K0:MOV P0,R2
MOV A,P0
JB ACC.0,K1
MOV R4,#00H ;R4存放列号
LJMP SETNO
K1:JB ACC.1,K2
MOV R4,#01H
LJMP SETNO
K2:JB ACC.2,NEXT
MOV R4,#02H
SETNO:MOV DPTR,#PROM ;计算键号
MOV A,R3
MOV B,#3
MUL AB
ADD A,R4
;MOV AA,A
RL A
JMP @A+DPTR
NEXT:INC R3 ;下一行扫描
MOV A,R3
CLR C
SUBB A,#03H
JNC EXIT
MOV A,R2
RL A
MOV R2,A
LJMP K0
PROM:AJMP NO0 ;各键功能跳转
AJMP NO1
AJMP NO2
AJMP NO3
AJMP NO4
AJMP JIA
AJMP JIAN
AJMP EQUA
AJMP CLEAR
WAIT:MOV A,#11000111B ;等待键释放
MOV P0,A
MOV A,P0
ANL A,#00000111B
XRL A,#00000111B
JZ EXIT
AJMP WAIT
EXIT:POP DPH ;退出中断
POP DPL
POP ACC
POP PSW
RETI
NO0:JNB 20H,GO0 ;数字键0
CLR 20H
MOV DD,#00H
GO0:MOV A,DD
MOV B,#10
MUL AB
ADD A,#0
MOV AA,A
MOV DD,A
LJMP WAIT
NO1:JNB 20H,GO1
CLR 20H
MOV DD,#00H
GO1:MOV A,DD
MOV B,#10
MUL AB
ADD A,#1
MOV DD,A
LJMP WAIT
NO2:JNB 20H,GO2
CLR 20H
MOV DD,#00H
GO2:MOV A,DD
MOV B,#10
MUL AB
ADD A,#2
MOV DD,A
LJMP WAIT
NO3:JNB 20H,GO3
CLR 20H
MOV DD,#00H
GO3:MOV A,DD
MOV B,#10
MUL AB
ADD A,#3
MOV DD,A
LJMP WAIT
NO4:JNB 20H,GO4
CLR 20H
MOV DD,#00H
GO4:MOV A,DD
MOV B,#10
MUL AB
ADD A,#4
MOV DD,A
LJMP WAIT
JIA:SETB 20H
CLR 21H
MOV A,BB
ADD A,DD
MOV BB,A
LJMP WAIT
JIAN:SETB 20H
SETB 21H
MOV A,BB
ADD A,DD
MOV BB,A
LJMP WAIT
EQUA:SETB 20H
JBC 21H,XX
MOV A,BB
ADD A,DD
MOV BB,A
SJMP YY
XX:MOV A,CC
ADD A,DD
MOV CC,A
YY:CLR C
MOV A,BB
SUBB A,CC
MOV DD,A
MOV BB,#00H
MOV CC,#00H
LJMP WAIT
CLEAR:CLR C
CLR 20H
CLR 21H
;MOV AA,#00H
MOV BB,#00H
MOV CC,#00H
MOV DD,#00H
LJMP WAIT
DELAY:MOV R5,#99
DEL2:MOV R6,#50
DEL1:DJNZ R6,DEL1
DJNZ R5,DEL2
RET
TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END