[原创]单片机 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的主要内容,如果未能解决你的问题,请参考以下文章

走进STM32世界之Hex程序烧写

hex是啥文件 hex文件如何打开

单片机笔记ASCII与HEX数组互转的C语言实现

单片机笔记ASCII与HEX数组互转的C语言实现

单片机at89c2051用keilc c语言编程生成的hex文件烧写后不能运行,哪怕是最...

谁能帮我把一个hex文件反编译为c语言文件?