标题: 51单片机 16位二进制数转BCD码,这个代码不理解 [打印本页]

作者: Chenyun1129    时间: 2021-11-16 07:41
标题: 51单片机 16位二进制数转BCD码,这个代码不理解
这个代码看不懂,有人可以给讲一讲思路吗
比如Cy=1时 R5=00H
那么 MOV  A,R5
       ADDC   A,R5
       MOV     R5,A
执行之后R5的值为多少
还有这里为什么是16次循环



作者: 188610329    时间: 2021-11-16 14:38
讲就是: 2进制除法,就是这么一个计算过程。16位就是16次,32位就是32次,

说白了,就是利用加法器实现除法。你看看2进制运算方面的资料就能看明白了。说要说半天了。
作者: Chenyun1129    时间: 2021-11-16 15:18
188610329 发表于 2021-11-16 14:38
讲就是: 2进制除法,就是这么一个计算过程。16位就是16次,32位就是32次,

说白了,就是利用加法器实现除 ...

好的,谢谢,我去查查相关资料
作者: yzwzfyz    时间: 2021-11-18 15:12
要说清楚,是哪16位,转换成放在哪里。
作者: 188610329    时间: 2021-11-18 15:24
yzwzfyz 发表于 2021-11-18 15:12
要说清楚,是哪16位,转换成放在哪里。

?? 是说我么?

我补充一下,
这个应该是中间步骤, 或者整个代码都是汇编写的。
R6, R7 是原始的16位2进制数, 范围是: 0~65535
转译出来的 十是进制BCD 保存在 R3,R4,R5
由于,没有把他们移回R5,R6,R7 不在传参位,所以,故计要么还有一段代码,要么就是整个代码就是汇编写的,所以不需要放到传参位。

作者: yzwzfyz    时间: 2021-11-18 15:33
我的做法是这样的。
做一个表:分别对应16位中各个位的BCD值,B15...B0,如果该位是1就加这个值(BCD加法),是0就不加,这样很好理解。
B15:032768
B14:  016384
B13:008192
……
B0 :   000001
作者: yzwzfyz    时间: 2021-11-18 16:13
R67是16位二进制数,R345是BCD结果。
1、HB2:将结果清0,准累计结果。
2、HB3:先将R67的最高位移出,或0或1。
3、移出的0或1,放入结果的末位,进行BCD调整。
理解:假设最高位是1(也就是你举例的),它将被移入CY,通过ADDC,被加入到R5的末位中,未来还会被向高位移动15次,并且还会被BCD调整15次,加上本次,一共被移位、调整16次。
每左移一次相当于是二进制乘2,16次移动是还原成原值(原来在第几位的还是在第几位),这个很好理解。而每次乘2后会被进行BCD调整,就变成了10进制了。进行16次移位16次BCD调整,是否能正确地转换,就不太好理解了。
不过你可以做个试验:R67=1000000000000000,16次操作后看看是否 R345=032768。如此,便于你理解。
第1234次操作后, R345=0008,
第5次操作后, R345=0016,(移位变成0010H,BCD调整后变成0016)
第6次操作后, R345=0032,(移位变成002CH,BCD调整后变成0032)
第7次操作后, R345=0064,(移位变成0064H,BCD调整后变成0064)
第8次操作后, R345=0128,(移位变成00C8H,BCD调整后变成0128)
......
作者: 188610329    时间: 2021-11-18 17:28
yzwzfyz 发表于 2021-11-18 16:13
R67是16位二进制数,R345是BCD结果。
1、HB2:将结果清0,准累计结果。
2、HB3:先将R67的最高位移出,或 ...

看了你写的解答,令我惊叹万分,为啥我就写不出这样的,如此层次清晰的,感觉只要识字的就能看懂的,答复呢?
作者: yzwzfyz    时间: 2021-11-20 16:53
这个还是比较简单的,如果是开方,三角计算,则更难。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1