c51 c语言 16位二进制转换为bcd码,16位二进制转换为BCD码的C51汇编程序

AI助手已提取文章相关产品:

16位二进制转BCD码的程序算法及51汇编实现:

n=b15~b0

n=[b15~b8]*256+[b7~b0]

=[b15~b12]*4096+[b11~b0]

,高四位[b15~b12]取值范围为0~15,代表了4096的个数

n=[b15~b12]*4000+{[b15~b12]*(100-4)+[b11~b0]}

用x 代表[b15~b12],有:

n=x*4000+{x*(100-4)+[b11~b0]

即:n=4*x(千位)+x(百位)+[b11~b0]-4*x

上式中后面的位:[b11~b0]-4*x,如果小于356,就直接转换成BCD码,如果

数值较大,就要把11~7位看成128的个数y,在百位中加上y,在十位加上3*y,并在

[b6~b0]中减去2*y

就有:

n=n=4*x(千位)+(x+y)(百位)+3*y(十位)+[b6~b0]-2*y

由此,就可以明确由高9位[b15~b7]变换出来十进制的各个位的数值,可能大于9,到最后整理一下即可。

剩下的低7位变成BCD 码已经很简单了。

这是别人的思路,容易理解,但用汇编也不太好写,期待有人能写出来,下面是我同学的一个算法:

高八位减一,让第八位加上256,(存放压缩BCD码的三个字节百位加2,十位加5,各位加6)

ORG 0000H

AJMP MAIN

ORG 0003H

AJMP int0

ORG 0100H

MAIN:MOV SP,#60H

MOV R4,#30

MOV TMOD,#01H

MOV TH0,#00H

MOV TL0,#00H

MOV IE,#81H

SETB TR0

SETB IT0

LOOP:LCALL BCD

LCALL UBCD

LOOP1: LCALL XIANSHI

LCALL DELAY

DJNZ R4,LOOP1

AJMP LOOP

BCD:MOV A,#00H

MOV 38H,41H

MOV 37H,40H

MOV 34H,A

MOV 35H,A

MOV 36H,A

MOV A,37H

MOV B,#100

DIV AB

MOV 35H,A

MOV A,B

MOV B,#10

DIV AB

SWAP A

ADD A,B

MOV 36H,A

MOV R3,38H

CJNE R3,#0,JIA

AJMP RETURN

JIA: CLR C

MOV A,36H

ADDC A,#56H

DA A

MOV 36H,A

MOV A,35H

ADDC A,#02H

DA A

MOV 35H,A

MOV A,34H

ADDC A,#0

MOV 34H,A

DJNZ R3,JIA

RETURN:RET

UBCD: MOV A,34H

CJNE A,#00H,WUWEI

MOV R1,#35H

MOV R0,#36H

MOV A,#00H

XCHD A,@R0

MOV 30H,A

MOV A,@R0

SWAP A

MOV 31H,A

MOV A,#00H

XCHD A,@R1

MOV 32H,A

MOV A,@R1

SWAP A

ADD A,#10

MOV 33H,A

RET

WUWEI:MOV R1,#34H

MOV R0,#35H

MOV A,#00H

XCHD A,@R0

MOV 31H,A

MOV A,@R0

SWAP A

ADD A,#10

MOV 32H,A

MOV A,#00H

XCHD A,@R1

MOV 33H,A

MOV A,@R1

SWAP A

ANL 36H,#0F0H

MOV A,36H

SWAP A

MOV 30H,A

您可能感兴趣的与本文相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值