17829|12

6366

帖子

4914

TA的资源

版主

楼主
 

C语言的十六进制(HEX)转BCD码程序 [复制链接]

 
本帖最后由 tiankai001 于 2018-12-3 18:19 编辑

此内容由EEWORLD论坛网友tiankai001原创,如需转载或用于商业用途需征得作者同意并注明出处

       十六进制和BCD码之间的相互转换是C语言程序设计以及单片机编程中经常会碰到的事情。       我在日常工作中也碰到了这样的情况,所以就写了两段程序:一个是BCD码转十六进制,另一个是十六进制转BCD码,功能实现后,就随手发了两个帖子到EEWORLD,分享一下,大家一起学习。


       本帖实现的是十六进制到BCD码的转换。
      
       我们知道,计算机和单片机中数据的存储都是以二进制数存储的,但是使用过程中为简化起见,一般都以十六进制数(HEX)来表达。而BCD码就是我们一般俗称的8421码(当然,还有2421BCD码,5421BCD码,这两种不常用,本帖中我们指的是8421BCD码)。
   因为在计算机或单片机中最常用的是单字节、2字节、4字节的数据,所以本帖中,我们分别做了这三种数据类型的十六进制转BCD码的转换。

      另外,根据网友意见,将该程序分开几部分,分别实现单字节、2字节、4字节的hex转BCD码,这样看起来、用起来更方便一些。
特别说明:既然有了HEX转BCD的过程,那也会有BCD转换HEX的逆过程。所以我也搞了这个转换的。另外发了一个帖子,有兴趣的话可以看一下。

单字节,100以内的hex转BCD
  1. void HEXtoBCDData(void)
  2. {
  3. unsigned char ucHEXdata[10] = {0},ucBCDdata[10] = {0};
  4. unsigned int uiHEXdata = 0;
  5. unsigned long int ulHEXdata = 0;
  6. //单字节十六进制数转BCD码,并且转换出来的BCD码的最大值为99,超过99就要用两个字节装载BCD码
  7. ucHEXdata[0] = 0x63; //十进制为99
  8. ucBCDdata[0] = (ucHEXdata[0]/10)*0x10 + (ucHEXdata[0]%10);
  9. //ucBCDdata[0]=99;//转换出来的

  10. }
复制代码



单字节0~255以内的hex转BCD
  1. void HEXtoBCDData(void)
  2. {
  3. unsigned char ucHEXdata[10] = {0},ucBCDdata[10] = {0};
  4. unsigned int uiHEXdata = 0;
  5. unsigned long int ulHEXdata = 0;

  6. //单字节十六进制数转BCD码,并且转换出来的BCD码的超过99
  7. ucHEXdata[0] = 0xf5; //十进制为245
  8. ucHEXdata[1] = ucHEXdata[0]/100;
  9. ucHEXdata[2] = ucHEXdata[0]%100;
  10. ucBCDdata[0] = ucHEXdata[1];
  11. ucBCDdata[1] = (ucHEXdata[2]/10)*0x10 + (ucHEXdata[2]%10);
  12. //ucBCDdata[1]=2,ucBCDdata[0]=45

  13. }
复制代码




2字节的hex转BCD
  1. void HEXtoBCDData(void)
  2. {
  3. unsigned char ucHEXdata[10] = {0},ucBCDdata[10] = {0};
  4. unsigned int uiHEXdata = 0;
  5. unsigned long int ulHEXdata = 0;

  6. //2字节十六进制数转BCD码,2字节十六进制数最大值为0xffff=65535,所以转换出来的BCD码需要用3个字节装载
  7. uiHEXdata = 0xfff5; //十进制为65525
  8. ucHEXdata[1] = uiHEXdata%100;
  9. ucBCDdata[0] = (ucHEXdata[1]/10)*0x10 + (ucHEXdata[1]%10);
  10. uiHEXdata = uiHEXdata/100;
  11. ucHEXdata[2] = uiHEXdata%100;
  12. ucBCDdata[1] = (ucHEXdata[2]/10)*0x10 + (ucHEXdata[2]%10);
  13. uiHEXdata = uiHEXdata/100;
  14. ucHEXdata[3] = uiHEXdata%100;
  15. ucBCDdata[2] = (ucHEXdata[3]/10)*0x10 + (ucHEXdata[3]%10);
  16. //ucBCDdata[2]=6,ucBCDdata[1]=55,ucBCDdata[0]=25


  17. }
