📄 zuizhongwanmeichengxu.txt
字号:
ORG 0000H
AJMP START
ORG 000BH
AJMP ERROR
START:
ACALL CLEARALL
MOV SP, #50H
ACALL WATCHDOG
CAQULATER:
ACALL FEEDDOG
ACALL DISPLAY
ACALL KEYREAD
MOV A,22H
ANL A,#0F0H
JZ NUMPROCESS_SLECT
JB 22H.4, ASMDPROCESS_SLECT
JB 22H.5, CLEARALL_SLECT
JB 22H.6, RESULTOUT_SLECT
JB 22H.7, NOKEYDOWN_SLECT
NUMPROCESS_SLECT:
ACALL NUMPROCESS
AJMP CAQULATER
ASMDPROCESS_SLECT:
ACALL ASMDPROCESS
AJMP CAQULATER
CLEARALL_SLECT:
ACALL CLEARALL
AJMP CAQULATER
RESULTOUT_SLECT:
ACALL RESULTOUT
AJMP CAQULATER
NOKEYDOWN_SLECT:
AJMP CAQULATER
;读键子程
NEW_KEY EQU 22H
OLD_KEY EQU 23H
KEYREAD:
CLR PSW.5
KEY_AGAIN:
ACALL KEY_INPUT
JNB PSW.5, KEY_OVER
ACALL KEY_DELAY
ACALL KEY_INPUT
JNB PSW.5, KEY_OVER
MOV A, NEW_KEY
CJNE A, OLD_KEY,KEY_OVER
UPKEY:
ACALL KEY_INPUT
JB PSW.5, UPKEY
ACALL KEY_INPUT
JB PSW.5, UPKEY
MOV R0,NEW_KEY
RET
KEY_INPUT:
MOV A, #00H ;显示0
MOV DPTR, #9000H
MOVX @DPTR, A ;ZIXING
CLR F0
MOV R1, #00H
MOV R2, #04H
MOV R3, #01H
KEY_LOOP:
MOV A, R3
MOV DPTR, #8000H
MOVX @DPTR, A
MOVX A, @DPTR
MOV R4, #04H
KEY_LOOP1:
RRC A
JNC NEXT_KEY
MOV OLD_KEY,NEW_KEY
MOV A, R1
MOV DPTR, #KEY_TABLE_BCD
MOVC A, @A+DPTR
MOV NEW_KEY, A
SETB F0
AJMP KEY_OVER_OK
NEXT_KEY:
INC R1
DJNZ R4,KEY_LOOP1
MOV A, R3
RL A
MOV R3, A
DJNZ R2, KEY_LOOP
AJMP KEY_OVER_OK
KEY_OVER:
MOV 22H, #80H
KEY_OVER_OK:
RET
KEY_DELAY:
MOV R0, #0FFH
DJNZ R0, $
RET
KEY_TABLE_BCD:
DB 07H,08H,09H,11H
DB 04H,05H,06H,12H
DB 01H,02H,03H,14H
DB 00H,20H,40H,18H
;显示子程
DISPLAY:
CALL DISPNUM
MOV R5, 2DH
MOV R2, #01H
MOV R0, #48H
DISP1:MOV DPTR,#8FFFH
MOV A, R2
MOVX @DPTR,A
MOV A, @R0
DISP2:MOV DPTR,#SHOWTABLE
MOVC A, @A+DPTR
MOV DPTR,#9FFFH
MOVX @DPTR,A
;ACALL DEL0
;ACALL DEL0
;ACALL DEL0
ACALL DEL0
ACALL DEL0
MOV A, R2
RL A
MOV R2, A
INC R0
DJNZ R5, DISP1
RET
SHOWTABLE:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H
DEL0: MOV R6, #00H
TM: MOV R7, #01H
DJNZ R7, $
DJNZ R6, TM
RET
;显示数字位数字程
DISPNUM:
JNB 20H.4, YYY
MOV A,21H
JZ NUM5_SLECT
YYY:MOV A, 4CH
ORL A, 21H
MOV 2EH, A
JB 2EH.3, NUM4_SLECT
JB 2EH.2, NUM3_SLECT
JB 2EH.1, NUM2_SLECT
JB 2EH.0, NUM1_SLECT
NUM1_SLECT:
MOV 2DH, #1
AJMP RETURN2
NUM2_SLECT:
MOV 2DH, #2
AJMP RETURN2
NUM3_SLECT:
MOV 2DH, #3
AJMP RETURN2
NUM4_SLECT:
MOV 2DH, #4
AJMP RETURN2
NUM5_SLECT:
MOV 2DH,4DH
AJMP RETURN2
RETURN2:MOV 4DH,2DH
RET
;数字键处理子程
NUMPROCESS:
MOV 4CH,#0H
MOV A, 20H
JZ BCD1
BCD2:MOV A, 21H
CJNE A, #2, BCD2IN
AJMP RETURN
BCD2IN:MOV 37H, 36H
MOV 36H, 22H
INC 21H
MOV 48H, 36H
MOV 49H, 37H
AJMP RETURN
BCD1:MOV A, 21H
CJNE A, #2, BCD1IN
AJMP RETURN
BCD1IN:MOV 31H, 30H
MOV 30H, 22H
INC 21H
MOV 48H, 30H
MOV 49H, 31H
RETURN:RET
;清RAM子程
CLEARALL:
MOV R5, #2EH
MOV R0, #20H
CLEARRAM:MOV @R0, #00H
INC R0
DJNZ R5, CLEARRAM
RET
;运算键处理子程
ASMDPROCESS:
MOV A, 31H
SWAP A
ORL A, 30H
MOV 34H,A
MOV 20H,22H
MOV 21H,#0H
RET
;等于键处理子程
RESULTOUT:
JNB 20H.4,RETURN3
MOV A, 37H
SWAP A
ORL A, 36H
MOV 3AH,A
JB 20H.0, BCDADD_SLECT
JB 20H.1, BCDSUB_SLECT
JB 20H.2, BCDMUL_SLECT
JB 20H.3, BCDDIV_SLECT
BCDADD_SLECT:
ACALL BCDADD
AJMP RESULTPROCESS
BCDSUB_SLECT:
ACALL BCDSUB
AJMP RESULTPROCESS
BCDMUL_SLECT:
ACALL BCDMUL
AJMP RESULTPROCESS
BCDDIV_SLECT:
ACALL BCDDIV
AJMP RESULTPROCESS
RESULTPROCESS:
MOV 4CH, #0H
MOV A, 3CH
ANL A, #0FH
MOV 48H,A
SETB 2FH.0
MOV A, 3CH
SWAP A
ANL A, #0FH
JZ SETTEN
SETB 2FH.1
SETTEN:MOV 49H,A
MOV A, 3DH
ANL A, #0FH
JZ SETHUN
SETB 2FH.2
SETHUN:MOV 4AH,A
MOV A, 3DH
SWAP A
ANL A, #0FH
JZ SETTHO
SETB 2FH.3
SETTHO:MOV 4BH,A
MOV 4CH,2FH
MOV R5, #20H
MOV R0, #20H
CLEARRAM2:
MOV @R0, #00H
INC R0
DJNZ R5, CLEARRAM2
RETURN3:
RET
;加法运算子程
BCDADD:
CLR C
MOV A, 34H
ADDC A, 3AH
DA A
MOV 3CH, A
MOV A, #00H
RLC A
MOV 3DH,A
RET
;减法运算子程
BCDSUB:
MOV A, 34H
CJNE A, 3AH, BCDSUB_NEQ
MOV 3CH, #00H
AJMP BCDSUB_BACK
BCDSUB_NEQ:
JNC BCDSUB_SUB
CLR C
XCH A,34H
XCH A,3AH
MOV 34H, A
MOV 3DH, #0AH
BCDSUB_SUB:
MOV A,#9AH
SUBB A, 3AH
ADD A, 34H
DA A
MOV 3CH, A
BCDSUB_BACK:
RET
;乘法运算子程
BCDMUL:
MOV A, 34H
ACALL BCD_BIN
MOV R2,A
MOV A, 3AH
ACALL BCD_BIN
MOV B,R2
MUL AB
MOV R6,B
MOV R7,A
ACALL BIN_BCD
MOV 3CH,R5
MOV 3DH,R4
MOV 3EH,R3
RET
;压缩 BCD
;入口为A,出口为A
BCD_BIN:
MOV R1,A
ANL A,#0FH
MOV R0,A
MOV A,R1
ANL A,#0F0H
SWAP A
MOV B,#0AH
MUL AB
ADD A,R0
RET
;入口条件:待转换的双字节十六进制整数在R6、R7中。
;出口信息:转换后的三字节BCD码整数在R3、R4、R5中。
;影响资源:PSW、A、R2~R7 堆栈需求: 2字节
BIN_BCD:
CLR A ; ;BCD码初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;;转换双字节十六进制整数
HB3:
MOV A,R7 ;;从高端移出待转换数的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;;BCD码带进位自身相加,相当于乘2
ADDC A,R5
DA A ;;十进制调整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3 ;处理完16bit
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;除法运算子程
BCDDIV:
MOV A, 3AH
JZ BCDDIV_EERO
ACALL BCD_BIN
MOV R2,A
MOV A, 34H
ACALL BCD_BIN
MOV B,R2
DIV AB
MOV R6,#00H
MOV R7,A
ACALL BIN_BCD
MOV 3CH,R5
MOV 3DH,R4
MOV 3EH,R3
AJMP BCDDIV_END
BCDDIV_EERO:
MOV 3CH,#00H
BCDDIV_END:
RET
;WATCHINGDOG的软件实现子程
;看门狗设置与启动
WATCHDOG:
MOV TMOD, #01H
MOV TH0, #00H
MOV TL0, #01H
MOV IE, #82H
SETB TR0
RET
;喂狗
FEEDDOG:
MOV TH0, #00H
MOV TL0, #01H
RET
;程序跑飞处理子程
ERROR:
AJMP START
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -