DATDEAL:
MOV A, TL1 ;先取低8
MOV B, #30H
MUL AB ;乘以30H
MOV R7, A
MOV R6, B
MOV A, TH1 ;再取高8
MOV B, #30H
MUL AB
ADD A, R6
MOV R6, A
CLR A
ADDC A, B
MOV R5, A ;至此, (R5 R6 R7) = (TH1 TL1) * 30H
CALL HB3 ;(R5 R6 R7)2 --> (R2 R3 R4)BCD
MOV A, R2
MOV B, #16
DIV AB
MOV SHIW, A ;十万位.
MOV WAN, B ;万位.
MOV A, R3
MOV B, #16
DIV AB
MOV QIAN, A
MOV BAI, B
MOV A, R4
MOV B, #16
DIV AB
MOV SHI, A
MOV GE, B
SJMP $ ;此处加入显示程序
;------------------
;二进制数转换为BCD码
HB3:
CLR A ;BCD码初始化.
MOV R2, A
MOV R3, A
MOV R4, A
MOV R1, #24 ;转换三字节二进制数.
HB31:
MOV A, R7 ;从待转换数低字节高端移出一位到CY
RLC A
MOV R7, A
MOV A, R6
RLC A
MOV R6, A
MOV A, R5
RLC A
MOV R5, A
MOV A, R4 ;移出位加入到BCD码的低位并左移.
ADDC A, R4
DA A ;调整为BCD码.
MOV R4, A
MOV A, R3
ADDC A, R3
DA A
MOV R3, A
MOV A, R2
ADDC A, R2
DA A
MOV R2, A
DJNZ R1, HB31 ;共处理24位.
RET
;------------------
END
程序中,忽略了““千万位、百万位””。
;------------------
DATDEAL:
MOV R6,TH1 ;计数高位赋值给R6
MOV R7,TL1 ;计数低位赋值给R7
LCALL HB2 ;十六进制转换为BCD码供显示
MOV A,R5 ;最低字节调整为显示
ANL A,#0FH
MOV D_GE,A ;个位
MOV A,R5
SWAP A
ANL A,#0FH
MOV D_SHI,A ;十位
MOV A,R4 ;中位字节调整为显示
ANL A,#0FH
MOV D_BAI,A ;百位
MOV A,R4
SWAP A
ANL A,#0FH
MOV D_QIAN,A ;千位
MOV A,R3 ;高位字节调整为显示
ANL A,#0FH
MOV D_WAN,A ;万位
MOV A,R3
SWAP A
ANL A,#0FH
MOV D_SHIW,A ;十万位
;------------------
;双字节十六进制转换为BCD码
HB2:
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
;------------------
人
fx30是什么呀? 说明一下吧