十进制转十六进制c语言函数

  • 学习18140次

今天有位朋友在群里面问如何接收串口调试助手发来的十六进制数据,并以十六进制的形式显示在LCD上。比如串口调试助手上发送十六进制数据3C,单片机带的LCD上也显示3C。单片机接收到来自电脑串口的数据0x3C后,存储到一个变量中,当我们调用显示数字的函数时,实际上显示出来的是十进制的数据,例如发送0x3C,会显示十进制数据60。看来要想显示十六进制,还不是那么容易。十六进制中,包含0~9数字,还包含A~F字母,看来要想显示,必须要用显示字符的函数而不能用显示数字的函数了。

但是不能直接调用显示字符的函数。因为要想显示3C,实际上是要显示2个字符,你如果直接把数据带进去,实际上他会认为是一个字符的ASCII码。

于是我们要把发过来的数据变换成两个字符,用下面的公式:

 shi = rece_data/16; // 获取第一位
 ge? = rece_data%16; // 获取第二位

然后把数字转换成字符:

 switch(shi)
 {
 case 0:shi='0';break;
 case 1:shi='1';break;
 case 2:shi='2';break;
 case 3:shi='3';break;
 case 4:shi='4';break;
 case 5:shi='5';break;
 case 6:shi='6';break;
 case 7:shi='7';break;
 case 8:shi='8';break;
 case 9:shi='9';break;
 case 10:shi='A';break;
 case 11:shi='B';break;
 case 12:shi='C';break;
 case 13:shi='D';break;
 case 14:shi='E';break;
 case 15:shi='F';break;
 default:break;
 }
 switch(ge)
 {
 case 0:ge='0';break;
 case 1:ge='1';break;
 case 2:ge='2';break;
 case 3:ge='3';break;
 case 4:ge='4';break;
 case 5:ge='5';break;
 case 6:ge='6';break;
 case 7:ge='7';break;
 case 8:ge='8';break;
 case 9:ge='9';break;
 case 10:ge='A';break;
 case 11:ge='B';break;
 case 12:ge='C';break;
 case 13:ge='D';break;
 case 14:ge='E';break;
 case 15:ge='F';break;
 default:break;
 }

然后就可以显示了:

 LCD_ShowChar(xpos, ypos, shi);
 LCD_ShowChar(xpos+8, ypos, ge);

实践图片欣赏:

十六进制发送

十六进制显示

总结一下,实际上用到的原理是十进制转十六进制函数。把这个功能封装一下,如下所示:

void char DecToHex(redata)
{
unsigned char shi,ge;

redata = UART->RBR;
shi = redata/16;
ge? = redata%16;
switch(shi)
{
case 0:shi='0';break;
case 1:shi='1';break;
case 2:shi='2';break;
case 3:shi='3';break;
case 4:shi='4';break;
case 5:shi='5';break;
case 6:shi='6';break;
case 7:shi='7';break;
case 8:shi='8';break;
case 9:shi='9';break;
case 10:shi='A';break;
case 11:shi='B';break;
case 12:shi='C';break;
case 13:shi='D';break;
case 14:shi='E';break;
case 15:shi='F';break;
default:break;
}
switch(ge)
{
case 0:ge='0';break;
case 1:ge='1';break;
case 2:ge='2';break;
case 3:ge='3';break;
case 4:ge='4';break;
case 5:ge='5';break;
case 6:ge='6';break;
case 7:ge='7';break;
case 8:ge='8';break;
case 9:ge='9';break;
case 10:ge='A';break;
case 11:ge='B';break;
case 12:ge='C';break;
case 13:ge='D';break;
case 14:ge='E';break;
case 15:ge='F';break;
default:break;
}

}

发表评论