第61节:组合和非组合BCD码以及数值相互转换
时间:11-22
来源:互联网
点击:
- /把数值转换成非组合BCD码
- for(i=0;i<4;i++)
- {
- eusart_send(ucBufferBCB_bit4[3-i]);////把组合BCD码返回给上位机观察,注意,高位在数组下标大的方向
- }
- eusart_send(0xee);//为了方便上位机观察,多发送3个字节ee ee ee作为分割线
- eusart_send(0xee);
- eusart_send(0xee);
- for(i=0;i<8;i++)
- {
- eusart_send(ucBufferBCB_bit8[7-i]);////把非组合BCD码返回给上位机观察,注意,高位在数组下标大的方向
- }
- break;
- case 2://接收到的是组合BCD码,需要转成数值和非组合BCD码
- for(i=0;i<4;i++)
- {
- ucBufferBCB_bit4[3-i]=ucRcregBuf[uiRcMoveIndex+4+i]; //从串口接收到的组合BCD码,注意,高位在数组下标大的方向
- }
- BCD4_to_number(ucBufferBCB_bit4,ucBufferNumber); //组合BCD码转成数值
- BCD4_to_BCD8(ucBufferBCB_bit4,ucBufferBCB_bit8); //组合BCD码转成非组合BCD码
- for(i=0;i<4;i++)
- {
- eusart_send(ucBufferNumber[3-i]);////把数值返回给上位机观察,注意,高位在数组下标大的方向
- }
- eusart_send(0xee);//为了方便上位机观察,多发送3个字节ee ee ee作为分割线
- eusart_send(0xee);
- eusart_send(0xee);
- for(i=0;i<8;i++)
- {
- eusart_send(ucBufferBCB_bit8[7-i]);////把非组合BCD码返回给上位机观察,注意,高位在数组下标大的方向
- }
- break;
- case 3://接收到的是非组合BCD码,需要转成数值和组合BCD码
- for(i=0;i<8;i++)
- {
- ucBufferBCB_bit8[7-i]=ucRcregBuf[uiRcMoveIndex+4+i]; //从串口接收到的非组合BCD码,注意,高位在数组下标大的方向
- }
- BCD8_to_number(ucBufferBCB_bit8,ucBufferNumber); //非组合BCD码转成数值
- BCD8_to_BCD4(ucBufferBCB_bit8,ucBufferBCB_bit4); //非组合BCD码转成组合BCD码
- for(i=0;i<4;i++)
- {
- eusart_send(ucBufferNumber[3-i]);////把数值返回给上位机观察
- }
- eusart_send(0xee);//为了方便上位机观察,多发送3个字节ee ee ee作为分割线,注意,高位在数组下标大的方向
- eusart_send(0xee);
- eusart_send(0xee);
- for(i=0;i<4;i++)
- {
- eusart_send(ucBufferBCB_bit4[3-i]);////把组合BCD码返回给上位机观察,注意,高位在数组下标大的方向
- }
- break;
- }
- break; //退出循环
- }
- uiRcMoveIndex++; //因为是判断数据头,游标向着数组最尾端的方向移动
- }
- uiRcregTotal=0;//清空缓冲的下标,方便下次重新从0下标开始接受新数据
- }
- }
- void eusart_send(unsigned char ucSendData) //往上位机发送一个字节的函数
- {
- ES = 0; //关串口中断
- TI = 0; //清零串口发送完成中断请求标志
- SBUF =ucSendData; //发送一个字节
- delay_short(400);//每个字节之间的延时,这里非常关键,也是最容易出错的地方。延时的大小请根据实际项目来调整
- TI = 0; //清零串口发送完成中断请求标志
- ES = 1; //允许串口中断
- }
- void T0_time(void) interrupt 1 //定时中断
- {
- TF0=0;//清除中断标志
- TR0=0; //关中断
- if(uiSendCnt
- {
- uiSendCnt++; //表面上这个数据不断累加,但是在串口中断里,每接收一个字节它都会被清零,除非这个中间没有串口数据过来
- ucSendLock=1; //开自锁标志
- }
- TH0=0xfe; //重装初始值(65535-500)=65035=0xfe0b
- TL0=0x0b;
- TR0=1;//开中断
- }
- void usart_receive(void) interrupt 4 //串口接收数据中断
- {
- if(RI==1)
- {
- RI = 0;
- ++uiRcregTotal;
- if(uiRcregTotal>const_rc_size)//超过缓冲区
- {
- uiRcregTotal=const_rc_size;
- }
- ucRcregBuf[uiRcregTotal-1]=SBUF; //将串口接收到的数据缓存到接收缓冲区里
- uiSendCnt=0;//及时喂狗,虽然main函数那边不断在累加,但是只要串口的数据还没发送完毕,那么它永远也长不大,因为每个中断都被清零。
- }
- else//发送中断,及时把发送中断标志位清零
- {
- TI = 0;
- }
- }
- void delay_long(unsigned int uiDelayLong)
- {
- unsigned int i;
- unsigned int j;
- fo
组合非组合BCD码数值相互转 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)