如何接收串口调试助手发来的十六进制数据,并以十六进制的形式显示在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;
}
}
|