在LCD上显示整数

Displaying integer on an LCD

本文关键字:整数 显示 LCD      更新时间:2023-10-16

我正试图在LCD显示器上显示一个整数。Lcd的工作方式是向它发送一个8位ASCII字符,它会显示该字符。

到目前为止,我的代码是:

unsigned char text[17] = "ABCDEFGHIJKLMNOP";
int32_t n = 123456;
lcd.printInteger(text, n);
//-----------------------------------------  
void LCD::printInteger(unsigned char headLine[17], int32_t number)
{
    //......

    int8_t str[17];
    itoa(number,(char*)str,10);

    for(int i = 0; i < 16; i++)
    {
        if(str[i] == 0x0)
        break;
        this->sendCharacter(str[i]);
        _delay_ms(2);
    }
}
void LCD::sendCharacter(uint8_t character)
{
    //....
    *this->cOutputPort = character;
    //...
}

因此,如果我试图在LCD上显示123456,它实际上显示的是-7616,这显然不是正确的整数。

我知道可能有一个问题,因为我将字符转换为有符号的int8_t,然后将它们输出为无符号uint8_t。但我必须以无符号格式输出它们。我不知道如何将int32_t输入整数转换为ASCII uint8_t-字符串。

在您的体系结构中,intint16_t,而不是int32_t。因此,itoa123456视为-7616,因为:

123456 = 0x0001_E240
 -7616 = 0xFFFF_E240

如果您将它们截断为16位,它们是相同的——所以这就是您的代码所做的。不使用itoa,您有以下选项:

  1. 自己计算ASCII表示
  2. 使用ltoa(long value, char * buffer, int radix)(如果可用),或者
  3. 利用s[n]printf(如果可用)

对于最后一个选项,您可以使用以下"大部分"可移植代码:

void LCD::printInteger(unsigned char headLine[17], int32_t number) {
  ...
  char str[17];
  if (sizeof(int) == sizeof(int32_t))
    snprintf(str, sizeof(str), "%d", num);
  else if (sizeof(long int) == sizeof(int32_t))
    snprintf(str, sizeof(str), "%ld", num);
  else if (sizeof(long long int) == sizeof(int32_t))
    snprintf(str, sizeof(str), "%lld", num);
  ...
}

如果并且仅当您的平台没有snprintf,则可以使用sprintf并删除第二个参数(sizeof(str))。你的首选功能应该始终是n变体,因为它可以让你少用一颗子弹射脚:)

由于您使用的是C++编译器,我认为至少有一半是不错的,所以上面的代码应该以可移植的方式做"正确的事情",而不会发出所有不必要的代码。传递给if的测试条件是编译时常数表达式。即使是一些相当古老的C编译器也能正确地处理这种问题。

Nittick:不要在char可以使用的地方使用int8_titoas[n]printf等需要char缓冲区,而不是int8_t缓冲区。