0

我有一个微控制器,我正在对 LM335 温度传感器的值进行采样。我拥有的 LCD 库允许我显示 10 位 ADC 采样的十六进制值。10 位 ADC 给我从 0x0000 到 0x03FF 的值。

我遇到的麻烦是试图将十六进制值转换为普通人可以理解的格式。

任何线索将不胜感激,因为我完全迷失在这个问题上。

4

4 回答 4

1

您可以创建一个“字符串”,您可以在其中构造这样的十进制数(常数取决于实际值的大小,我假设 0-255,您是否希望它以空值结尾,等等):

char result[4];
char i = 3;
do {

    result[i] = '0' + value % 10;
    value /= 10;
    i--;
}
while (value > 0);
于 2013-12-30T22:15:33.577 回答
0

基本上,您的问题是如何将数字拆分为十进制数字,以便您可以使用 LCD 库并向每个单元格发送一个数字。

如果您的 LCD 基于 7 段单元格,那么您需要为每个数字输出一个 0 到 9 的值,而不是 ASCII 码。@Roman Hocke 的解决方案对此很好,只要您不'0'添加value % 10

将数字拆分为数字的另一种方法是将其转换为 BCD。为此,有一种名为“double dabble”的算法,它允许您在不使用除法或模块操作的情况下将您的数字转换为 BCD,如果您的微控制器没有除法操作的规定,或者这比您需要的慢,这可能会很好。

于 2013-12-30T22:30:44.197 回答
0

“Double dable”算法对于没有除法运算的微控制器来说听起来很完美。然而,维基百科中对这种算法的快速疏忽表明它使用动态内存,这似乎比除法例程更糟糕。当然,必须有一个不使用对 malloc() 和朋友的调用的实现。

于 2014-12-27T00:13:06.243 回答
0

只是指出 Roman Hocke 的代码片段有一点错误。此版本适用于 0-255 范围内的小数。它可以很容易地扩展到任何范围:

void dec2str(uint8_t val, char * res)
{
    uint8_t i = 2;
    do {
        res[i] = '0' + val % 10;
        val /= 10;
        i--;
    } while (val > 0);
    res[3] = 0;
}
于 2014-12-29T21:54:10.883 回答