2014-09-08 4 views
1

오늘 arduino와 실시간 시계를 통합하기 위해 몇 가지 코드를 살펴 보았습니다. 그리고 완전히 이해하지 못하는 몇 가지 이진수 (10 진수)가있었습니다. Adruino 이진에서 십진법으로의 회화 이해하기

문제의 코드

은 다음과 같습니다 : 난 정말이 어떻게 작동하는지 이해하지

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

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

ex: decToBcd(12); 

. 나는 수학을 이해하고 있는지 또는 어떤 종류의 가정이 이용되고 있는지 확신 할 수 없다.

아래의 수학 및 데이터 유형이 얼마나 정확하게 작동하는지 설명하는 사람이 있습니까? 가능한 경우 우리가 바이트 값으로 작업 할 때 "8"대신 "16"값이 사용됩니다.

컨텍스트를 들어, 전체 코드는 여기에서 찾을 수 있습니다 : http://www.codingcolor.com/microcontrollers/an-arduino-lcd-clock-using-a-chronodot-rtc/

답변

1

여기서 중요한 힌트는 BCD입니다 - Binary-coded decimal - 함수 이름입니다. BCD에서 각 십진수는 4 비트 (1/2 바이트)로 표시됩니다. 결과적으로 BCD 표기법을 사용하여 저장할 수있는 최대 (십진수)는 상단 니블 (바이트의 절반)에서 99-9이고 하위 니블에서는 9입니다. 숫자 12를 예로 들어 보겠습니다.

다음과
12 = %00001010 

그러나 BCD에 보이는대로 : 당신이 decToBcd 기능을 보면 val%10

12 = %00010010 

이제

0001 0010 
    1 2 

때문에 이진 표기법에 다음과 같이 번호 (12)가 보인다 1 위 자리 (즉, 마지막 자리)의 가치를 계산합니다. 이것은 바이트의 아래 부분으로 이동하기 때문에 여기서 특별한 것을 할 필요가 없습니다. val/10*16은 먼저 십 자리의 값을 계산합니다 - val/10. 그러나 값이 바이트의 위쪽 절반으로 이동해야하므로 4 비트 씩 위로 이동해야합니다 (따라서 *16). 이 기능을 쓰는 또 다른 (제 생각에 더 읽기) 방법은 다음과 같습니다

((val/10) << 4) | (val % 10) 

bcdToDec는 역 변환을 수행합니다.

+0

감사합니다. 나에게 의미가 있습니다! 비록 내가이 코드를 기초로 생각할지라도, 누군가가이 RTC에서 어떻게 해를 추출 할 것인가? 0-99에서 숫자 만 얻을 수 있다면? 2014는 2 진수 코드화 된 소수 자리로 반환됩니까? –

+1

코드를 보지 않아서 어떻게이 함수를 사용하고 있는지 알 수 없습니다. 난 그들이 짧은 (16 비트) 변수에 저장해야한다고 생각하고 두 번 방법을 호출하여 두 bcd 바이트로 변환 할 수 있습니다 - 한 세기 동안 (년/100) 한 번 년 동안 (년 % 100) – Pawel