[原创]单片机 HexToStr and HexToBcd BcdToStr
Posted caohenry999
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[原创]单片机 HexToStr and HexToBcd BcdToStr相关的知识,希望对你有一定的参考价值。
网上的很多例子都是不好用的
我这个是我验证过的,大家可以放心用啊
1 //------------------------------------------ 2 //适合于9999以下的数据转换 3 // 9999 -> 0x270F Max 4 // 5 unsigned int uHex2Bcd_SubFunction(uint16_t sbcd_data) 6 { 7 if ((sbcd_data&0x0f)>9) 8 { 9 sbcd_data=sbcd_data+6; 10 } 11 if ((sbcd_data&0x00f0)>0x90) 12 { 13 sbcd_data=sbcd_data+0x60; 14 } 15 if ((sbcd_data&0x0f00)>0x0900) 16 { 17 sbcd_data=sbcd_data+0x600; 18 } 19 if ((sbcd_data&0xf000)>0x9000) 20 { 21 sbcd_data=sbcd_data+0x6000; 22 } 23 return(sbcd_data); 24 } 25 26 27 unsigned int uHex2Bcd (unsigned int hex_data) 28 29 { 30 unsigned int bcd_data; 31 unsigned char temp; 32 33 temp=hex_data&0x0f; 34 if (temp>9) 35 { 36 bcd_data=temp+6; 37 } 38 else 39 { 40 bcd_data=temp; 41 } 42 temp=(hex_data>>4)&0x0f; 43 for (;temp>0;temp--) 44 { 45 bcd_data=bcd_data+0x16; 46 bcd_data=uHex2Bcd_SubFunction(bcd_data); 47 } 48 temp=(hex_data>>8)&0x0f; 49 for (;temp>0;temp--) 50 { 51 bcd_data=bcd_data+0x256; 52 bcd_data=uHex2Bcd_SubFunction(bcd_data); 53 } 54 temp=(hex_data>>12)&0x0f; 55 for (;temp>0;temp--) 56 { 57 bcd_data=bcd_data+0x4096; 58 bcd_data=uHex2Bcd_SubFunction(bcd_data); 59 } 60 return(bcd_data); 61 62 } 63 64 65 66 //======================================================================== 67 68 uint8_t uInt_HexToStr(void * pDest,void * pSrc,uint8_t Bytes_Of_Src) 69 { 70 uint8_t aHex[4]; 71 uint8_t Tmp; 72 uint8_t *pDest2; 73 uint8_t *pSrc2; 74 75 if ((Bytes_Of_Src==1) || (Bytes_Of_Src==2) ||(Bytes_Of_Src==4)) 76 { 77 pDest2 = pDest; 78 pSrc2 = pSrc; 79 80 if (Bytes_Of_Src==1) 81 { 82 aHex[0] = *pSrc2; 83 } 84 85 if (Bytes_Of_Src==2) 86 { 87 aHex[0] = *(pSrc2+1); 88 aHex[1] = *pSrc2; 89 } 90 91 if (Bytes_Of_Src==4) 92 { 93 aHex[0] = *(pSrc2+3); 94 aHex[1] = *(pSrc2+2); 95 aHex[2] = *(pSrc2+1); 96 aHex[3] = *pSrc2; 97 } 98 99 Tmp = (aHex[0]&0xf0)>>4; 100 (Tmp<10) ? (Tmp=Tmp+0x30) : (Tmp=Tmp+0x37); 101 *pDest2=Tmp; 102 103 Tmp = (aHex[0]&0x0f); 104 (Tmp<10) ? (Tmp=Tmp+0x30) : (Tmp=Tmp+0x37); 105 106 *(pDest2+1)=Tmp; 107 108 109 if (Bytes_Of_Src>=2) 110 { 111 Tmp = (aHex[1]&0xf0)>>4; 112 (Tmp<10) ? (Tmp=Tmp+0x30) : (Tmp=Tmp+0x37); 113 *(pDest2+2)=Tmp; 114 115 Tmp = (aHex[1]&0x0f); 116 (Tmp<10) ? (Tmp=Tmp+0x30) : (Tmp=Tmp+0x37); 117 *(pDest2+3)=Tmp; 118 } 119 //---------------------------------------------- 120 if (Bytes_Of_Src>=4) 121 { 122 Tmp = (aHex[2]&0xf0)>>4; 123 (Tmp<10) ? (Tmp=Tmp+0x30) : (Tmp=Tmp+0x37); 124 *(pDest2+4)=Tmp; 125 126 Tmp = (aHex[2]&0x0f); 127 (Tmp<10) ? (Tmp=Tmp+0x30) : (Tmp=Tmp+0x37); 128 129 *(pDest2+5)=Tmp; 130 131 Tmp = (aHex[3]&0xf0)>>4; 132 (Tmp<10) ? (Tmp=Tmp+0x30) : (Tmp=Tmp+0x37); 133 *(pDest2+6)=Tmp; 134 135 Tmp = (aHex[3]&0x0f); 136 (Tmp<10) ? (Tmp=Tmp+0x30) : (Tmp=Tmp+0x37); 137 *(pDest2+7)=Tmp; 138 } 139 140 Tmp=1; // 执行完毕 141 } 142 else 143 { 144 Tmp=0; // 源数据字节长度不符合要求,只能是2或者4 字节 145 } 146 147 return Tmp; //返回执行结果:1-正常,0-异常 148 149 }
以下是调用举例,把数据发送到串口,显示在电脑的串口调试软件上
void uUSART_Test(void) { /* 局部变量定义 */ char src[50]; uint32_t aaa; aaa=0x270f; uInt_HexToStr(src,&aaa,2); uUART_PutStr_Len(USART1," 0x",3); uUART_PutStr_Len(USART1,(uint8_t *)src,4); //uUART_PutStr(USART1," "); bbb=uHex2Bcd(aaa); uInt_HexToStr(src,&bbb,2); uUART_PutStr_Len(USART1," -> ",4); uUART_PutStr_Len(USART1,(uint8_t *)src,4); uUART_PutStr(USART1," "); }
电脑显示
欢迎大家 留言评论
以上是关于[原创]单片机 HexToStr and HexToBcd BcdToStr的主要内容,如果未能解决你的问题,请参考以下文章