Se me ha ocurrido una idea de como añadir el punto decimal a cualquier número.
Actualmente tengo un arreglo que cambia el numero de cada dígito al valor adecuado para activar el número correcto en el display:
// 0 1 2 3 4 5 6 7 8 9
const unsigned char digitoDisplay[0x0A] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98};
Por ejemplo, si un display tiene el número cero, el arreglo retorna 0xC0, que es el valor que visualiza cero en el display.
El bit más alto de este número corresponde al segmento PD del display, si deseara que el número cero tenga su punto decimal activo, el valor a retornar sería 0x40.
Para el número 1, es 0xF9, para 1 con punto decimal, sería 0x79, es decir el bit 7 de cualquiera de los valores del arreglo, deben estar en cero.
Estos 10 nuevos valores, los añadiría al arreglo así:
// 0 1 2 3 4 5 6 7 8 9 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.
const unsigned char digitoDisplay[0x14] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x38,0x00,0x18};
Es decir, por ejemplo, que si deseo que un display active su punto decimal, simplemente debo sumar 10.
Por ejemplo, si el display tiene un valor de 7, al sumarle 10, será 17, que corresponde a 0x38, que es el número 7 con punto decimal, por lo tanto mi código donde el valor RMS es mayor a 99 sería ahora así:
if (parteEntera > 99)
{
appdisplayData.arregloDisplay[0x00] = (unsigned char)floorf(parteDecimal *10);
appdisplayData.arregloDisplay[0x01] = 10 + (unsigned char)(parteEntera%10); // sumo diez para activar el punto decimal
appdisplayData.arregloDisplay[0x02] = (unsigned char)((parteEntera/10)%10);
appdisplayData.arregloDisplay[0x03] = (unsigned char)(parteEntera/100);
}
Luego tendría un else if, para valores mayores que 10, así:
else if (parteEntera > 9)
{
int decimalDosDigitos = (int)floorf(parteDecimal *100);
appdisplayData.arregloDisplay[0x00] = (unsigned char)(decimalDosDigitos%10);
appdisplayData.arregloDisplay[0x01] = (unsigned char)(decimalDosDigitos/10);
appdisplayData.arregloDisplay[0x02] = 10 + (unsigned char)(parteEntera%10); //sumo diez para el punto decimal
appdisplayData.arregloDisplay[0x03] = (unsigned char)(parteEntera/10);
}
En este caso, supongamos que el valor RMS es 78.953.
En la variable auxiliar decimalDigitos al multiplicar la parte decimal por 100, se tendría 95.3, por lo tanto tendría 95.
En el display 0, se tendría el módulo de 95 para 10, que sería 5.
En el display 1, se tendría el residuo de 95 para 10, que sería 9.
En el display 2, se tendría el módulo de 78 para 10, que sería 8, y más 10, para que el 8 tenga punto decimal
En el display 3, se tendría el residuo de 78 para 10, que sería 7.
Por lo tanto en el display se vería 78.95
Y finalmente tendrá un caso else, que sería para valores enteros del RMS de 0 a 9, y sería así:
else
{
int decimalTresDigitos = (int)floorf(parteDecimal *1000);
appdisplayData.arregloDisplay[0x00] = (unsigned char)(decimalTresDigitos%10);
appdisplayData.arregloDisplay[0x01] = (unsigned char)((decimalTresDigitos/10)%10);
appdisplayData.arregloDisplay[0x02] = (unsigned char)(decimalTresDigitos/100); // obtengo centena
appdisplayData.arregloDisplay[0x03] = 10 + (unsigned char)(parteEntera);
}
Supongamos que el valor rms es 5.347.
La parte decimal al multiplicarse por 1000 sería 347, que sería el valor de la variable auxiliar decimalTresDigitos.
El display 0 tendría el residuo del 347 para 10, es decir 7.
El display 1 tendría el residuo de la división de 347/10, con 10, es decir 4.
El display 2 tendría el residuo de la división de 347 para 100, es decir 3.
El display 3, tendría la parte entera, que sería 5, que al sumarle 10, sería 5 con punto decimal.
Eso creo que sería todo, falta probarlo con el hardware.