Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino BCD到十进制和十进制到BCD_Arduino_Binary_Decimal_System_Bcd - Fatal编程技术网

Arduino BCD到十进制和十进制到BCD

Arduino BCD到十进制和十进制到BCD,arduino,binary,decimal,system,bcd,Arduino,Binary,Decimal,System,Bcd,我正在为Arduino中的RTC模块编写库,其中数据存储在BCD中。我知道十进制数是如何转换成BCD的,但在以编程方式编写时遇到了一些问题。在网上搜索后,我得到了两个公式,它们如下所示,运行良好,但无法理解它是如何计算的 1。公式1 12月至BCD (value / 10 * 16) + (value % 10) val + 6 * (val / 10) 示例 DEC->40在BCD中转换为01000000,再次等于64 所以,如果我把它放进公式中,我会得到同样的结果 (40/10 * 16

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

1。公式1

12月至BCD

(value / 10 * 16) + (value % 10)
val + 6 * (val / 10)
示例

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

所以,如果我把它放进公式中,我会得到同样的结果

(40/10 * 16) + (40%10)
= (4*16) + 0
= 64
BCD至12月

(value / 16 * 10) + (value % 16)
val - 6 * (val >> 4)
2。公式2

12月至BCD

(value / 10 * 16) + (value % 10)
val + 6 * (val / 10)
BCD至12月

(value / 16 * 10) + (value % 16)
val - 6 * (val >> 4)
如果有人能详细解释一下,那会很有帮助的


多亏了所有预先准备的功能。

正确的转换功能包括:

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

byte decToBcd(byte val)
{
  return( (val/10*16) + (val%10) );
}
为什么这样做有效?让我们取一个5位数。在二进制中,它是

0101 = 5 
现在,让我们取同一个数字,通过在右侧添加四个零,将其向左移动四个位置:

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

那么让我们看96:

0110 = 6
1001 = 9
1001 0110 = 96 BCD