输入一个字符并输出它的 ASCII 十六进制值

Take in a character and output its ASCII hex value

我正在(用 C 语言)为 ATMEGA 微控制器上的 UART 编写自己的串行函数,我需要让用户输入单个字符并让它输出其 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

'0''9'的字符编码在C规范中保证是连续的。

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