|

楼主 |
发表于 2023-10-27 22:56:29
|
显示全部楼层
; MCU=AT89C51, Fosc=11.0592MHz
BARGB0 equ 0x08 ; 高8位
BARGB1 equ 0x09
;---------------------------------
org 0x0000 ; 复位矢量
ajmp C51_STAR ; 到主代码
;----------------------------------------------------------------
; 主代码
org 0x0036 ; 存放起地址
C51_STAR: mov SP,#0x4F ; 堆栈指针[50H起]
mov R6,#0
mov R7,#0
call SUB_HEX ; 调用减法
mov BARGB0,R6 ; 复制待转内容
mov BARGB1,R7
call HEX2BCD ; 调用HEX转BCD
sjmp $
;----------------------------------------------------------------
; 二进制数两字节无符号减法
; 被减数、差在R6.R7,最高位R6
SUB_HEX: clr C ; 清进/借位标志CY
mov A,#0x1 ; 立即数(减数)"0x1"->累加器ACC
xch A,R7 ; ACC和R7内容互换
subb A,R7 ; 被减数低8位(ACC内容)-减数
mov R7,A ; A->R7(低8位)
mov A,#0x0 ; A清零
xch A,R6
subb A,R6 ; 被减数高8位(ACC内容)-借位位
mov R6,A ; A->R7(高8位)
ret
;---------------------------------
; 二进制数两字节无符号加法
; 被加数、和在R6.R7,最高位R6
ADD_HEX: mov A,#0x1 ; 立即数(加数)"0x1"->累加器ACC
xch A,R7 ; ACC和R7内容互换
add A,R7 ; 被加数低8位(ACC内容)+加数
mov R7,A ; A->R7(低8位)
mov A,#0x0 ; A清零
xch A,R6
addc A,R6 ; 被加数高8位(ACC内容)+进位位
mov R6,A ; A->R6(高8位)
ret
;---------------------------------
; 二进制数转BCD码
; 待转换数在BARGB0.BARGB1,最高位在BARGB0
; 压缩BCD码在R3.R4.R5,最高位在R3
HEX2BCD: mov R2,#16 ; 循环16次
mov R3,#0
mov R4,#0 ; 清零待用
mov R5,#0
TO_BCD: mov A,BARGB1 ; 低8位内容->A
rlc A ; 带C左移
mov BARGB1,A
mov A,BARGB0
rlc A
mov BARGB0,A
mov A,R5 ; 低位开始,R5的内容->A
addc A,R5 ; 带进位自身相加(相当于乘2)
da A ; 十进制调整
mov R5,A
mov A,R4
addc A,R4
da A
mov R4,A
mov A,R3
addc A,R3
da A
mov R3,A
djnz R2,TO_BCD ; 已处理完16bit?否,继续
ret
;----------------------------------------------------------------
end |
|