微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第61节:组合和非组合BCD码以及数值相互转换

第61节:组合和非组合BCD码以及数值相互转换

时间:11-22 来源:互联网 点击:

  1. p_ucNumber[1]=ulSum>>ber[1]=ulSum>>8;
  2. p_ucNumber[0]=ulSum;
  3. }
  4. void BCD4_to_BCD8(const unsigned char *p_ucBCD_bit4,unsigned char *p_ucBCD_bit8) //组合BCD码转成非组合BCD码
  5. {
  6. unsigned char ucTmep;
  7. ucTmep=p_ucBCD_bit4[3];
  8. p_ucBCD_bit8[7]=ucTmep>>4; //把组合BCD码第8位分解出来
  9. p_ucBCD_bit8[6]=ucTmep&0x0f;//把组合BCD码第7位分解出来
  10. ucTmep=p_ucBCD_bit4[2];
  11. p_ucBCD_bit8[5]=ucTmep>>4; //把组合BCD码第6位分解出来
  12. p_ucBCD_bit8[4]=ucTmep&0x0f;//把组合BCD码第5位分解出来
  13. ucTmep=p_ucBCD_bit4[1];
  14. p_ucBCD_bit8[3]=ucTmep>>4; //把组合BCD码第4位分解出来
  15. p_ucBCD_bit8[2]=ucTmep&0x0f;//把组合BCD码第3位分解出来
  16. ucTmep=p_ucBCD_bit4[0];
  17. p_ucBCD_bit8[1]=ucTmep>>4; //把组合BCD码第2位分解出来
  18. p_ucBCD_bit8[0]=ucTmep&0x0f;//把组合BCD码第1位分解出来
  19. }
  20. void BCD8_to_number(const unsigned char *p_ucBCD_bit8,unsigned char *p_ucNumber) //非组合BCD码转成数值
  21. {
  22. unsigned long ulTmep;
  23. unsigned long ulSum;
  24. ulSum=0;//累加和数值清零
  25. ulTmep=0;
  26. ulTmep=p_ucBCD_bit8[7];
  27. ulTmep=ulTmep*10000000;
  28. ulSum=ulSum+ulTmep; //累加各位数值
  29. ulTmep=0;
  30. ulTmep=p_ucBCD_bit8[6];
  31. ulTmep=ulTmep*1000000;
  32. ulSum=ulSum+ulTmep; //累加各位数值
  33. ulTmep=0;
  34. ulTmep=p_ucBCD_bit8[5];
  35. ulTmep=ulTmep*100000;
  36. ulSum=ulSum+ulTmep; //累加各位数值
  37. ulTmep=0;
  38. ulTmep=p_ucBCD_bit8[4];
  39. ulTmep=ulTmep*10000;
  40. ulSum=ulSum+ulTmep; //累加各位数值
  41. ulTmep=0;
  42. ulTmep=p_ucBCD_bit8[3];
  43. ulTmep=ulTmep*1000;
  44. ulSum=ulSum+ulTmep; //累加各位数值
  45. ulTmep=0;
  46. ulTmep=p_ucBCD_bit8[2];
  47. ulTmep=ulTmep*100;
  48. ulSum=ulSum+ulTmep; //累加各位数值
  49. ulTmep=0;
  50. ulTmep=p_ucBCD_bit8[1];
  51. ulTmep=ulTmep*10;
  52. ulSum=ulSum+ulTmep; //累加各位数值
  53. ulTmep=0;
  54. ulTmep=p_ucBCD_bit8[0];
  55. ulTmep=ulTmep*1;
  56. ulSum=ulSum+ulTmep; //累加各位数值
  57. //以上代码非常有规律,有兴趣的读者也可以自己想办法把它压缩成一个for循环的函数,可以极大节省容量。
  58. p_ucNumber[3]=ulSum>>24;//把long类型数据分解成4个字节
  59. p_ucNumber[2]=ulSum>>16;
  60. p_ucNumber[1]=ulSum>>8;
  61. p_ucNumber[0]=ulSum;
  62. }
  63. void BCD8_to_BCD4(const unsigned char *p_ucBCD_bit8,unsigned char *p_ucBCD_bit4) //非组合BCD码转成组合BCD码
  64. {
  65. unsigned char ucTmep;
  66. ucTmep=p_ucBCD_bit8[7]; //把非组合BCD码第8位分解出来
  67. p_ucBCD_bit4[3]=ucTmep<4;
  68. p_ucBCD_bit4[3]=p_ucBCD_bit4[3]+p_ucBCD_bit8[6]; //把非组合BCD码第7位分解出来
  69. ucTmep=p_ucBCD_bit8[5]; //把非组合BCD码第6位分解出来
  70. p_ucBCD_bit4[2]=ucTmep<4;
  71. p_ucBCD_bit4[2]=p_ucBCD_bit4[2]+p_ucBCD_bit8[4]; //把非组合BCD码第5位分解出来
  72. ucTmep=p_ucBCD_bit8[3]; //把非组合BCD码第4位分解出来
  73. p_ucBCD_bit4[1]=ucTmep<4;
  74. p_ucBCD_bit4[1]=p_ucBCD_bit4[1]+p_ucBCD_bit8[2]; //把非组合BCD码第3位分解出来
  75. ucTmep=p_ucBCD_bit8[1]; //把非组合BCD码第2位分解出来
  76. p_ucBCD_bit4[0]=ucTmep<4;
  77. p_ucBCD_bit4[0]=p_ucBCD_bit4[0]+p_ucBCD_bit8[0]; //把非组合BCD码第1位分解出来
  78. }
  79. void usart_service(void)//串口服务程序,在main函数里
  80. {
  81. unsigned char i=0;
  82. if(uiSendCnt>=const_receive_time&&ucSendLock==1) //说明超过了一定的时间内,再也没有新数据从串口来
  83. {
  84. ucSendLock=0; //处理一次就锁起来,不用每次都进来,除非有新接收的数据
  85. //下面的代码进入数据协议解析和数据处理的阶段
  86. uiRcMoveIndex=0; //由于是判断数据头,所以下标移动变量从数组的0开始向最尾端移动
  87. while(uiRcregTotal>=5&&uiRcMoveIndex<=(uiRcregTotal-5))
  88. {
  89. if(ucRcregBuf[uiRcMoveIndex+0]==0xeb&&ucRcregBuf[uiRcMoveIndex+1]==0x00&&ucRcregBuf[uiRcMoveIndex+2]==0x55)//数据头eb 00 55的判断
  90. {
  91. switch(ucRcregBuf[uiRcMoveIndex+3])//根据命令类型来进行不同的处理
  92. {
  93. case 1://接收到的是数值,需要转成组合BCD码和非组合BCD码
  94. for(i=0;i<4;i++)
  95. {
  96. ucBufferNumber[3-i]=ucRcregBuf[uiRcMoveIndex+4+i]; //从串口接收到的数据,注意,高位在数组下标大的方向
  97. }
  98. number_to_BCD4(ucBufferNumber,ucBufferBCB_bit4);//把数值转换成组合BCD码
  99. number_to_BCD8(ucBufferNumber,ucBufferBCB_bit8);/

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top