c – 在LCD上显示整数
作者:互联网
我想在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,这显然不是正确的整数.
我知道可能存在问题,因为我将字符转换为signed int8_t然后将它们输出为unsigned uint8_t.但我必须以无符号格式输出它们.我不知道如何将int32_t输入整数转换为ASCII uint8_t-String.
解决方法:
在您的体系结构上,int是int16_t,而不是int32_t.因此,itoa将123456视为-7616,因为:
123456 = 0x0001_E240
-7616 = 0xFFFF_E240
如果将它们截断为16位,它们就是相同的 – 这就是你的代码正在做的事情.您可以使用以下选项,而不是使用itoa:
>自己计算ASCII表示;
>使用ltoa(long值,char * buffer,int radix),如果可用,或者
>如果可用,使用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编译器也可以正确处理.
Nitpick:不要使用char8会做的int8_t. itoa,s [n] printf等等期望char缓冲区,而不是int8_t缓冲区.
标签:uint8t,c,string,ascii 来源: https://codeday.me/bug/20190824/1706508.html