复制代码




4字节的hex转BCD
  1. void HEXtoBCDData(void)
  2. {
  3. unsigned char ucHEXdata[10] = {0},ucBCDdata[10] = {0};
  4. unsigned int uiHEXdata = 0;
  5. unsigned long int ulHEXdata = 0;

  6. //4字节十六进制数转BCD码,2字节十六进制数最大值为0xffffffff=4294967295,所以转换出来的BCD码需要用5个字节装载
  7. ulHEXdata = 0xfffffff5; //十进制为4294967285
  8. ucHEXdata[1] = ulHEXdata%100;
  9. ucBCDdata[0] = (ucHEXdata[1]/10)*0x10 + (ucHEXdata[1]%10);
  10. ulHEXdata = ulHEXdata/100;
  11. ucHEXdata[2] = ulHEXdata%100;
  12. ucBCDdata[1] = (ucHEXdata[2]/10)*0x10 + (ucHEXdata[2]%10);
  13. ulHEXdata = ulHEXdata/100;
  14. ucHEXdata[3] = ulHEXdata%100;
  15. ucBCDdata[2] = (ucHEXdata[3]/10)*0x10 + (ucHEXdata[3]%10);
  16. ulHEXdata = ulHEXdata/100;
  17. ucHEXdata[4] = ulHEXdata%100;
  18. ucBCDdata[3] = (ucHEXdata[4]/10)*0x10 + (ucHEXdata[4]%10);
  19. ulHEXdata = ulHEXdata/100;
  20. ucHEXdata[5] = ulHEXdata%100;
  21. ucBCDdata[4] = (ucHEXdata[5]/10)*0x10 + (ucHEXdata[5]%10);
  22. //ucBCDdata[4]=42,ucBCDdata[3]=94,
  23. //ucBCDdata[2]=96,ucBCDdata[1]=72,ucBCDdata[0]=85


  24. }
复制代码




4字节的hex转BCD,优化程序

  1. void HEXtoBCDData(void)
  2. {
  3. unsigned char ucHEXdata[10] = {0},ucBCDdata[10] = {0};
  4. unsigned int uiHEXdata = 0;
  5. unsigned long int ulHEXdata = 0;

  6. //4字节十六进制数转BCD码,可以做成一个循环转换的程序
  7. ulHEXdata = 0xfffffff4; //十进制为42 94 96 72 84
  8. for(int i=0;i<5;i++)
  9. {
  10. ucHEXdata=ulHEXdata%100;
  11. ulHEXdata=ulHEXdata/100;
  12. ucBCDdata=(ucHEXdata/10)*0x10+ucHEXdata%10;
  13. }
  14. //ucBCDdata[4]=42,ucBCDdata[3]=94,
  15. //ucBCDdata[2]=96,ucBCDdata[1]=72,ucBCDdata[0]=84
  16. }
复制代码



此帖出自编程基础论坛

最新回复

楼主啊,我偶尔刷帖子看到这个帖子。 我想一个问题,能不能把 2位BCD 4位BCD,以至于2N位BCD合为一体呢? 当然,纯属老毛病追求通用犯了。 我誓死捍卫分开写的权利。  详情 回复 发表于 2019-3-19 00:58

赞赏

1

查看全部赞赏

点赞 关注(6)
 

回复
举报

7815

帖子

56

TA的资源

裸片初长成(中级)

沙发
 
大哥,你换成 CODE 格式发代码好不好,好不好嘛......
发了我把明天的所有威望和芯币都给你~~~~给你申请,给你置顶~~
此帖出自编程基础论坛

