第61节:组合和非组合BCD码以及数值相互转换
时间:11-22
来源:互联网
点击:
- p_ucNumber[1]=ulSum>>ber[1]=ulSum>>8;
- p_ucNumber[0]=ulSum;
- }
- void BCD4_to_BCD8(const unsigned char *p_ucBCD_bit4,unsigned char *p_ucBCD_bit8) //组合BCD码转成非组合BCD码
- {
- unsigned char ucTmep;
- ucTmep=p_ucBCD_bit4[3];
- p_ucBCD_bit8[7]=ucTmep>>4; //把组合BCD码第8位分解出来
- p_ucBCD_bit8[6]=ucTmep&0x0f;//把组合BCD码第7位分解出来
- ucTmep=p_ucBCD_bit4[2];
- p_ucBCD_bit8[5]=ucTmep>>4; //把组合BCD码第6位分解出来
- p_ucBCD_bit8[4]=ucTmep&0x0f;//把组合BCD码第5位分解出来
- ucTmep=p_ucBCD_bit4[1];
- p_ucBCD_bit8[3]=ucTmep>>4; //把组合BCD码第4位分解出来
- p_ucBCD_bit8[2]=ucTmep&0x0f;//把组合BCD码第3位分解出来
- ucTmep=p_ucBCD_bit4[0];
- p_ucBCD_bit8[1]=ucTmep>>4; //把组合BCD码第2位分解出来
- p_ucBCD_bit8[0]=ucTmep&0x0f;//把组合BCD码第1位分解出来
- }
- void BCD8_to_number(const unsigned char *p_ucBCD_bit8,unsigned char *p_ucNumber) //非组合BCD码转成数值
- {
- unsigned long ulTmep;
- unsigned long ulSum;
- ulSum=0;//累加和数值清零
- ulTmep=0;
- ulTmep=p_ucBCD_bit8[7];
- ulTmep=ulTmep*10000000;
- ulSum=ulSum+ulTmep; //累加各位数值
- ulTmep=0;
- ulTmep=p_ucBCD_bit8[6];
- ulTmep=ulTmep*1000000;
- ulSum=ulSum+ulTmep; //累加各位数值
- ulTmep=0;
- ulTmep=p_ucBCD_bit8[5];
- ulTmep=ulTmep*100000;
- ulSum=ulSum+ulTmep; //累加各位数值
- ulTmep=0;
- ulTmep=p_ucBCD_bit8[4];
- ulTmep=ulTmep*10000;
- ulSum=ulSum+ulTmep; //累加各位数值
- ulTmep=0;
- ulTmep=p_ucBCD_bit8[3];
- ulTmep=ulTmep*1000;
- ulSum=ulSum+ulTmep; //累加各位数值
- ulTmep=0;
- ulTmep=p_ucBCD_bit8[2];
- ulTmep=ulTmep*100;
- ulSum=ulSum+ulTmep; //累加各位数值
- ulTmep=0;
- ulTmep=p_ucBCD_bit8[1];
- ulTmep=ulTmep*10;
- ulSum=ulSum+ulTmep; //累加各位数值
- ulTmep=0;
- ulTmep=p_ucBCD_bit8[0];
- ulTmep=ulTmep*1;
- ulSum=ulSum+ulTmep; //累加各位数值
- //以上代码非常有规律,有兴趣的读者也可以自己想办法把它压缩成一个for循环的函数,可以极大节省容量。
- p_ucNumber[3]=ulSum>>24;//把long类型数据分解成4个字节
- p_ucNumber[2]=ulSum>>16;
- p_ucNumber[1]=ulSum>>8;
- p_ucNumber[0]=ulSum;
- }
- void BCD8_to_BCD4(const unsigned char *p_ucBCD_bit8,unsigned char *p_ucBCD_bit4) //非组合BCD码转成组合BCD码
- {
- unsigned char ucTmep;
- ucTmep=p_ucBCD_bit8[7]; //把非组合BCD码第8位分解出来
- p_ucBCD_bit4[3]=ucTmep<4;
- p_ucBCD_bit4[3]=p_ucBCD_bit4[3]+p_ucBCD_bit8[6]; //把非组合BCD码第7位分解出来
- ucTmep=p_ucBCD_bit8[5]; //把非组合BCD码第6位分解出来
- p_ucBCD_bit4[2]=ucTmep<4;
- p_ucBCD_bit4[2]=p_ucBCD_bit4[2]+p_ucBCD_bit8[4]; //把非组合BCD码第5位分解出来
- ucTmep=p_ucBCD_bit8[3]; //把非组合BCD码第4位分解出来
- p_ucBCD_bit4[1]=ucTmep<4;
- p_ucBCD_bit4[1]=p_ucBCD_bit4[1]+p_ucBCD_bit8[2]; //把非组合BCD码第3位分解出来
- ucTmep=p_ucBCD_bit8[1]; //把非组合BCD码第2位分解出来
- p_ucBCD_bit4[0]=ucTmep<4;
- p_ucBCD_bit4[0]=p_ucBCD_bit4[0]+p_ucBCD_bit8[0]; //把非组合BCD码第1位分解出来
- }
- void usart_service(void)//串口服务程序,在main函数里
- {
- unsigned char i=0;
- if(uiSendCnt>=const_receive_time&&ucSendLock==1) //说明超过了一定的时间内,再也没有新数据从串口来
- {
- ucSendLock=0; //处理一次就锁起来,不用每次都进来,除非有新接收的数据
- //下面的代码进入数据协议解析和数据处理的阶段
- uiRcMoveIndex=0; //由于是判断数据头,所以下标移动变量从数组的0开始向最尾端移动
- while(uiRcregTotal>=5&&uiRcMoveIndex<=(uiRcregTotal-5))
- {
- if(ucRcregBuf[uiRcMoveIndex+0]==0xeb&&ucRcregBuf[uiRcMoveIndex+1]==0x00&&ucRcregBuf[uiRcMoveIndex+2]==0x55)//数据头eb 00 55的判断
- {
- switch(ucRcregBuf[uiRcMoveIndex+3])//根据命令类型来进行不同的处理
- {
- case 1://接收到的是数值,需要转成组合BCD码和非组合BCD码
- for(i=0;i<4;i++)
- {
- ucBufferNumber[3-i]=ucRcregBuf[uiRcMoveIndex+4+i]; //从串口接收到的数据,注意,高位在数组下标大的方向
- }
- number_to_BCD4(ucBufferNumber,ucBufferBCB_bit4);//把数值转换成组合BCD码
- number_to_BCD8(ucBufferNumber,ucBufferBCB_bit8);/
组合非组合BCD码数值相互转 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)