求大神解答,本程序里程超过10km价格溢出,请问该如何修改??
$NOMOD51
$INCLUDE (8051.MCU)
;==========================
; 常量/变量地址定义
;==========================
cDisplayBuffer EQU 30H
cDisplayBit EQU 3CH
Circumference EQU 0B7H ; 轮胎周长 = 183cm = 1.83m
StartpriceH EQU 04H ; 起步价高字节(0x04B0 = 1200 分 = 12 元)
StartpriceL EQU 0B0H
PriceL EQU 1AH ; 每公里单价2.6元 × 10 = 26(十进制)
;==========================
; 启动中断向量
;==========================
ORG 0000H
JMP MAIN
ORG 0003H
JMP Milage
ORG 000BH
JMP Speed
;==========================
; 数码管段码表
;==========================
DispTable:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH
;==========================
; 数码管显示子程序
;==========================
Display:
MOV A, cDisplayBit
MOV P2, A
MOV DPTR, #DispTable
MOV A, #cDisplayBuffer
ADD A, cDisplayBit
MOV R0, A
MOV A, @R0
MOVC A, @A+DPTR
MOV P1, A
INC cDisplayBit
ANL cDisplayBit, #15
RET
;==========================
; 延时
;==========================
Delay:
MOV R0, #10
MOV R1, #10
DJNZ R1, $
DJNZ R0, $-4
RET
;==========================
; 二进制转 BCD(里程/价格通用)
;==========================
Bin:
MOV R0, #42H
MOV R1, #45H
CLR A
MOV @R1,A
INC R1
MOV @R1,A
INC R1
MOV @R1,A
INC R1
MOV @R1,A
PUSH 7
MOV R7,#24
BD1:
CLR C
INC R0
INC R0
MOV A,@R0
RLC A
MOV @R0,A
DEC R0
MOV A,@R0
RLC A
MOV @R0,A
DEC R0
MOV A,@R0
RLC A
MOV @R0,A
PUSH 1
MOV A,@R1
ADDC A,@R1
DA A
MOV @R1,A
DEC R1
MOV A,@R1
ADDC A,@R1
DA A
MOV @R1,A
DEC R1
MOV A,@R1
ADDC A,@R1
DA A
MOV @R1,A
DEC R1
MOV A,@R1
ADDC A,@R1
DA A
MOV @R1,A
POP 1
DJNZ R7,BD1
POP 7
RET
;==========================
; 里程计算
;==========================
Calculatemilage:
MOV A,R3
MOV B,#Circumference
MUL AB
MOV 43H,B
MOV 44H,A
MOV A,R4
MOV B,#Circumference
MUL AB
ADD A,43H
MOV 43H,A
MOV A,B
ADDC A,#0
MOV 42H,A
RET
nextMilage:
MOV A,47H
MOV B,#10H
DIV AB
MOV 37H,A
MOV A,46H
MOV B,#10H
DIV AB
MOV 36H,B
ADD A,#10
MOV 35H,A
MOV A,45H
MOV B,#10H
DIV AB
MOV 34H,B
RET
CalculateSPEED:
MOV A,R6
MOV B,#Circumference
MUL AB
MOV 42H,B
MOV B,#24H
MUL AB
MOV 44H,A
MOV 43H,B
MOV A,42H
MOV B,#24H
MUL AB
ADD A,43H
MOV 43H,A
MOV A,B
ADDC A,#0
MOV 42H,A
RET
nextSPEED:
MOV A,47H
MOV B,#10H
DIV AB
MOV 3BH,B
ADD A,#10
MOV 3AH,A
MOV A,46H
MOV B,#10H
DIV AB
MOV 39H,B
MOV 38H,A
RET
CalculatePRICE:
MOV A,34H
CLR C
SUBB A,#1
JNC nextPRICE
CLR C
MOV A,35H
SUBB A,#12
JNC nextPRICE
MOV 42H,#00H
MOV 44H,#StartpriceL
MOV 43H,#StartpriceH
RET
nextPRICE:
CLR C
MOV A,36H
SUBB A,#0
MOV 44H,A
MOV A,35H
SUBB A,#12
MOV 43H,A
MOV A,34H
SUBB A,#0
MOV 42H,A
MOV 46H,#00H
MOV A,44H
MOV B,#1
MUL AB
MOV 45H,A
MOV A,43H
MOV B,#10
MUL AB
ADD A,45H
MOV 45H,A
MOV A,#00
ADDC A,#00
MOV 46H,A
MOV A,42H
MOV B,#100
MUL AB
ADD A,45H
MOV 45H,A
MOV A,46H
ADDC A,#00
ADD A,B
MOV 46H,A
MOV A,45H
MOV B,#priceL
MUL AB
MOV 53H,A
MOV 52H,B
MOV A,46H
MOV B,#priceL
MUL AB
ADD A,52H
MOV 52H,A
MOV A,B
ADDC A,#0
MOV 51H,A
MOV A,53H
ADD A,#StartpriceL
MOV 53H,A
MOV A,52H
ADDC A,#00
ADD A,#StartpriceH
MOV 52H,A
MOV A,51H
ADDC A,#00
MOV 51H,A
MOV 44H,53H
MOV 43H,52H
MOV 42H,51H
RET
PlayPRICE:
MOV A,48H
MOV B,#10H
DIV AB
MOV 33H,B
MOV 32H,A
MOV A,47H
MOV B,#10H
DIV AB
MOV 30H,A
MOV A,B
ADD A,#10
MOV 31H,A
RET
MAIN:
MOV R2,#100
MOV SP,#60H
MOV TMOD,#01H
MOV TL1,#00H
MOV TH1,#0B8H
SETB TR0
SETB ET0
SETB IT0
SETB EX0
SETB EA
DECIDE:
JNB P3.7,WAIT
SJMP DECIDE
WAIT:
LCALL Calculatemilage
LCALL Bin
LCALL nextMilage
LCALL CalculatePRICE
LCALL Bin
LCALL PlayPRICE
LCALL CalculateSPEED
LCALL Bin
LCALL nextSPEED
LCALL Display
LCALL Delay
JNB P3.7,WAIT
STOP:
LCALL Display
LCALL Delay
JNB P3.7,RESTART
SJMP STOP
RESTART:
MOV R3,#00H
MOV R4,#00H
MOV R5,#00H
MOV R6,#00H
SJMP MAIN
Milage:
PUSH PSW
INC R3
INC R5
CJNE R3,#0FFH,OUT
MOV R3,#0
INC R4
OUT:
POP PSW
RETI
Speed:
MOV 27H,A
PUSH 27H
PUSH PSW
MOV TL0,#00H
MOV TH0,#0B8H
DJNZ R2,OUT2
MOV A,R5
MOV R6,A
MOV R2,#100
MOV R5,#00H
OUT2:
POP PSW
POP 27H
MOV A,27H
RETI
END
|