问题描述
我正在用ATMEGA微控制器为UART编写自己的串行函数(用C语言编写),我需要让用户输入一个字符并输出ASCII十六进制值,
即如果用户键入“ a”,则输出将为“ 0x61”。我写了一个叫做
的函数 putvalue(unsigned char ch)
,
接受一个字符并将其显示在屏幕上,所以现在我只需要编写一个函数,该函数接受该字符并将其转换为对应于其ASCII十六进制值的字符。到目前为止,我已经完成了以下操作:
void puthexvalue(unsigned char ch) {
putvalue(0x30) \\writes a '0' to the screen
putvalue(0x78) \\writes an 'x' to the screen
unsigned char ch1 = ch & 0xF0;
unsigned char ch2 = (ch & 0x0F) >> 4;
所以现在我有了要在ch1
和ch2
中打印的字符的数值,但是我不确定如何实际找到与这些数字相对应的ASCII值并打印那个值。
任何提示或帮助将不胜感激,谢谢!
编辑:应为ch1 = ch & 0xf0 >> 4
和ch2 = ch & 0x0f
。
解决方法
在C规范中,保证从'0'
到'9'
的字符代码是连续的。
从'A'
到'Z'
以及从'a'
到'z'
的字符代码在ASCII码中是连续的。
因此,如果数字在0到9之间,则可以通过在数字上添加'0'
来获得ASCII码。
如果数字介于10到15之间,则可以通过在数字减10之前加上'A'
或'a'
来获得ASCII码。
另外,您对ch1
和ch2
的计算是错误的:ch1
是16的乘法(因为清除了低位),而ch2
将始终为零(因为位除了最后4位以外的其他内容都将被清除,然后向右移4位。
包括固定计算ch1
和ch2
的实现将是这样的:
char getHexChar(unsigned char c) {
if (c <= 9) return '0' + c;
else if (c <= 15) return 'A' + (c - 10);
else return '?';
}
void puthexvalue(unsigned char ch) {
putvalue(0x30); //writes a '0' to the screen
putvalue(0x78); //writes an 'x' to the screen
unsigned char ch1 = (ch & 0xF0) >> 4;
unsigned char ch2 = ch & 0x0F;
putvalue(getHexChar(ch1));
putvalue(getHexChar(ch2));
}