📄 addsub.asm
字号:
;按键模式控制,设置定时的时间,同时可做加减法运算
ORG 0000H
LJMP START
ORG 0003H
LJMP INTERRUPT0
ORG 000BH
LJMP TIMER0
ORG 0030H
START: ;INITIAL
MOV P1,#0FFH
MOV P3,#0FFH
MOV P2,#0FFH; 有硬件时必要
MOV DPTR,#TAB
MOV TMOD,#01H
MOV TL0,#0BH
MOV TH0,#3CH
SETB EA
SETB EX0
SETB IT0
SETB ET0
MAIN_LOOP:
LCALL SCAN_KEY ;
LCALL DISPLAY ;
LJMP MAIN_LOOP
;------------------------
EXIT10:
CLR 40H ;按键上一次弹起后,40H中清零
EXIT11:
LJMP EXIT1
SCAN_KEY:
MOV A,20H
JNZ EXIT11
MOV P2,#0FH
MOV A,P2
CLR C
SUBB A,#0FH
JZ EXIT10
JB 40H,EXIT11
SETB 40H
MOV P2,#0FEH
MOV A,P2
ANL A,#0F0H
CJNE A,#0E0H,L11
MOV 50H,#1
LS:
LJMP EXIT0
L11:
CJNE A,#0D0H,L12
MOV 50H,#2
LJMP EXIT0
L12:
CJNE A,#0B0H,L13
MOV 50H,#3
LJMP EXIT0
L13:
CJNE A,#070H,L2
MOV 50H,#4
LJMP EXIT0
L2:
MOV P2,#0FDH
MOV A,P2
ANL A,#0F0H
CJNE A,#0E0H,L21
MOV 50H,#5
LJMP EXIT0
L21:
CJNE A,#0D0H,L22
MOV 50H,#6
LJMP EXIT0
L22:
CJNE A,#0B0H,L23
MOV 50H,#7
LJMP EXIT0
L23:
CJNE A,#070H,L3
MOV 50H,#8
LJMP EXIT0
L3:
MOV P2,#0FBH
MOV A,P2
ANL A,#0F0H
CJNE A,#0E0H,L31
MOV 50H,#9
LJMP EXIT0
L31:
CJNE A,#0D0H,L32
;MOV 50H,#0AH +
LCALL ADDITION
LJMP EXIT1
L32:
CJNE A,#0B0H,L33
;MOV 50H,#0BH -
LCALL SUBTRATION
LJMP EXIT1
L33:
CJNE A,#070H,L4
;MOV 50H,#0CH =
LCALL OPERATION
LJMP EXIT1
l4:
MOV P2,#0F7H
MOV A,P2
ANL A,#0F0H
CJNE A,#0E0H,L41
;MOV 50H,#0DH CLR
LCALL CLEAR
LJMP EXIT1
L41:
CJNE A,#0D0H,L42
;MOV 50H,#0EH 清除
LCALL RIGHT
LJMP EXIT1
L42:
CJNE A,#0B0H,L43
MOV 50H,#0FH
LJMP EXIT0
L43:
CJNE A,#070H,EXIT0
MOV 50H,#0
LJMP EXIT0
EXIT0:
MOV 21H,#0 ;确定按中断开关可以计数
MOV A,22H
JNZ M1
MOV 33H,50H
INC 22H
LJMP EXIT1
M1:
MOV A,22H
CJNE A,#1,M2
MOV 32H,33H
MOV 33H,50H
INC 22H
LJMP EXIT1
M2:
MOV A,22H
CJNE A,#2,M3
MOV 31H,32H
MOV 32H,33H
MOV 33H,50H
INC 22H
LJMP EXIT1
M3:
MOV A,22H
CJNE A,#3,EXIT1
MOV 30H,31H
MOV 31H,32H
MOV 32H,33H
MOV 33H,50H
INC 22H
EXIT1:
RET
ADDITION:
MOV 40H,30H
MOV 41H,31H
MOV 42H,32H
MOV 43H,33H
MOV 44H,#0 ;确定为加法
MOV 30H,#0
MOV 31H,#0
MOV 32H,#0
MOV 33H,#0
MOV 22H,#0
RET
SUBTRATION:
MOV 40H,30H
MOV 41H,31H
MOV 42H,32H
MOV 43H,33H
MOV 44H,#1 ;确定为减法
MOV 30H,#0
MOV 31H,#0
MOV 32H,#0
MOV 33H,#0
MOV 22H,#0
RET
OPERATION: ;运算
MOV A,44H
JZ ADDI
;----------------------------
CLR C
MOV A,43H
SUBB A,33H
MOV B,33H
MOV 33H,A
JNC NEXT0
MOV 33H,B
MOV A,43H
ADD A,#10
CLR C
SUBB A,33H
MOV 33H,A
MOV A,42H
JZ NEXT01
DEC 42H
LJMP NEXT0
NEXT01:
MOV A,41H
JZ NEXT02
DEC 41H
MOV 42H,#9
LJMP NEXT0
NEXT02:
DEC 40H
MOV 41H,#9
MOV 42H,#9
NEXT0:
CLR C
MOV A,42H
SUBB A,32H
MOV B,32H
MOV 32H,A
JNC NEXT1
MOV 32H,B
MOV A,42H
ADD A,#10
CLR C
SUBB A,32H
MOV 32H,A
MOV A,41H
JZ NEXT11
DEC 41H
LJMP NEXT1
NEXT11:
DEC 40H
MOV 41H,#9
NEXT1:
CLR C
MOV A,41H
SUBB A,31H
MOV B,31H
MOV 31H,A
JNC NEXT2
MOV 31H,B
MOV A,41H
ADD A,#10
CLR C
SUBB A,31H
MOV 31H,A
DEC 40H
NEXT2:
CLR C
MOV A,40H
SUBB A,30H
MOV 30H,A
LJMP NEXT3
;----------------------------
ADDI:
CLR C
MOV A,40H
SWAP A
ORL A,41H
MOV 40H,A
MOV A,42H
SWAP A
ORL A,43H
MOV 41H,A
MOV A,30H
SWAP A
ORL A,31H
MOV 42H,A
MOV A,32H
SWAP A
ORL A,33H
MOV 43H,A
MOV A,41H
ADD A,43H
DA A
MOV 41H,A
MOV A,40H
ADDC A,42H
DA A
MOV 40H,A
ANL A,#0F0H
SWAP A
MOV 30H,A
MOV A,40H
ANL A,#0FH
MOV 31H,A
MOV A,41H
ANL A,#0F0H
SWAP A
MOV 32H,A
MOV A,41H
ANL A,#0FH
MOV 33H,A
NEXT3:
RET
CLEAR: ;归零
MOV 30H,#0
MOV 31H,#0
MOV 32H,#0
MOV 33H,#0
MOV 22H,#0
RET
RIGHT:
DEC 22H
MOV 33H,32H
MOV 32H,31H
MOV 31H,30H
MOV 30H,#0
RET
DISPLAY: ;动态显示高低位依次30H,31H,32H,33H
MOV P3,#7FH
MOV A,33H
MOVC A,@A+DPTR
MOV P1,A
LCALL DELAY10MS
MOV P3,#0BFH
MOV A,32H
MOVC A,@A+DPTR
MOV P1,A
LCALL DELAY10MS
MOV P3,#0FDH
MOV A,31H
MOVC A,@A+DPTR
MOV P1,A
LCALL DELAY10MS
MOV P3,#0FEH
MOV A,30H
MOVC A,@A+DPTR
MOV P1,A
LCALL DELAY10MS
RET
;每1S 修改一次显示值
CTIME:
MOV A,33H
JZ N1
DEC 33H
LJMP N4
N1:
MOV A,32H
JZ N2
MOV 33H,#9
DEC 32H
LJMP N4
N2:
MOV A,31H
JZ N3
DEC 31H
MOV 32H,#9
MOV 33H,#9
LJMP N4
N3:
MOV A,30H
JZ N4
DEC 30H
MOV 31H,#9
MOV 32H,#9
MOV 33H,#9
N4:
MOV A,30H
JNZ EXIT3
MOV A,31H
JNZ EXIT3
MOV A,32H
JNZ EXIT3
MOV A,33H
JNZ EXIT3
MOV 20H,#0 ;计数为零后 开启按键扫描
CLR TR0
CLR P0.7
EXIT3:
RET
DELAY10MS:
MOV R1,#05H
S2:
MOV R0,#0FFH
S1:
NOP
DJNZ R0,S1
DJNZ R1,S2
RET
DELAY1S:
MOV R2,#0FFH
S3:
LCALL DELAY10MS
DJNZ R2,S3
RET
INTERRUPT0:
MOV A,21H
JZ L01
MOV 20H,#0
MOV 21H,#0
CLR TR0
MOV 30H,#0
MOV 31H,#0
MOV 32H,#0
MOV 33H,#0
LJMP L02
L01:
MOV 20H,#1 ;计数开始 停止按键扫描
MOV 21H,#1
MOV 22H,#0
SETB TR0 ;开始计数
L02:
RETI
TIMER0:
MOV TL0,#0BH
MOV TH0,#3CH
INC R3
CJNE R3,#1,EXIT2 ;中断1S
MOV R3,#0
LCALL CTIME
EXIT2:
RETI
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -