单片机——浮点数转换4位数码管显示

发布于:2025-06-24 ⋅ 阅读:(18) ⋅ 点赞:(0)

在这里插入图片描述

浮点数转换4位数码管显示

static char buffer[5];
int DecimalPlace = 0;
#define HideChar 'h'
void DisplayFloatOn4LED(float value)
{
    long integer = roundf(value );
    if (integer > 9999) //4位
    {
        integer = 9999;
        snprintf(buffer, sizeof(buffer), "%4ld", integer);
    }
    else if (integer > 999) //4位
    {
        snprintf(buffer, sizeof(buffer), "%4ld", integer);
    }
    else if (integer > 99) //3位
    {
        int decimalPlaceTemp = DecimalPlace;
        if (decimalPlaceTemp > 1)
            decimalPlaceTemp = 1;
        if (decimalPlaceTemp == 1)
        {
            integer = roundf(value * 10 );
            snprintf(buffer, sizeof(buffer), "%4ld", integer);
            buffer[2] |= 0x80;
        }
        else
        {
            snprintf(buffer, sizeof(buffer), "%4ld", integer);
            buffer[0] = HideChar;
        }
    }
    else if (integer > 9) //2位
    {
        int decimalPlaceTemp = DecimalPlace;
        if (decimalPlaceTemp > 2)
            decimalPlaceTemp = 2;
        switch (decimalPlaceTemp)
        {
            case 2:
            {
                integer = roundf(value * 100 );
                snprintf(buffer, sizeof(buffer), "%4ld", integer);
                buffer[1] |= 0x80;
            }
            break;
            case 1:
            {
                integer = roundf(value * 10 );
                snprintf(buffer, sizeof(buffer), "%4ld", integer);
                buffer[2] |= 0x80;
                buffer[0] = HideChar;
            }
            break;
            case 0:
            {
                snprintf(buffer, sizeof(buffer), "%4ld", integer);
                buffer[0] = HideChar;
                buffer[1] = HideChar;
            }
            break;
            default:
                break;
        }
    }
    else if (integer > 0 ) //1位
    {
        int decimalPlaceTemp = DecimalPlace;
        if (decimalPlaceTemp > 3)
            decimalPlaceTemp = 3;
        switch (decimalPlaceTemp)
        {
            case 3:
            {
                integer = roundf(value * 1000 );
                snprintf(buffer, sizeof(buffer), "%04ld", integer);
                buffer[0] |= 0x80;
            }
            break;
            case 2:
            {
                integer = roundf(value * 100 );
                snprintf(buffer, sizeof(buffer), "%04ld", integer);
                buffer[1] |= 0x80;
                buffer[0] = HideChar;
            }
            break;
            case 1:
            {
                integer = roundf(value * 10 );
                snprintf(buffer, sizeof(buffer), "%04ld", integer);
                // buffer[2] |= 0x80;
                buffer[1] = HideChar;
                buffer[0] = HideChar;
            }
            break;
            case 0:
            {
                snprintf(buffer, sizeof(buffer), "%04ld", integer);
                buffer[0] = HideChar;
                buffer[1] = HideChar;
                buffer[2] = HideChar;
            }
            break;
            default:
                break;
        }
    }
    else if (integer == 0 ) //1位 0.xx
    {
        if (value >= 0)
        {
            int decimalPlaceTemp = DecimalPlace;
            if (decimalPlaceTemp > 3)
                decimalPlaceTemp = 3;
            switch (decimalPlaceTemp)
            {
                case 3:
                {
                    integer = roundf(value * 1000 );
                    snprintf(buffer, sizeof(buffer), "%04ld", integer);
                    buffer[0] |= 0x80;
                }
                break;
                case 2:
                {
                    integer = roundf(value * 100 );
                    snprintf(buffer, sizeof(buffer), "%04ld", integer);
                    buffer[1] |= 0x80;
                    buffer[0] = HideChar;
                }
                break;
                case 1:
                {
                    integer = roundf(value * 10 );
                    snprintf(buffer, sizeof(buffer), "%04ld", integer);
                    buffer[2] |= 0x80;
                    buffer[1] = HideChar;
                    buffer[0] = HideChar;
                }
                break;
                case 0:
                {
                    buffer[0] = HideChar;
                    buffer[1] = HideChar;
                    buffer[2] = HideChar;
                    buffer[3] = '0';
                }
                break;
                default:
                    break;
            }
        }
        else
        {
            int decimalPlaceTemp = DecimalPlace;
            if (decimalPlaceTemp > 2)
                decimalPlaceTemp = 2;
            switch (decimalPlaceTemp)
            {
                case 2:
                {
                    integer = abs(roundf(value * 100 ));
                    snprintf(buffer, sizeof(buffer), "%04ld", integer);
                    buffer[1] |= 0x80;
                    buffer[0] = '-';

                }
                break;
                case 1:
                {
                    integer = abs(roundf(value * 10 ));
                    snprintf(buffer, sizeof(buffer), "%04ld", integer);
                    buffer[2] |= 0x80;
                    buffer[1] = '-';
                    buffer[0] = HideChar;
                }
                break;
                case 0:
                {
                    buffer[0] = HideChar;
                    buffer[1] = HideChar;
                    buffer[2] = HideChar;
                    buffer[3] = '0';
                }
                break;
                default:
                    break;
            }
        }
    }
    else if (integer > -10) //1位,负数
    {
        int decimalPlaceTemp = DecimalPlace;
        if (decimalPlaceTemp > 2)
            decimalPlaceTemp = 2;
        switch (decimalPlaceTemp)
        {
            case 2:
            {
                integer = abs(roundf(value * 100 ));
                snprintf(buffer, sizeof(buffer), "%04ld", integer);
                buffer[1] |= 0x80;
                buffer[0] = '-';

            }
            break;
            case 1:
            {
                integer = abs(roundf(value * 10 ));
                snprintf(buffer, sizeof(buffer), "%04ld", integer);
                buffer[2] |= 0x80;
                buffer[1] = '-';
                buffer[0] = HideChar;
            }
            break;
            case 0:
            {
                snprintf(buffer, sizeof(buffer), "%04ld", abs(integer));
                buffer[0] = HideChar;
                buffer[1] = HideChar;
                buffer[2] = '-';
            }
            break;
            default:
                break;
        }
    }
    else if (integer > -100) //2位,负数
    {
        int decimalPlaceTemp = DecimalPlace;
        if (decimalPlaceTemp > 1)
            decimalPlaceTemp = 1;
        switch (decimalPlaceTemp)
        {
            case 1:
            {
                integer = abs(roundf(value * 10 ));
                snprintf(buffer, sizeof(buffer), "%4ld", integer);
                buffer[2] |= 0x80;
                buffer[0] = '-';
            }
            break;
            case 0:
            {
                snprintf(buffer, sizeof(buffer), "%4ld", abs(integer));
                buffer[0] = HideChar;
                buffer[1] = '-';
            }
            break;
            default:
                break;
        }
    }
    else if (integer > -1000) //3位,负数
    {
        snprintf(buffer, sizeof(buffer), "%4ld", abs(integer));
        buffer[0] = '-';
    }
    else if (integer <= -1000) //4位,负数
    {
        buffer[0] = '-';
        buffer[1] = '9';
        buffer[2] = '9';
        buffer[3] = '9';
    }

    qDebug() << "value:" << value << "integer:" << integer << "buffer:" <<
             buffer << int(buffer[2]) - 0x30 << int(buffer[3]) - 0x30 ;
}


