4642|8

67

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

求一个HEX转化成压缩BCD码的算法 [复制链接]

例如有一个unisigned int x 一个uchar y[3]
要把X转化成压缩BCD码放到Y中
这个8位机没BCD相关指令,没有乘除法指令,
只有加减,带进位加减,移位等常用指令,
有做过的给个合适的算法,谢谢了

最新回复

懒得验证了,把汇编版的除法写出来就没什么大问题了 /10000,得到结果余数,再把余数/1000,得到结果和余数........  详情 回复 发表于 2010-1-30 17:43
点赞 关注

回复
举报

80

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
BIN转BCD,就是不停做除以10的运算. 既然处理器没有除法,那就首先实现除法
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
网上有很多这样的现在源代码。
除法就是采用移位指令来实现。

楼主可以看看:
http://www.avrw.com/article/art_107_3613.htm

几种码制之间的转换 BCD HEX BIN
  1. #include
  2. #include
  3. #include
  4. #include

  5. /**此宏定义摘自51bbs Youth发表***/
  6. #define LongToBin(n) \
  7. (\
  8. ((n >> 21) & 0x80) | \
  9. ((n >> 18) & 0x40) | \
  10. ((n >> 15) & 0x20) | \
  11. ((n >> 12) & 0x10) | \
  12. ((n >> 9) & 0x08) | \
  13. ((n >> 6) & 0x04) | \
  14. ((n >> 3) & 0x02) | \
  15. ((n ) & 0x01) \
  16. )

  17. #define Bin(n) LongToBin(0x##n##l)

  18. /********** HEX转BCD******/
  19. /***bcd_data(<0x255,>0)***/
  20. unsigned char BCD2HEX(unsigned int bcd_data)
  21. {
  22.     unsigned char temp;
  23.     temp=((bcd_data>>8)*100)|((bcd_data>>4)*10)|(bcd_data&0x0f);
  24.     return temp;
  25. }
  26. /********** HEX转BCD******/
  27. /***hex_data(<0xff,>0)****/
  28. unsigned int HEX2BCD(unsigned char hex_data)
  29. {
  30.     unsigned int bcd_data;
  31.     unsigned char temp;
  32.     temp=hex_data%100;
  33.     bcd_data=((unsigned int)hex_data)/100<<8;
  34.     bcd_data=bcd_data|temp/10<<4;
  35.     bcd_data=bcd_data|temp%10;
  36.     return bcd_data;
  37. }

  38. void main(void)
  39. {
  40.   unsigned int c;

  41.   c= Bin(10101001);  // then c = 0xA9
  42.   c=BCD2HEX(0x255);  //255 转成HEX为0xff
  43.   c=HEX2BCD(0xff);    //0xff 转成BCD码为 255
  44. }
复制代码


还有很多,楼主自己搜索下、
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
路过
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

5
 
这个应该就可以了

  1. unsigned int x1;        //外部变量
  2. void HEX2BCD(unsigned int x,unsigned char y[3])
  3. {
  4.     unsigned char i =0;
  5.     x1 =x;
  6.     y[2] =  get(10000);
  7.     y[1] =  get(1000) <<4;
  8.     y[1] += get(100);
  9.     y[0] =  get(10) <<4;
  10.     y[0] += xl;
  11. }

  12. unsigned char get(unsigned int da)
  13. {
  14.     unsigned char i=0;
  15.     while(x1 > da)
  16.     {
  17.         x1 -=da;
  18.         i++;
  19.     }
  20.     return i;
  21. }
复制代码
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
这样的代码太多了,楼主一搜就一大堆的
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
MARK
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

8
 
以前写的一个,没有很好验证过,楼主不介意就帮忙验证一下吧。记得告诉验证结果啊。

  1. /*
  2. ****************************************************************************************************
  3. * Function Name   : Hex_To_Dec
  4. * Description     : 十六进制向十进制转换
  5. * Arguments       : hex     - 待转换的十六进制数
  6. *                   dec     - 十进制数存储区(BCD压缩格式)
  7. *                   len     - 十进制最大长度
  8. * Returns         : 0       - 正常
  9. *                   1       - 十进制数存储区过小
  10. ****************************************************************************************************
  11. */
  12. #define DEC(hex)    (((hex / 10) << 4) + (hex % 10))
  13. uint8 Hex_To_Dec(uint32 hex,uint8 dec[],uint16 len)
  14. {
  15.     uint8   temp;
  16.     uint8   pdec = dec;

  17.     while(0 != hex)
  18.     {
  19.         if(0 == len)
  20.         {
  21.             return(1);
  22.         }
  23.         
  24.         len--;
  25.         temp = hex % 100;
  26.         hex /= 100;
  27.        *pdec++ = DEC(temp);
  28.     }
  29.     for(;len>0;len--)
  30.     {
  31.         *pdec++ = 0x00;
  32.     }
  33.     return(0);
  34. }
复制代码
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

9
 
懒得验证了,把汇编版的除法写出来就没什么大问题了
/10000,得到结果余数,再把余数/1000,得到结果和余数........
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

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