如何将 unsigned long int 转换为 char 以在 C 中的 LCD 上显示

How to Convert unsigned long int to char to show on LCD in C

我有一个变量应该转换为字符以在 LCD 上显示,我的问题是当我使用 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 输出是这样的

我的英语不是很好,我很难补充细节

  1. 不要在 8 位环境中使用 printfscanf 函数。比较贪资源,不太适合这种微博
  2. printfscanf 实施有限,不支持多种格式。
  3. 32 位数字运算在 8 位环境中非常昂贵(尤其是除法)- 尽可能使用 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;
}