微控制器,如何在LCD上显示小数?

时间:2013-12-30 22:11:20

标签: hex lcd bcd

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

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

任何线索都会非常感激,因为我在这个问题上完全迷失了。

4 个答案:

答案 0 :(得分:1)

你可以创建一个“字符串”,你可以像这样构造十进制数(常量取决于实际值的大小,我假设0-255,你是否希望它以空终止等): / p>

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

    result[i] = '0' + value % 10;
    value /= 10;
    i--;
}
while (value > 0);

答案 1 :(得分:0)

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

如果您的LCD基于7段单元,则需要为每个数字输出0到9的值,而不是ASCII码。如果您没有将'0'添加到value % 10

,@ Roman Hocke的解决方案就可以了。

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

答案 2 :(得分:0)

" Double dable"算法听起来非常适合微控制器而无需进行除法运算。然而,在维基百科中对这种算法的快速监督表明它使用动态内存,这似乎比分裂的例程更糟糕。当然,必须有一个不使用malloc()和朋友调用的实现。

答案 3 :(得分: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;
}