回答

收藏

[原创] BCD和十进制之间的转换

51单片机 51单片机 3149 人阅读 | 0 人回复 | 2014-03-05



相信刚用DS1302的朋友都遇到过在 DS1302里面输入时间的时候是按照BCD码来写入的 那么有么有什么好办法能快速理解BCD码和十进制的转换呢?那就让我来告诉你。
首先 举个例子   BCD码表示的 0010 1001  表示十进制的  29
那么我们如何来完成转换?
1.  BCD(有一变量叫A)----->十进制(用B来表示)
     ( A >> 4 )*10+( A & 0x0F ) 就等于B了!  
可能有人问了 为什么呢? 那么请看下面
还是拿 0010 1001 来分析 0010 1001 >> 4就得到 0000 0010(低4为溢出)是十进制的2
0010 1001 & 0000 1111 (0x0f是16进制  转换为二进制就是 0000 1111)
            0010 1001
          &
            0000 1111
就得到      0000 1001  也就是9  所以现在 2*10+9 =29转换完成


写成函数模式
u8 BCD_to_DEC(u8 BCD)
{
   return ((BCD>>4*10)+BCD&0X0F);
}


2.十进制转换为BCD,相信已经有人想出来了  因为这就是个逆过程
29/10 = 2, 29 % 10=9;  2---> 0010   9-->1001
显然 0010 1001 就是BCD的29(十进制)
所以 2<<4+9就行了
写成函数
u8 DEC_to_BCD(u8 DEC)
{
   return ((DEC/10)<<4|DEC%10);
}
          完工undefined!

分享到:
回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条