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
|