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

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

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

  1. service();//串口服务程序
  2. }
  3. }
  4. void number_to_BCD4(const unsigned char *p_ucNumber,unsigned char *p_ucBCD_bit4)//把数值转换成组合BCD码
  5. {
  6. unsigned long ulNumberTemp=0;
  7. unsigned char ucTemp=0;
  8. ulNumberTemp=p_ucNumber[3];//把4个字节的数值合并成一个long类型数据
  9. ulNumberTemp=ulNumberTemp<8;
  10. ulNumberTemp=ulNumberTemp+p_ucNumber[2];
  11. ulNumberTemp=ulNumberTemp<8;
  12. ulNumberTemp=ulNumberTemp+p_ucNumber[1];
  13. ulNumberTemp=ulNumberTemp<8;
  14. ulNumberTemp=ulNumberTemp+p_ucNumber[0];
  15. p_ucBCD_bit4[3]=ulNumberTemp%100000000/10000000;
  16. p_ucBCD_bit4[3]=p_ucBCD_bit4[3]<4; //前半4位存第8位组合BCD码
  17. ucTemp=ulNumberTemp%10000000/1000000;
  18. p_ucBCD_bit4[3]=p_ucBCD_bit4[3]+ucTemp; //后半4位存第7位组合BCD码
  19. p_ucBCD_bit4[2]=ulNumberTemp%1000000/100000;
  20. p_ucBCD_bit4[2]=p_ucBCD_bit4[2]<4; //前半4位存第6位组合BCD码
  21. ucTemp=ulNumberTemp%100000/10000;
  22. p_ucBCD_bit4[2]=p_ucBCD_bit4[2]+ucTemp;//后半4位存第5位组合BCD码
  23. p_ucBCD_bit4[1]=ulNumberTemp%10000/1000;
  24. p_ucBCD_bit4[1]=p_ucBCD_bit4[1]<4; //前半4位存第4位组合BCD码
  25. ucTemp=ulNumberTemp%1000/100;
  26. p_ucBCD_bit4[1]=p_ucBCD_bit4[1]+ucTemp;//后半4位存第3位组合BCD码
  27. p_ucBCD_bit4[0]=ulNumberTemp%100/10;
  28. p_ucBCD_bit4[0]=p_ucBCD_bit4[0]<4; //前半4位存第2位组合BCD码
  29. ucTemp=ulNumberTemp%10;
  30. p_ucBCD_bit4[0]=p_ucBCD_bit4[0]+ucTemp;//后半4位存第1位组合BCD码
  31. }
  32. void number_to_BCD8(const unsigned char *p_ucNumber,unsigned char *p_ucBCD_bit8)//把数值转换成非组合BCD码
  33. {
  34. unsigned long ulNumberTemp=0;
  35. ulNumberTemp=p_ucNumber[3];//把4个字节的数值合并成一个long类型数据
  36. ulNumberTemp=ulNumberTemp<8;
  37. ulNumberTemp=ulNumberTemp+p_ucNumber[2];
  38. ulNumberTemp=ulNumberTemp<8;
  39. ulNumberTemp=ulNumberTemp+p_ucNumber[1];
  40. ulNumberTemp=ulNumberTemp<8;
  41. ulNumberTemp=ulNumberTemp+p_ucNumber[0];
  42. p_ucBCD_bit8[7]=ulNumberTemp%100000000/10000000;//一个字节8位存储第8位非组合BCD码
  43. p_ucBCD_bit8[6]=ulNumberTemp%10000000/1000000;//一个字节8位存储第7位非组合BCD码
  44. p_ucBCD_bit8[5]=ulNumberTemp%1000000/100000;//一个字节8位存储第6位非组合BCD码
  45. p_ucBCD_bit8[4]=ulNumberTemp%100000/10000;//一个字节8位存储第5位非组合BCD码
  46. p_ucBCD_bit8[3]=ulNumberTemp%10000/1000;//一个字节8位存储第4位非组合BCD码
  47. p_ucBCD_bit8[2]=ulNumberTemp%1000/100;//一个字节8位存储第3位非组合BCD码
  48. p_ucBCD_bit8[1]=ulNumberTemp%100/10;//一个字节8位存储第2位非组合BCD码
  49. p_ucBCD_bit8[0]=ulNumberTemp%10;//一个字节8位存储第1位非组合BCD码
  50. }
  51. void BCD4_to_number(const unsigned char *p_ucBCD_bit4,unsigned char *p_ucNumber) //组合BCD码转成数值
  52. {
  53. unsigned long ulTmep;
  54. unsigned long ulSum;
  55. ulSum=0;//累加和数值清零
  56. ulTmep=0;
  57. ulTmep=p_ucBCD_bit4[3];
  58. ulTmep=ulTmep>>4;//把组合BCD码第8位分解出来
  59. ulTmep=ulTmep*10000000;
  60. ulSum=ulSum+ulTmep; //累加各位数值
  61. ulTmep=0;
  62. ulTmep=p_ucBCD_bit4[3];
  63. ulTmep=ulTmep&0x0000000f;//把组合BCD码第7位分解出来
  64. ulTmep=ulTmep*1000000;
  65. ulSum=ulSum+ulTmep; //累加各位数值
  66. ulTmep=0;
  67. ulTmep=p_ucBCD_bit4[2];
  68. ulTmep=ulTmep>>4;//把组合BCD码第6位分解出来
  69. ulTmep=ulTmep*100000;
  70. ulSum=ulSum+ulTmep; //累加各位数值
  71. ulTmep=0;
  72. ulTmep=p_ucBCD_bit4[2];
  73. ulTmep=ulTmep&0x0000000f;//把组合BCD码第5位分解出来
  74. ulTmep=ulTmep*10000;
  75. ulSum=ulSum+ulTmep; //累加各位数值
  76. ulTmep=0;
  77. ulTmep=p_ucBCD_bit4[1];
  78. ulTmep=ulTmep>>4;//把组合BCD码第4位分解出来
  79. ulTmep=ulTmep*1000;
  80. ulSum=ulSum+ulTmep; //累加各位数值
  81. ulTmep=0;
  82. ulTmep=p_ucBCD_bit4[1];
  83. ulTmep=ulTmep&0x0000000f;//把组合BCD码第3位分解出来
  84. ulTmep=ulTmep*100;
  85. ulSum=ulSum+ulTmep; //累加各位数值
  86. ulTmep=0;
  87. ulTmep=p_ucBCD_bit4[0];
  88. ulTmep=ulTmep>>4;//把组合BCD码第2位分解出来
  89. ulTmep=ulTmep*10;
  90. ulSum=ulSum+ulTmep; //累加各位数值
  91. ulTmep=0;
  92. ulTmep=p_ucBCD_bit4[0];
  93. ulTmep=ulTmep&0x0000000f;//把组合BCD码第1位分解出来
  94. ulTmep=ulTmep*1;
  95. ulSum=ulSum+ulTmep; //累加各位数值
  96. //以上代码非常有规律,有兴趣的读者也可以自己想办法把它压缩成一个for循环的函数,可以极大节省容量。
  97. p_ucNumber[3]=ulSum>>24;//把long类型数据分解成4个字节
  98. p_ucNumber[2]=ulSum>>16;
  99. p_ucNumber[1]=ulSum>> p_ucNum

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

网站地图

Top