BCD 转十进制和十进制转 BCD

Him*_*uly 3 binary system arduino decimal bcd

我写一个RTC模块Arduino的,其中数据存储在BCD。我知道十进制数是如何转换为 BCD 的,但是在以编程方式编写时遇到了一些问题。在互联网上搜索后,我得到了两个公式,如下所示并且运行良好,但无法理解它是如何计算的。

1.公式1

DEC 为 BCD

(value / 10 * 16) + (value % 10)
Run Code Online (Sandbox Code Playgroud)

例子

DEC -> 40BCD 中转换为01000000,再次等于 64。

所以如果我输入公式,我会得到相同的结果。

(40/10 * 16) + (40%10)
= (4*16) + 0
= 64
Run Code Online (Sandbox Code Playgroud)

BCD 为 DEC

(value / 16 * 10) + (value % 16)
Run Code Online (Sandbox Code Playgroud)

2.公式2

DEC 为 BCD

val + 6 * (val / 10)
Run Code Online (Sandbox Code Playgroud)

BCD 为 DEC

val - 6 * (val >> 4)
Run Code Online (Sandbox Code Playgroud)

如果有人可以详细解释它会有所帮助。

提前感谢大家。

Tom*_*rvo 5

正确的转换函数是:

byte bcdToDec(byte val)
{
  return( (val/16*10) + (val%16) );
}

byte decToBcd(byte val)
{
  return( (val/10*16) + (val%10) );
}
Run Code Online (Sandbox Code Playgroud)

为什么这样做?让我们取一个数字 5。在二进制中,它是

0101 = 5 
Run Code Online (Sandbox Code Playgroud)

现在让我们取相同的数字,通过在右侧添加四个零将其向左移动四位:

0101 0000 = 50 BCD
Run Code Online (Sandbox Code Playgroud)

这就是 BCD 的工作原理。由于十进制数字 0 到 9 需要四位二进制数字来表示,因此每个十进制数字都由四位表示。关键是在二进制移动四位乘以或除以 16,这就是16公式中值的原因。

那么让我们以 96 为例:

0110 = 6
1001 = 9
1001 0110 = 96 BCD
Run Code Online (Sandbox Code Playgroud)