目录1,复杂版
2、简易版
最近,要写单片机的RTC日期、时间配置,必须实现十进制、BCD码交换。 和大家分享那个Demo。
BCD是以二进制表示十进制数的符号。 也就是说,由于一位十进制数表示为四位二进制数,所以四位二进制数表示最大的十进制数9(1001 )。
4位BCD代码无法表示10进制的2位,如果数字大于9,则必须用8位BCD代码表示。 高位都可以是九进一。
十进制是所有的十进制,而十六进制是所有的十六进制,它们之间的进位差每次为6,所以要把十进制转换成BCD码,必须先计算多进制的位数。
将两个BCD代码相加时,如果和小于或等于1001,即小于或等于十进制9,则无需修改。
如果求和介于1010到1111 (即十六进制0ah到0fh )之间,则必须添加6进行修改。
例如,十进制99提前了99/10=9次。 由于每次提前与十六进制提前相比相差6,所以总共相差96=54。 也就是说,BCD代码为9954=153 (十六进制: 0X99 )。 BCD码转换为十进制码也是同样的原理。
1、将复杂版的十进制数转换成BCD码。 代码如下。
intdecimal_BCD_code(intdecimal ) {int sum=0; //sum返回的BCD代码for(intI=0; decimal 0; I ) sum|=() decimal ) )4*i ) ); decimal /=10; }return sum; } BCD代码转换为十进制数字,代码如下所示:
intBCD_decimal_code(intBCD ) {int sum=0,c=1; //sum返回十进制数,c每次增加10倍的for(intI=1; bcd 0; I ) if(I=2) {c*=10; (sum=) BCD ) c; bcd /=16; 与除以//16一样,用十进制除以10,将小数点左移一次,取剩下的16也一样}返回和; ) 2、简易版的十进制转换为BCD代码,代码如下:
intBCD_decimal_code(intBCD ) return (BCD ) BCD/10 ) * 6); } BCD代码转换为十进制数字,代码如下所示:
intdecimal_BCD_code(intdecimal ) return ) decimal-(decimal4) * 6); }参考资料:
一、十进制和BCD码转换的算法
二、十进制转换BCD代码在线工具