接受一个字符并输出其ASCII十六进制值

问题描述

我正在用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;

所以现在我有了要在ch1ch2中打印的字符的数值,但是我不确定如何实际找到与这些数字相对应的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码。

另外,您对ch1ch2的计算是错误的:ch1是16的乘法(因为清除了低位),而ch2将始终为零(因为位除了最后4位以外的其他内容都将被清除,然后向右移4位。

包括固定计算ch1ch2的实现将是这样的:

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));
}