重湖叠巘清嘉怎么读:BCD码转换

来源:百度文库 编辑:九乡新闻网 时间:2024/05/01 18:54:45
BCD码转换2009-07-15 16:09

unsigned int ui;//(16位无符号二进制数)
unsigned char uc[5];//(BCD码表示的5位十进制数)

uc[4]=(ui/10000)%10;
uc[3]=(ui/1000)%10;
uc[2]=(ui/100)%10;
uc[1]=(ui/10)%10;
uc[0]=ui%10;


_____________________________________________________________________
今天有人在问我BCD码如何转换成10进制码的问题
其实很简单
BCD 的表示法是 用4个二进制位来表示 一个十进制位,也就是一个字节能够表示2个十进制数位,这是一种压缩的十进制表示方式,应用很广,最常见的就是CMOS里的时间存放格

式就是BCD码格式,更具体的表示方法大家可以去百度一下就知道了不过其实知道我上面说的就差不多了。
明白了BCD是怎么表示后转换也就容易了,低4位和高4位分别转换然后合并起来就是了!
如15用BCD码表示为 0001 0101
低四位的值就是实现十进制数的低四,高4位就是高四位的值,这样我们有很高效的转换方法
低四位+高四位×10 (上面是2位十进制数的)

用C语言表达一下可能更能明白我上面说的意思
#include

int main(void)
{
    /** 15用BCD码表示为 0001 0101 **/
    int bcd = 0x15;
    int dec;

    dec = (bcd & 15) + ((bcd>>4) * 10);

    printf("%d\n",dec);
    return 0;
}

所以实际转换可以定义成一个宏
#define BCDTODEC(bcd)



#include
#define BCDTODEC(bcd) ((bcd) = ((bcd) & 15) + ((bcd)>>4) * 10)
int main(void)
{
    /** 15用BCD码表示为 0001 0101 **/
    int bcd = 0x15;
    BCDTODEC(bcd);
    printf("%d\n",bcd);
    return 0;
}
______________________________________________________________________________________

#define BCD2BIN(val) (((val) & 0x0f) + ((val)>>4)*10)
#define BIN2BCD(val) ((((val)/10)<<4) + (val)%10)


////////////////////////////////////////////////////////////////////////////////////////////////
//函数名:ZH_Data();
//返回参数:有.返回为十进制或十进制BCD码.
//输入参数:State=0 输入为十进制BCD码 输出为十进制.
//输入参数:State=1 输入为十进制,输出为十进制BCD码.
//设计人:wang1jin.
//设计版本:V1.0.
//////////////////////////////////////////////////////////////////////////////////////////////
uint8 ZH_Data(bit State,uint8 Value)
{
if(State==0)                                    //判断工作模式.
{
   Value=(Value/16)*10+(Value%16); //把8421BCD码转为十进制
   return Value;                                //返回;
}
else                                               //把十进制转为8421BCD码;
{
   Value=(Value/10)*16+Value%10;   //把十进制转为8421BCD码.
   return Value;                               //返回;
}
}

______________________________________________________________________________________
//16进制转bcd码
unchar HEXBCD2(unchar bcd_data)    //hex转为bcd子程序
        {
            unchar temp;
            temp=(bcd_data/16*10+bcd_data%16);
            return temp;
        }
unchar BCD2HEX(unchar hex_data)    //BCD转为HEX子程序
        {
            unchar temp;
            temp=(hex_data/10*16+hex_data%10);
            return temp;
        }
______________________________________________________________________________________

 

 


long str16to10(unsigned char *s)
{
//s字符串最大为"FFFFFFFF"
//调用示例:
//   long lRet; lRet=str16to10("a10");   // -- (结果: lRet=2576)
long lRet;
unsigned char ch;

        lRet=0;
        
    while (*s)  
      {
                ch=*s;

                if ((ch >= '0') && (ch <= '9')) ch -= '0';
                else if ((ch >= 'A') && (ch <= 'F')) ch -= '7';
                else if ((ch >= 'a') && (ch <= 'f')) ch -= 'W';

                //lRet=lRet*16+ch;
                lRet=(lRet<<4)+ch;

        s ++;
      }

        return lRet;
}

____________________________________________________________________________________________
sprintf(char,"%x",int);//将10进制转换成16进制  
sprintf(char,"%o",int);//将10进制转换成8进制

___________________________________________________________________________________________