MCS-51单片机十六进制十进制转换汇编源程序2009年03月04日 18:37RW0 equ 0x08
RW1 equ 0x09
RW2 equ 0x0A
RW3 equ 0x0B
RW4 equ 0x0C
RW5 equ 0x0D
RW6 equ 0x0E
RW7 equ 0x0F
U_byte equ 0x10 ; 十六进制数高8位
H_byte equ 0x11
M_byte equ 0x12
L_byte equ 0x13 ; 低8位
;----------------------------------------------------------------
org 0x0000
sjmp C51JUST
org 0x0030
C51JUST: mov SP,#0x5F ; 堆栈指针(60H)
mov RW0,#0x99 ; BCD=99999999(HEX=0x5F5E0FF)
mov RW1,#0x99
mov RW2,#0x99
mov RW3,#0x99
acall BCD8HEX ; 调用BCD转HEX子程序
acall HEX4BCD ; 调用HEX转BCD子程序
sjmp $
;================================================================
; ①十六进制整数转换成BCD码整数子程序(最大值HEX=0x270F,BCD=9999)
; 待转换的十六进制整数在M_byte、L_byte
; 转换后的4位BCD码整数在RW1、RW2中。程序编码19, 时钟周期264
HEX2BCD: mov RW1,#0
mov RW2,#0
mov RW7,#16 ; 循环16次
BYTS4D: mov A,L_byte ; 最低位的内容→A
rlc A ; 带C左移,L_byte-7bit→C
mov L_byte,A
mov A,M_byte
rlc A
mov M_byte,A
mov A,RW2 ; BCD码带进位自身相加(×2)
addc A,RW2
da A ; 十进制调整
mov RW2,A
mov A,RW1
addc A,RW1
da A
mov RW1,A ; 高位数≤6,不用调整
djnz RW7,BYTS4D ; 处理完16bit?否,继续
ret
;----------------------------------------------------------------
; ②十六进制整数转换成BCD码整数子程序(最大值HEX=0xF423F,BCD=999999)
; 待转换的十六进制整数在H_byte、M_byte、L_byte
; 转换后的6位BCD码整数在RW1、RW2、RW3中。程序编码27, 时钟周期639
HEX3BCD: mov RW1,#0
mov RW2,#0
mov RW3,#0
mov RW7,#24 ; 循环24次
BYTS6D: mov A,L_byte ; 最低位的内容→A
rlc A ; 带C左移,L_byte-7bit→C
mov L_byte,A
mov A,M_byte
rlc A
mov M_byte,A
mov A,H_byte
rlc A
mov H_byte,A
mov A,RW3 ; BCD码带进位自身相加(×2)
addc A,RW3
da A ; 十进制调整
mov RW3,A
mov A,RW2
addc A,RW2
da A
mov RW2,A
mov A,RW1
addc A,RW1
da A
mov RW1,A ; 高位数≤6,不用调整
djnz RW7,BYTS6D ; 处理完24bit?否,继续
ret
;----------------------------------------------------------------
; ③十六进制整数转换成BCD码整数子程序, 最大值0x5F5E0FF(BCD=99999999)
; 待转换的十六进制数在U_byte、H_byte、M_byte、L_byte, 最高位在U_byte
; 转换后的十进制数(BCD码)在RW0、RW1、RW2、RW3; 程序编码35, 时钟周期970
HEX4BCD: mov RW7,#32 ; 4字节HEX码,循环32次
mov RW0,#0x0 ; 清零备用
mov RW1,#0x0
mov RW2,#0x0
mov RW3,#0x0
BYTS8D: mov A,L_byte ; 最低位的内容→A
rlc A ; 带C左移,L_BYTE-7bit→C
mov L_byte,A
mov A,M_byte
rlc A
mov M_byte,A
mov A,H_byte
rlc A
mov H_byte,A
mov A,U_byte
rlc A
mov U_byte,A
mov A,RW3 ; 低位开始,R3的内容→A
addc A,RW3 ; BCD码带进位自身相加(相当于乘2)
da A ; 十进制调整
mov RW3,A
mov A,RW2
addc A,RW2
da A
mov RW2,A
mov A,RW1
addc A,RW1
da A
mov RW1,A
mov A,RW0
addc A,RW0
da A
mov RW0,A
djnz RW7,BYTS8D ; 处理完32bit? 否,继续
ret
;================================================================
; ①BCD码整数转换十六进制整数
; 4位BCD码整数在RW2、RW3中, 十六进制整数仍在RW2、RW3中
; 最大转换数值BCD=9999(HEX=0x270F); 程序编码23, 时钟周期48
BCD2HEX: mov A,RW3 ; 将低字节转换成十六进制
mov B,#16 ; 分离十位和个位
div AB
mov RW7,B ; 暂存个位
mov B,#10 ; 将十位转换成十六进制
mul AB
add A,RW7 ; 按十六进制加上个位
mov RW3,A
mov A,RW2 ; 将高字节转换成十六进制
mov B,#16
div AB
mov RW7,B
mov B,#10
mul AB
add A,RW7
mov B,#100 ; 调整
mul AB
add A,RW3
mov RW3,A
clr A
addc A,B
mov RW2,A
ret
;----------------------------------------------------------------
; ②BCD转换二进制; 输入6位阿拉伯数字到RW1、RW2、RW3, 最高位是RW1
; 十六进制输出在H_byte、M_byte、L_byte, 最高位是H_byte
; 最大转换数值BCD=999999(HEX=0xF423F); 程序编码86, 时钟周期348
BCD6HEX: mov H_byte,#0x0
mov M_byte,#0x0
mov L_byte,#0x0
mov A,RW1
swap A
acall MPY10A
mov A,RW1
acall MPY10A
mov A,RW2
swap A
acall MPY10A
mov A,RW2
acall MPY10A
mov A,RW3
swap A
acall MPY10A
mov A,RW3
anl A,#0xF
add A,L_byte
mov L_byte,A
clr A
addc A,M_byte
mov M_byte,A
ret
;---------------------------------
MPY10A: anl A,#0xF
add A,L_byte
mov L_byte,A
clr A
addc A,M_byte
mov M_byte,A
clr C
mov A,L_byte
rlc A
mov RW7,A
mov A,M_byte
rlc A
mov RW6,A
mov A,H_byte
rlc A
mov RW5,A
clr C
mov A,L_byte
rlc A
mov L_byte,A
mov A,M_byte
rlc A
mov M_byte,A
mov A,H_byte
rlc A
mov H_byte,A
clr C
mov A,L_byte
rlc A
mov L_byte,A
mov A,M_byte
rlc A
mov M_byte,A
mov A,H_byte
rlc A
mov H_byte,A
clr C
mov A,L_byte
rlc A
mov L_byte,A
mov A,M_byte
rlc A
mov M_byte,A
mov A,H_byte
rlc A
mov H_byte,A
mov A,RW7
add A,L_byte
mov L_byte,A
clr A
addc A,M_byte
mov M_byte,A
mov A,RW6
add A,M_byte
mov M_byte,A
clr A
addc A,H_byte
mov H_byte,A
mov A,RW5
add A,H_byte
mov H_byte,A
ret
;----------------------------------------------------------------
; ③BCD转换十六进制; 输入8位阿拉伯数字到RW0、RW1、RW2、RW3, 最高位是RW0
; 十六进制输出在U_byte、H_byte、M_byte、L_byte, 最高位是U_byte
; 最大转换数值BCD=99999999(HEX=0x5F5E0FF); 程序编码118, 时钟周期664
BCD8HEX: mov U_byte,#0x0
mov H_byte,#0x0
mov M_byte,#0x0
mov L_byte,#0x0
mov A,RW0
swap A
acall MPY10B
mov A,RW0
acall MPY10B
mov A,RW1
swap A
acall MPY10B
mov A,RW1
acall MPY10B
mov A,RW2
swap A
acall MPY10B
mov A,RW2
acall MPY10B
mov A,RW3
swap A
acall MPY10B
mov A,RW3
anl A,#0xF
add A,L_byte
mov L_byte,A
clr A
addc A,M_byte
mov M_byte,A
ret
;---------------------------------
MPY10B: anl A,#0xF
add A,L_byte
mov L_byte,A
clr A
addc A,M_byte
mov M_byte,A
clr C
mov A,L_byte
rlc A
mov RW7,A
mov A,M_byte
rlc A
mov RW6,A
mov A,H_byte
rlc A
mov RW5,A
mov A,U_byte
rlc A
mov RW4,A
clr C
mov A,L_byte
rlc A
mov L_byte,A
mov A,M_byte
rlc A
mov M_byte,A
mov A,H_byte
rlc A
mov H_byte,A
mov A,U_byte
rlc A
mov U_byte,A
clr C
mov A,L_byte
rlc A
mov L_byte,A
mov A,M_byte
rlc A
mov M_byte,A
mov A,H_byte
rlc A
mov H_byte,A
mov A,U_byte
rlc A
mov U_byte,A
clr C
mov A,L_byte
rlc A
mov L_byte,A
mov A,M_byte
rlc A
mov M_byte,A
mov A,H_byte
rlc A
mov H_byte,A
mov A,U_byte
rlc A
mov U_byte,A
mov A,RW7
add A,L_byte
mov L_byte,A
clr A
addc A,M_byte
mov M_byte,A
clr A
addc A,H_byte
mov H_byte,A
clr A
addc A,U_byte
mov U_byte,A
mov A,RW6
add A,M_byte
mov M_byte,A
clr A
addc A,H_byte
mov H_byte,A
clr A
addc A,U_byte
mov A,RW5
add A,H_byte
mov H_byte,A
clr A
addc A,U_byte
mov U_byte,A
mov A,RW4
add A,U_byte
mov U_byte,A
ret
;================================================================
end