首页 > 解决方案 > 如何将 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在此处输入图像描述 在此处输入图像描述

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

标签: cmicrocontroller

解决方案


  1. 请勿在 8 位环境中使用printf和功能。scanf他们是资源贪婪的,不太适合这种微观。
  2. printfscanf实现是有限的,不支持许多格式。
  3. 在 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;
}

推荐阅读