点评

非常感谢你的支持,我决定好好真理一下,把文档和程序都整理一下,最晚明天我整理好  详情 回复 发表于 2018-12-3 11:04
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

1万

帖子

25

TA的资源

版主

板凳
 
内部编写一个子程序多好,简洁又通用的。
此帖出自编程基础论坛

点评

这个本来就是一个子程序哦,是我在项目中用到的一个功能,然后单独拿出来的  详情 回复 发表于 2018-12-3 11:17
 
 
 

回复

6366

帖子

4914

TA的资源

版主

4
 
辛昕 发表于 2018-12-3 10:16
大哥,你换成 CODE 格式发代码好不好,好不好嘛......
发了我把明天的所有威望和芯币都给你~~~~给你申请, ...

非常感谢你的支持,我决定好好真理一下,把文档和程序都整理一下,最晚明天我整理好
此帖出自编程基础论坛

赞赏

1

查看全部赞赏

 
 
 

回复

6366

帖子

4914

TA的资源

版主

5
 
dcexpert 发表于 2018-12-3 11:00
内部编写一个子程序多好,简洁又通用的。

这个本来就是一个子程序哦,是我在项目中用到的一个功能,然后单独拿出来的
此帖出自编程基础论坛

点评

函数内部有很多重复的部分,这部分可以在写一个子程序。  详情 回复 发表于 2018-12-3 13:46
 
 
 

回复

1万

帖子

25

TA的资源

版主

6
 
tiankai001 发表于 2018-12-3 11:17
这个本来就是一个子程序哦,是我在项目中用到的一个功能,然后单独拿出来的

函数内部有很多重复的部分,这部分可以在写一个子程序。
此帖出自编程基础论坛

点评

是的,这部分程序包含了单字节,2字节,4字节的HEX转BCD,囊括的功能有些多,用的话可以根据情况选用一部分。 你的建议很好,谢谢,我改一下  详情 回复 发表于 2018-12-3 13:57
 
 
 

回复

6366

帖子

4914

TA的资源

版主

7
 
dcexpert 发表于 2018-12-3 13:46
函数内部有很多重复的部分,这部分可以在写一个子程序。

是的,这部分程序包含了单字节,2字节,4字节的HEX转BCD,囊括的功能有些多,用的话可以根据情况选用一部分。
你的建议很好,谢谢,我改一下
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

8
 
tiankai001 发表于 2018-12-3 11:04
非常感谢你的支持,我决定好好真理一下,把文档和程序都整理一下,最晚明天我整理好

爱你哦
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

9
 
精华不需要高技术,只要用心说人话

——让我们一起来做颜值派,从发帖开始
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

6366

帖子

4914

TA的资源

版主

10
 
辛昕 发表于 2018-12-3 16:53
精华不需要高技术,只要用心说人话

——让我们一起来做颜值派,从发帖开始

此帖出自编程基础论坛
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(中级)

11
 
mark
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

12
 
楼主啊,我偶尔刷帖子看到这个帖子。
我想一个问题,能不能把 2位BCD 4位BCD,以至于2N位BCD合为一体呢?

当然,纯属老毛病追求通用犯了。
我誓死捍卫分开写的权利。
此帖出自编程基础论坛

点评

这个完全可以做到, 我还有个long long型HEX转BCD的,用的移位算法,回头贴出来。然后根据你的建议整合一下  详情 回复 发表于 2019-3-19 08:58
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

6366

帖子

4914

TA的资源

版主

13
 
辛昕 发表于 2019-3-19 00:58
楼主啊,我偶尔刷帖子看到这个帖子。
我想一个问题,能不能把 2位BCD 4位BCD,以至于2N位BCD合为一体呢?
...

这个完全可以做到,
我还有个long long型HEX转BCD的,用的移位算法,回头贴出来。然后根据你的建议整合一下
此帖出自编程基础论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表