浮点数转换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位小数");