第61节:组合和非组合BCD码以及数值相互转换
时间:11-22
来源:互联网
点击:
- service();//串口服务程序
- }
- }
- void number_to_BCD4(const unsigned char *p_ucNumber,unsigned char *p_ucBCD_bit4)//把数值转换成组合BCD码
- {
- unsigned long ulNumberTemp=0;
- unsigned char ucTemp=0;
- ulNumberTemp=p_ucNumber[3];//把4个字节的数值合并成一个long类型数据
- ulNumberTemp=ulNumberTemp<8;
- ulNumberTemp=ulNumberTemp+p_ucNumber[2];
- ulNumberTemp=ulNumberTemp<8;
- ulNumberTemp=ulNumberTemp+p_ucNumber[1];
- ulNumberTemp=ulNumberTemp<8;
- ulNumberTemp=ulNumberTemp+p_ucNumber[0];
- p_ucBCD_bit4[3]=ulNumberTemp%100000000/10000000;
- p_ucBCD_bit4[3]=p_ucBCD_bit4[3]<4; //前半4位存第8位组合BCD码
- ucTemp=ulNumberTemp%10000000/1000000;
- p_ucBCD_bit4[3]=p_ucBCD_bit4[3]+ucTemp; //后半4位存第7位组合BCD码
- p_ucBCD_bit4[2]=ulNumberTemp%1000000/100000;
- p_ucBCD_bit4[2]=p_ucBCD_bit4[2]<4; //前半4位存第6位组合BCD码
- ucTemp=ulNumberTemp%100000/10000;
- p_ucBCD_bit4[2]=p_ucBCD_bit4[2]+ucTemp;//后半4位存第5位组合BCD码
- p_ucBCD_bit4[1]=ulNumberTemp%10000/1000;
- p_ucBCD_bit4[1]=p_ucBCD_bit4[1]<4; //前半4位存第4位组合BCD码
- ucTemp=ulNumberTemp%1000/100;
- p_ucBCD_bit4[1]=p_ucBCD_bit4[1]+ucTemp;//后半4位存第3位组合BCD码
- p_ucBCD_bit4[0]=ulNumberTemp%100/10;
- p_ucBCD_bit4[0]=p_ucBCD_bit4[0]<4; //前半4位存第2位组合BCD码
- ucTemp=ulNumberTemp%10;
- p_ucBCD_bit4[0]=p_ucBCD_bit4[0]+ucTemp;//后半4位存第1位组合BCD码
- }
- void number_to_BCD8(const unsigned char *p_ucNumber,unsigned char *p_ucBCD_bit8)//把数值转换成非组合BCD码
- {
- unsigned long ulNumberTemp=0;
- ulNumberTemp=p_ucNumber[3];//把4个字节的数值合并成一个long类型数据
- ulNumberTemp=ulNumberTemp<8;
- ulNumberTemp=ulNumberTemp+p_ucNumber[2];
- ulNumberTemp=ulNumberTemp<8;
- ulNumberTemp=ulNumberTemp+p_ucNumber[1];
- ulNumberTemp=ulNumberTemp<8;
- ulNumberTemp=ulNumberTemp+p_ucNumber[0];
- p_ucBCD_bit8[7]=ulNumberTemp%100000000/10000000;//一个字节8位存储第8位非组合BCD码
- p_ucBCD_bit8[6]=ulNumberTemp%10000000/1000000;//一个字节8位存储第7位非组合BCD码
- p_ucBCD_bit8[5]=ulNumberTemp%1000000/100000;//一个字节8位存储第6位非组合BCD码
- p_ucBCD_bit8[4]=ulNumberTemp%100000/10000;//一个字节8位存储第5位非组合BCD码
- p_ucBCD_bit8[3]=ulNumberTemp%10000/1000;//一个字节8位存储第4位非组合BCD码
- p_ucBCD_bit8[2]=ulNumberTemp%1000/100;//一个字节8位存储第3位非组合BCD码
- p_ucBCD_bit8[1]=ulNumberTemp%100/10;//一个字节8位存储第2位非组合BCD码
- p_ucBCD_bit8[0]=ulNumberTemp%10;//一个字节8位存储第1位非组合BCD码
- }
- void BCD4_to_number(const unsigned char *p_ucBCD_bit4,unsigned char *p_ucNumber) //组合BCD码转成数值
- {
- unsigned long ulTmep;
- unsigned long ulSum;
- ulSum=0;//累加和数值清零
- ulTmep=0;
- ulTmep=p_ucBCD_bit4[3];
- ulTmep=ulTmep>>4;//把组合BCD码第8位分解出来
- ulTmep=ulTmep*10000000;
- ulSum=ulSum+ulTmep; //累加各位数值
- ulTmep=0;
- ulTmep=p_ucBCD_bit4[3];
- ulTmep=ulTmep&0x0000000f;//把组合BCD码第7位分解出来
- ulTmep=ulTmep*1000000;
- ulSum=ulSum+ulTmep; //累加各位数值
- ulTmep=0;
- ulTmep=p_ucBCD_bit4[2];
- ulTmep=ulTmep>>4;//把组合BCD码第6位分解出来
- ulTmep=ulTmep*100000;
- ulSum=ulSum+ulTmep; //累加各位数值
- ulTmep=0;
- ulTmep=p_ucBCD_bit4[2];
- ulTmep=ulTmep&0x0000000f;//把组合BCD码第5位分解出来
- ulTmep=ulTmep*10000;
- ulSum=ulSum+ulTmep; //累加各位数值
- ulTmep=0;
- ulTmep=p_ucBCD_bit4[1];
- ulTmep=ulTmep>>4;//把组合BCD码第4位分解出来
- ulTmep=ulTmep*1000;
- ulSum=ulSum+ulTmep; //累加各位数值
- ulTmep=0;
- ulTmep=p_ucBCD_bit4[1];
- ulTmep=ulTmep&0x0000000f;//把组合BCD码第3位分解出来
- ulTmep=ulTmep*100;
- ulSum=ulSum+ulTmep; //累加各位数值
- ulTmep=0;
- ulTmep=p_ucBCD_bit4[0];
- ulTmep=ulTmep>>4;//把组合BCD码第2位分解出来
- ulTmep=ulTmep*10;
- ulSum=ulSum+ulTmep; //累加各位数值
- ulTmep=0;
- ulTmep=p_ucBCD_bit4[0];
- ulTmep=ulTmep&0x0000000f;//把组合BCD码第1位分解出来
- ulTmep=ulTmep*1;
- ulSum=ulSum+ulTmep; //累加各位数值
- //以上代码非常有规律,有兴趣的读者也可以自己想办法把它压缩成一个for循环的函数,可以极大节省容量。
- p_ucNumber[3]=ulSum>>24;//把long类型数据分解成4个字节
- p_ucNumber[2]=ulSum>>16;
- p_ucNumber[1]=ulSum>> p_ucNum
组合非组合BCD码数值相互转 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)