在LCD上显示整数
Displaying integer on an 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
,这显然不是正确的整数。
我知道可能有一个问题,因为我将字符转换为有符号的int8_t
,然后将它们输出为无符号uint8_t
。但我必须以无符号格式输出它们。我不知道如何将int32_t
输入整数转换为ASCII uint8_t
-字符串。
在您的体系结构中,int
是int16_t
,而不是int32_t
。因此,itoa
将123456
视为-7616
,因为:
123456 = 0x0001_E240
-7616 = 0xFFFF_E240
如果您将它们截断为16位,它们是相同的——所以这就是您的代码所做的。不使用itoa
,您有以下选项:
- 自己计算ASCII表示
- 使用
ltoa(long value, 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编译器也能正确地处理这种问题。
Nittick:不要在char
可以使用的地方使用int8_t
。itoa
、s[n]printf
等需要char
缓冲区,而不是int8_t
缓冲区。
相关文章:
- 显示基于用户输入的整数的字符
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- 如何在C++上显示大整数
- C++ - 成对显示的整数因子
- 当我尝试将范围值存储为 8 位的固定宽度整数时,它向我显示一些其他值 [ASCII]
- 'cout'将整数显示为十六进制
- 输出显示多个带整数的字符串值
- 我无法显示包含整数最大值的索引. 但我可以显示数组中整数的最高值
- 将25个甚至整数存储到一个名为intlist的整数阵列中,然后在屏幕上显示数组,并在屏幕上显示名为fivintegers
- (显示金字塔)编写一个程序,该程序提示用户输入1到15的整数并显示金字塔
- 显示六个整数中的最小偶数和奇数,而不使用循环和数组
- 为什么我的静态整数没有在主函数中显示更改的值
- 当我要修改指针到常量整数时,为什么我的编译器不显示错误
- 需要帮助显示用户输入的整数的最小/最大值
- printf 整数显示超过 C++ cout
- 在编译时以 static_assert() 格式显示整数
- 初始化和显示整数向量时出现意外结果
- 在控制台中用整数显示微不足道的数字
- 如何将整数显示为字符
- 我怎么能阻止我的整数显示为十六进制