1078|7

991

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

请教一段将16进制整数转换为压缩BCD码的代码的算法原理 [复制链接]

邀请:@maychang   @damiaa   @huo_hu   @吾妻思萌   参与回复

以下是一个将16位  16进制 整数 R4 R3 转成 3字节 压缩BCD码的程序代码,请帮忙分析一下 其算法原理,尤其是红色部分代码的原理,谢谢大家。

 

;;;;;;;;;;;输入  R4 R3 ,R4为 16进制整数的高字节 R3为 16进制整数的低字节 

;;;;;;;;;;;输出  RR1  RR2  RR3  依次为转换后的 压缩BCD码的 高中低3字节 

B2_BCD:

      CLR      C

      MOV    R7 , #16

      MOV    RR1 , #00H

      MOV    RR2 , #00H

      MOV    RR3 , #00H

 

LOOP16:

      MOV    A , R3;;;

      RLC     A

      MOV    R3 , A

      MOV    A , R4

      RLC     A

      MOV    R4 , A

      MOV    A , RR3

      RLC     A

      MOV    RR3 , A

      MOV    A , RR2

      RLC     A

      MOV    RR2 , A

      MOV    A , RR1

      RLC     A

      MOV    RR1 , A

      DJNZ    R7 , ADJDEC

      ;

      RET

 

ADJDEC:

      MOV   R0 , #RR3

      LCALL  ADJBCD

      MOV   R0 , #RR2

      LCALL  ADJBCD

      MOV   R0 , #RR1

      LCALL  ADJBCD

      LJMP   LOOP16

 

ADJBCD:

      MOV    A , #03H

      ADD    A , @R0

      JNB     ACC.3 , XLOO1

      MOV   @R0 , A

 

XLOO1:

      MOV    A , #30H

      ADD    A , @R0

      JNB      ACC.7 , XLOO2

      MOV    @R0 , A

 

XLOO2:

      RET

此帖出自51单片机论坛

最新回复

ADJBCD子程序通过逐步增加0x03和0x30,并根据条件判断是否需要进行进一步的调整,实现了对BCD码的调整。这样就完成了对每一位BCD码的处理,并返回调整后的BCD码值。   详情 回复 发表于 2023-10-15 20:03
点赞 关注
 

回复
举报

6107

帖子

4

TA的资源

版主

沙发
 
本帖最后由 damiaa 于 2023-10-14 21:10 编辑

 

 

0xa8 ==>1010 1000 转换 168

每四位大于4就调整(低4位)+0x3     (高四位) +0x30  可以用第四位和最高位判断
0000 0000 0000         1010 1000   
移位
0000 0000 0001         0101 000   
不要调整  
移位
0000 0000 0010         1010 00   
不要调整
移位
0000 0000 0101         0100 0   
调整 +0011
0000 0000 1000         0100 0    
移位
0000 0001 0000        1000    
不要调整
移位
0000 0010 0001        000    
移位
0000 0100 0010        00     
移位
0000 1000 0100       0     
调整 +110000
0000 1011 0100  
移位
0001 0110 1000   
 

这个是8为hex转bcd 16位可以相应移位16次,寄存器扩大

 

算法原理
        这个算法应用了逐步移位的方式:
        第一步:添加一个24位的移位寄存器用作移位寄存
         第二步:二进数逐步左移
        将需要转换的十进制数以二进制形式逐步左移。
        第三步:大四加三
        每左移一位,就要让BCD位去和4比较,如果大于4就加上3,如果不大于就继续左移,然后继续和4比较。
        第四步:进数全部移完,得到结果。

 

此帖出自51单片机论坛

点评

谢谢。为什么大于4就加上3,这个算法的原理是什么,有没有相关的资料谢谢  详情 回复 发表于 2023-10-15 10:36
真心感谢。非常感谢。  详情 回复 发表于 2023-10-15 10:31

赞赏

1

查看全部赞赏

 
 
 

回复

991

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
damiaa 发表于 2023-10-14 20:58     0xa8 ==>1010 1000 转换 168 每四位大于4就调整(低4位)+0x3    &nb ...

真心感谢。非常感谢。

此帖出自51单片机论坛

点评

谢谢 楼主这段时间进步了。  详情 回复 发表于 2023-10-15 10:34
 
 
 

回复

6107

帖子

4

TA的资源

版主

4
 
一沙一世 发表于 2023-10-15 10:31 真心感谢。非常感谢。

谢谢 楼主这段时间进步了。

此帖出自51单片机论坛
 
 
 

回复

991

帖子

0

TA的资源

五彩晶圆(初级)

5
 
damiaa 发表于 2023-10-14 20:58     0xa8 ==>1010 1000 转换 168 每四位大于4就调整(低4位)+0x3    &nb ...

谢谢。为什么大于4就加上3,这个算法的原理是什么,有没有相关的资料谢谢

此帖出自51单片机论坛

点评

这个算法也是有人发现的吧。具体也不是很了解这个算法的来由。 你可以用一些数据试一下。这样可以充分理解,直接先用8位的去试。 16位的也可以试一试。体验后就理解了。  详情 回复 发表于 2023-10-15 10:38
 
 
 

回复

6107

帖子

4

TA的资源

版主

6
 
一沙一世 发表于 2023-10-15 10:36 谢谢。为什么大于4就加上3,这个算法的原理是什么,有没有相关的资料谢谢

这个算法也是有人发现的吧。具体也不是很了解这个算法的来由。

你可以用一些数据试一下。这样可以充分理解,直接先用8位的去试。

16位的也可以试一试。体验后就理解了。

此帖出自51单片机论坛
 
 
 

回复

6107

帖子

4

TA的资源

版主

7
 

关于bcd的还一个加法

用da指令处理的。可以关注一下。

此帖出自51单片机论坛
 
 
 

回复

4856

帖子

3

TA的资源

版主

8
 

ADJBCD子程序通过逐步增加0x03和0x30,并根据条件判断是否需要进行进一步的调整,实现了对BCD码的调整。这样就完成了对每一位BCD码的处理,并返回调整后的BCD码值。

此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表