测试代码

    for (int dp = 0; dp <= 3; dp++)
    {
        DecimalPlace = dp;
        printf("\n=== 测试小数位数: %d ===\n", dp);

        // 正数测试
        DisplayFloatOn4LED(9999.9f);
        qDebug("最大值截断");
        DisplayFloatOn4LED(1234.5f);
        qDebug("4位整数");
        DisplayFloatOn4LED(123.45f);
        qDebug("3位整数");
        DisplayFloatOn4LED(12.345f);
        qDebug("2位整数");
        DisplayFloatOn4LED(1.2345f);
        qDebug("1位整数");
        DisplayFloatOn4LED(0.9999f);
        qDebug("0.9999舍入");

        // 负数测试
        DisplayFloatOn4LED(-12.34f);
        qDebug("2位负数");
        DisplayFloatOn4LED(-1.234f);
        qDebug("1位负数");
        DisplayFloatOn4LED(-0.999f);
        qDebug("-0.999舍入");

        // 边界测试
        DisplayFloatOn4LED(0.0f);
        qDebug("零值");
        DisplayFloatOn4LED(-999.9f);
        qDebug("大负数");
     }

    // 特殊测试:动态改变小数位数
    DecimalPlace = 1;
    DisplayFloatOn4LED(3.1415f);
    qDebug("圆周率1位小数");
    DecimalPlace = 2;
    DisplayFloatOn4LED(3.1415f);
    qDebug("圆周率2位小数");

网站公告

今日签到

点亮在社区的每一天
去签到