在LCD上显示整数

时间:2016-01-13 15:44:52

标签: c++ string ascii uint8t

我试图在液晶显示器上显示整数。 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 - 字符串。

1 个答案:

答案 0 :(得分:6)

在您的体系结构中,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
  4. 对于最后一个选项,您可以使用以下“主要”可移植代码:

    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编译器也可以正确处理。

    Nitpick:不要在int8_t所使用的char处使用itoas[n]printfchar等期望int8_t个缓冲区,而不是 app.controller('signalCtrl', [ '$scope', 'DB', function($scope, service) { this.address = null; }]); app.controller('reportMap', ['$scope', function($scope) { this.updateParent = function() { $scope.$parent.tab.address = 'something'; } }]); 个缓冲区。