BCD转十进制和十进制转BCD

4

我正在编写一个关于在Arduino中存储BCD数据的RTC模块,但是在以编程方式编写时遇到了一些问题。我知道如何将十进制数转换为BCD,但无法理解它是如何计算的。在搜索互联网后,我找到了两个完美运行的公式,分别是:

1. 公式1

十进制转BCD

(value / 10 * 16) + (value % 10)

示例

十进制 -> 40 转换为 二进制编码十进制 (BCD) -> 01000000,这相当于 64。

因此,如果将其放入公式中,我会得到相同的结果。

(40/10 * 16) + (40%10)
= (4*16) + 0
= 64

BCD转DEC

(value / 16 * 10) + (value % 16)

2. 公式2

十进制转二进制码(BCD)

val + 6 * (val / 10)

BCD转为十进制

val - 6 * (val >> 4)

如果有人能详细解释一下,那将非常有帮助。提前感谢大家。
3个回答

11

正确的转换函数为:

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

0

一些用于16位的代码:

uint16_t decToBcd16(uint16_t val)
{
    return((((val / 1000) % 10) << 12) | (((val / 100) % 10) << 8) | (((val / 10) % 10) << 4) | (val % 10));
}

uint16_t bcdToDec16(uint16_t val)
{
    return(((((val & 0xf000) >> 12) % 10) * 1000) + ((((val & 0x0f00) >> 8) % 10) * 100) + ((((val & 0x00f0) >> 4) % 10) * 10) + ((val & 0x000f) % 10));
}

0
Maybe someone will need it,

//BIN -->BCD
#include "arduino.h" 
 unsigned long a =0;
 unsigned long x=0;
 unsigned long y=0;
 unsigned long c=0;
 unsigned long b=0;
  int d=0;
  int e=0;
  byte f=0;
 //=================================
void setup() {

 Serial.begin (9600); 
 unsigned long start = micros();

 unsigned long val =964827;
   x=val;
  if(x>100000){
  a=x/100000;
  x=x-(a*100000); 
  };
  if(x>10000){
  b=x/10000;       
  x=x-(b*10000);
   };
  if(x>1000){
  c=x/1000;       
  x=x-(c*1000);
   };
  if(x>100){
  d=x/100;       
  x=x-(d*100);
   };
  if(x>10){
  e=x/10;       
  x=x-(e*10);
   };


  Serial.println (a,DEC);
  Serial.println (b,DEC);
  Serial.println (c,DEC);
  Serial.println (d,DEC);
  Serial.println (e,DEC);
  Serial.println (x,DEC);

  unsigned long end = micros();
  unsigned long delta = end - start;
  Serial.println(delta); 





 }

  void loop() {
  // put your main code here, to run repeatedly:

 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接