c - 如何将 unsigned long int 转换为 char 以在 C 中的 LCD 上显示
问题描述
我有一个应该转换为字符以在 LCD 上显示的变量,我的问题是当我将此整数转换为 char 时sprintf
它显示错误的数字,每个超过 4 个长度的数字显示不正确它只正确显示长度为 4 的数字。
我的微控制器是ATmega16a IDE 是CodeVisionAVR语言是C
unsigned long int username;
char show[20];
unsigned long int ScanKey(void)
{
unsigned long int num = 0;
_lcd_write_data(0x0F);
PORTC .2 = 1;
while (1)
{
PORTD .0 = 0;
PORTD .1 = 1;
PORTD .2 = 1;
delay_ms(5);
if (PIND .3 == 0)
{
while (PIND .3 == 0;
lcd_putchar('1');
num = (num * 10) + 1;
}
else if (PIND .4 == 0)
{
while (PIND .4 == 0);
lcd_putchar('4');
num = (num * 10) + 4;
}
else if (PIND .5 == 0)
{
while (PIND .5 == 0);
lcd_putchar('7');
num = (num * 10) + 7;
}
else if (PIND .6 == 0)
{
while (PIND .6 == 0);
_lcd_write_data(0x10);
lcd_putchar(' ');
_lcd_write_data(0x10);
num /= 10;
}
PORTD .0 = 1;
PORTD .1 = 0;
PORTD .2 = 1;
delay_ms(5);
if (PIND .3 == 0)
{
while (PIND .3 == 0);
lcd_putchar('2');
num = (num * 10) + 2;
}
else if (PIND .4 == 0)
{
while (PIND .4 == 0);
lcd_putchar('5');
num = (num * 10) + 5;
}
else if (PIND .5 == 0)
{
while (PIND .5 == 0)
;
lcd_putchar('8');
num = (num * 10) + 8;
}
else if (PIND .6 == 0)
{
while (PIND .6 == 0);
lcd_putchar('0');
num = (num * 10) + 0;
}
PORTD .0 = 1;
PORTD .1 = 1;
PORTD .2 = 0;
delay_ms(5);
if (PIND .3 == 0)
{
while (PIND .3 == 0);
lcd_putchar('3');
num = (num * 10) + 3;
}
else if (PIND .4 == 0)
{
while (PIND .4 == 0);
lcd_putchar('6');
num = (num * 10) + 6;
}
else if (PIND .5 == 0)
{
while (PIND .5 == 0);
lcd_putchar('9');
num = (num * 10) + 9;
}
else if (PIND .6 == 0)
{
while (PIND .6 == 0);
break;
}
}
PORTC .2 = 0;
_lcd_write_data(0x0C);
return num;
}
lcd_clear();
lcd_putsf("Enter Username:");
lcd_gotoxy(0, 1);
sprintf(show, "%lu", username);
lcd_puts(show);
这不是我的全部代码,这是我有问题的部分。
我输入这个 56321
输出是这个
https://files.fm/f/qpwrmfs6h这是视频。
我试过了%ul
,有同样的问题,%lu
输出是这样的
%ul
%lu
我的英语不是很好,我很难补充细节
解决方案
- 请勿在 8 位环境中使用
printf
和功能。scanf
他们是资源贪婪的,不太适合这种微观。 printf
和scanf
实现是有限的,不支持许多格式。- 在 8 位环境中,32 位数字运算非常昂贵(尤其是除法) - 尽可能尝试使用 16 位
#define MASK32ULONG 1000000000UL
#define MASK16UINT 10000
char *toDecimal(char *buff, unsigned long val)
{
unsigned long mask = MASK32ULONG;
unsigned long remain;
char *wrk = buff;
do
{
int digit = val / mask;
if(digit || !val) *wrk++ = '0' + digit;
val %= mask;
mask /= 10;
}while(val);
*wrk = 0;
return buff;
}
推荐阅读
- mysql - 实时生产服务器旁边的开发 SQL
- javascript - css 中的关键帧无法使用 javascript 正常工作
- c# - Zkemkeeper.dll 部署后不工作,类未注册?
- javascript - 从包含多个对象的数组中返回编号最大的对象
- html - 在 Excel VBA 中选择一个没有 ID 的 HTML 按钮
- python - 有没有办法从 Jupyter 笔记本生成降价文件?
- linux - 区分2个设置文件并替换差异
- c# - 在不丢失现有行的情况下将数据添加到 datagridview
- java - 循环练习:使用 for 循环在控制台上打印树(停留在细节上)
- android - 在不同计算机上打开项目后出现多个错误(然后在第一台计算机上重新打开)