二进制怎样转换成8421BCD码?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二进制怎样转换成8421BCD码?相关的知识,希望对你有一定的参考价值。
在单片机里面,如:显示个温度值,这时,要取一个数的个位、十位、百位,可以用/和 %(求商和求余)来解决。但是,在FPGA里面用求商和求余将会非常消耗资源,这样就必须用到二进制转BCD码了,这里介绍一种简单的加3移位算法。
以二进制数(0000_101 Xn)B=(10+Xn)D为例,
串行输入三位后,(0101)B=5(D)
左移一位后:(0000_101Xn)B=(10+Xn)D
如果(0000_101Xn)B直接输出显示为:
当Xn=0时,0000_1010=0x0A。此为错误的BCD码。
采用加3移位法,修正移位结果:
串行输入三位后,结果大于4
(0101)B=5(D)
加3:(0101)B+(0011)B=(1000)B --十进制表示:5+3=8
再左移一位后:
(1000Xn)B= (0001_000Xn)BCD
对应十进制显示:1 Xn
每四位BCD码对应一位十进制数,即:(10+Xn)D,转换成功
注:Xn为下一位串行输入的二进制数。
扩展资料:
一个十进制数转换为二进制数要分整数部分和小数部分分别转换,最后再组合到一起。
整数部分采用 "除2取余,逆序排列"法。具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。例:125。
参考资料来源:百度百科-二进制
参考技术A二进制怎么换成 8421BCD 码?
可以通过如下电路,实现转换,并且显示:
c语言中int转成bcd码,16进制 10进制 BCD码之间的转换
分类: C&C++ 2012-03-04 17:24 2278人阅读 评论(0) 收藏 举报
#include
#include
/
//
//功能:二进制取反
//
//输入:const unsigned char *src 二进制数据
// int length 待转换的二进制数据长度
//
//输出:unsigned char *dst 取反后的二进制数据
//
//返回:0 success
//
//
int convert(unsigned char *dst, const unsigned char *src, int length)
{
int i;
for(i=0; i
{
dst[i] = src[i]^0xFF;
}
return 0;
}
//
//
//功能:十六进制转为十进制
//
//输入:const unsigned char *hex 待转换的十六进制数据
// int length 十六进制数据长度
//
//输出:
//
//返回:int rslt 转换后的十进制数据
//
//思路:十六进制每个字符位所表示的十进制数的范围是0 ~255,进制为256
// 左移8位(<<8)等价乘以256
//
/
unsigned long HextoDec(const unsigned char *hex, int length)
{
int i;
unsigned long rslt = 0;
for(i=0; i
{
rslt += (unsigned int)(hex[i])<
}
return rslt;
}
/
//
//功能:十进制转十六进制
//
//输入:int dec 待转换的十进制数据
// int length 转换后的十六进制数据长度
//
//输出:unsigned char *hex 转换后的十六进制数据
//
//返回:0 success
//
//思路:原理同十六进制转十进制
//
int DectoHex(int dec, unsigned char *hex, int length)
{
int i;
for(i=length-1; i>=0; i--)
{
hex[i] = (dec%256)&0xFF;
dec /= 256;
}
return 0;
}
/
//
//功能:求权
//
//输入:int base 进制基数
// int times 权级数
//
//输出:
//
//返回:unsigned long 当前数据位的权
//
//
unsigned long power(int base, int times)
{
int i;
unsigned long rslt = 1;
for(i=0; i
rslt *= base;
return rslt;
}
/
//
//功能:BCD转10进制
//
//输入:const unsigned char *bcd 待转换的BCD码
// int length BCD码数据长度
//
//输出:
//
//返回:unsigned long 当前数据位的权
//
//思路:压缩BCD码一个字符所表示的十进制数据范围为0 ~ 99,进制为100
// 先求每个字符所表示的十进制值,然后乘以权
//
unsigned long BCDtoDec(const unsigned char *bcd, int length)
{
int i, tmp;
unsigned long dec = 0;
for(i=0; i
{
tmp = ((bcd[i]>>4)&0x0F)*10 + (bcd[i]&0x0F);
dec += tmp * power(100, length-1-i);
}
return dec;
}
/
//
//功能:十进制转BCD码
//
//输入:int Dec 待转换的十进制数据
// int length BCD码数据长度
//
//输出:unsigned char *Bcd 转换后的BCD码
//
//返回:0 success
//
//思路:原理同BCD码转十进制
//
//
int DectoBCD(int Dec, unsigned char *Bcd, int length)
{
int i;
int temp;
for(i=length-1; i>=0; i--)
{
temp = Dec%100;
Bcd[i] = ((temp/10)<<4) + ((temp%10) & 0x0F);
Dec /= 100;
}
return 0;
}
int main()
{
register int i;
unsigned char tmp_bff[12] = "";
//十六进制转十进制
unsigned char HEX[4] = {0x34, 0xFE, 0x3E, 0xFF};
unsigned long dec_hex = 0;
dec_hex = HextoDec(HEX, 4);
printf("dec_hex = %d\\n", dec_hex);
//十进制转十六进制
DectoHex(dec_hex, tmp_bff, 4);
for(i=0; i<5; i++)
{
printf("tmp_bff[%d] = 0x%02X\\n",i, tmp_bff[i]);
}
//BCD码转十进制
unsigned long dec_bcd = 0;
unsigned char BCD[4] = {0x98, 0x23, 0x45, 0x78};
dec_bcd = BCDtoDec(BCD, 4);
printf("dec_bcd = %d\\n", dec_bcd);
//十进制转BCD码
DectoBCD(dec_bcd, tmp_bff, 4);
for(i=0; i<5; i++)
{
printf("tmp_bff[%d] = 0x%02X\\n", i, tmp_bff[i]);
}
getchar();
}
4月30日
16进制、10进制、BCD码之间的转换
#include
#include
/
//
//功能:二进制取反
//
//输入:const unsigned char *src 二进制数据
// int length 待转换的二进制数据长度
//
//输出:unsigned char *dst 取反后的二进制数据
//
//返回:0 success
//
//
int convert(unsigned char *dst, const unsigned char *src, int length)
{
int i;
for(i=0; i
{
dst[i] = src[i]^0xFF;
}
return 0;
}
//
//
//功能:十六进制转为十进制
//
//输入:const unsigned char *hex 待转换的十六进制数据
// int length 十六进制数据长度
//
//输出:
//
//返回:int rslt 转换后的十进制数据
//
//思路:十六进制每个字符位所表示的十进制数的范围是0 ~255,进制为256
// 左移8位(<<8)等价乘以256
//
/
unsigned long HextoDec(const unsigned char *hex, int length)
{
int i;
unsigned long rslt = 0;
for(i=0; i
{
rslt += (unsigned int)(hex[i])<
}
return rslt;
}
/
//
//功能:十进制转十六进制
//
//输入:int dec 待转换的十进制数据
// int length 转换后的十六进制数据长度
//
//输出:unsigned char *hex 转换后的十六进制数据
//
//返回:0 success
//
//思路:原理同十六进制转十进制
//
int DectoHex(int dec, unsigned char *hex, int length)
{
int i;
for(i=length-1; i>=0; i--)
{
hex[i] = (dec%256)&0xFF;
dec /= 256;
}
return 0;
}
/
//
//功能:求权
//
//输入:int base 进制基数
// int times 权级数
//
//输出:
//
//返回:unsigned long 当前数据位的权
//
//
unsigned long power(int base, int times)
{
int i;
unsigned long rslt = 1;
for(i=0; i
rslt *= base;
return rslt;
}
/
//
//功能:BCD转10进制
//
//输入:const unsigned char *bcd 待转换的BCD码
// int length BCD码数据长度
//
//输出:
//
//返回:unsigned long 当前数据位的权
//
//思路:压缩BCD码一个字符所表示的十进制数据范围为0 ~ 99,进制为100
// 先求每个字符所表示的十进制值,然后乘以权
//
unsigned long BCDtoDec(const unsigned char *bcd, int length)
{
int i, tmp;
unsigned long dec = 0;
for(i=0; i
{
tmp = ((bcd[i]>>4)&0x0F)*10 + (bcd[i]&0x0F);
dec += tmp * power(100, length-1-i);
}
return dec;
}
/
//
//功能:十进制转BCD码
//
//输入:int Dec 待转换的十进制数据
// int length BCD码数据长度
//
//输出:unsigned char *Bcd 转换后的BCD码
//
//返回:0 success
//
//思路:原理同BCD码转十进制
//
//
int DectoBCD(int Dec, unsigned char *Bcd, int length)
{
int i;
int temp;
for(i=length-1; i>=0; i--)
{
temp = Dec%100;
Bcd[i] = ((temp/10)<<4) + ((temp%10) & 0x0F);
Dec /= 100;
}
return 0;
}
int main()
{
register int i;
unsigned char tmp_bff[12] = "";
//十六进制转十进制
unsigned char HEX[4] = {0x34, 0xFE, 0x3E, 0xFF};
unsigned long dec_hex = 0;
dec_hex = HextoDec(HEX, 4);
printf("dec_hex = %d\\n", dec_hex);
//十进制转十六进制
DectoHex(dec_hex, tmp_bff, 4);
for(i=0; i<5; i++)
{
printf("tmp_bff[%d] = 0x%02X\\n",i, tmp_bff[i]);
}
//BCD码转十进制
unsigned long dec_bcd = 0;
unsigned char BCD[4] = {0x98, 0x23, 0x45, 0x78};
dec_bcd = BCDtoDec(BCD, 4);
printf("dec_bcd = %d\\n", dec_bcd);
//十进制转BCD码
DectoBCD(dec_bcd, tmp_bff, 4);
for(i=0; i<5; i++)
{
printf("tmp_bff[%d] = 0x%02X\\n", i, tmp_bff[i]);
}
getchar();
}
以上是关于二进制怎样转换成8421BCD码?的主要内容,如果未能解决你的问题,请参考以下文章