浮點數轉換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位小數");