- Messaggi: 186
- Ringraziamenti ricevuti 3
Subroutine per la stampa di un floating point
- paoletto
- Autore della discussione
- Elit Utente
Less
Di più
8 Anni 6 Mesi fa #1
da paoletto
Subroutine per la stampa di un floating point è stato creato da paoletto
Ciao a tutti, ciao Mauro.
Ho messo su una subroutine per la stampa di un numero in virgola mobile.
Funziona ma succede che spesso il display non viene pulito e quindi rimangono accodate le cifre precedenti.
La funzione prende in ingresso un numero in virgola mobile ed il numero di cifre decimali che si desidera visualizzare poi stampa il numero.
L'ultimo ciclo for serve proprio ad introdurre un numero di spazi pari al numero di cifre decimali che si è scelto di visualizzare, subito dopo la stampa del numero.
Qualcuno ha voglia di provare a far funzionare questo codice e mi dice che comportamento ha?
Ciao
Paolo.
Ho messo su una subroutine per la stampa di un numero in virgola mobile.
Funziona ma succede che spesso il display non viene pulito e quindi rimangono accodate le cifre precedenti.
La funzione prende in ingresso un numero in virgola mobile ed il numero di cifre decimali che si desidera visualizzare poi stampa il numero.
Code:
// Plotta un numero in virgola mobile: Ndigit_float è il numero delle cifre decimali desiderate dopo la virgola
void write_float_LCD(float value, int Ndigit_float)
{
//char str[5];
char i;
char Ndigit_int;
unsigned int parte_intera;
// Estrae la parte intera
int ipart = (int)value;
if ((ipart>=0)&&(ipart<=9))
Ndigit_int = 1;
else if((ipart>=10)&&(ipart<=99))
Ndigit_int = 2;
else if((ipart>=100)&&(ipart<=999))
Ndigit_int = 3;
else if((ipart>=1000)&&(ipart<=9999))
Ndigit_int = 4;
else Ndigit_int = 5;
//Ndigit_int=sprintf(str,"%d",ipart);
write_integer_LCD(ipart,Ndigit_int);
write_char_LCD (','); //plotta il punto (se preferite potete scrivere la virgola )
// Estrae e plotta la parte frazionaria
float fpart = value - (float)ipart;
for(i=0; i<Ndigit_float; i++)
{
fpart = fpart-(int)fpart;
fpart = fpart*10;
parte_intera = (unsigned int)fpart;
write_integer_LCD(parte_intera,1); //plotta la parte frazionaria
}
for(i=0; i<Ndigit_float; i++)
write_char_LCD (' ');
}
L'ultimo ciclo for serve proprio ad introdurre un numero di spazi pari al numero di cifre decimali che si è scelto di visualizzare, subito dopo la stampa del numero.
Qualcuno ha voglia di provare a far funzionare questo codice e mi dice che comportamento ha?
Ciao
Paolo.
Si prega Accesso o Crea un account a partecipare alla conversazione.
8 Anni 5 Mesi fa #2
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Subroutine per la stampa di un floating point
Ciao Paolo,
non ho testato il codice ma lo ho appena letto.
Credo che il problema possa essere nel fatto che il numero di caratteri vuoti che scrivi alla fine deve essere modificato anche in base al numero Ndigit_int.
confermi?
Se non sbaglio scrivi solo una cifra decimale?
Saluti,
Mauro
non ho testato il codice ma lo ho appena letto.
Credo che il problema possa essere nel fatto che il numero di caratteri vuoti che scrivi alla fine deve essere modificato anche in base al numero Ndigit_int.
confermi?
Se non sbaglio scrivi solo una cifra decimale?
Saluti,
Mauro
Si prega Accesso o Crea un account a partecipare alla conversazione.
- paoletto
- Autore della discussione
- Elit Utente
Less
Di più
- Messaggi: 186
- Ringraziamenti ricevuti 3
8 Anni 5 Mesi fa #3
da paoletto
Risposta da paoletto al topic Subroutine per la stampa di un floating point
Ciao Mauro,
in effetti stampo una cifra decimale alla volta come se fosse un intero da 0 a 9: ad ogni iterazione la parte frazionaria viene moltiplicata per 10 e quindi stampata. Se voglio ad esempio tre cifre decimali dopo la virgola allora Ndigit_float vale 3 e così via. Funziona, cioè i numeri che mi aspetto sono quelli che vedo anche in fase di dubug, ma il display rimane sporco quando ad esempio si passa da un numero a tre cifre intere ad uno a due cifre intere perché non viene sovrascritto tutto per bene ma rimangono le cifre precedenti. È un problema di "pulizia" del display, per cui ho deciso di scrivere un po di spazi bianchi dopo l'ultima cifra decimale. Non mi sembra una soluzione pulita onestamente e si può fare di meglio.
Idee, suggerimenti?
Paolo
in effetti stampo una cifra decimale alla volta come se fosse un intero da 0 a 9: ad ogni iterazione la parte frazionaria viene moltiplicata per 10 e quindi stampata. Se voglio ad esempio tre cifre decimali dopo la virgola allora Ndigit_float vale 3 e così via. Funziona, cioè i numeri che mi aspetto sono quelli che vedo anche in fase di dubug, ma il display rimane sporco quando ad esempio si passa da un numero a tre cifre intere ad uno a due cifre intere perché non viene sovrascritto tutto per bene ma rimangono le cifre precedenti. È un problema di "pulizia" del display, per cui ho deciso di scrivere un po di spazi bianchi dopo l'ultima cifra decimale. Non mi sembra una soluzione pulita onestamente e si può fare di meglio.
Idee, suggerimenti?
Paolo
Si prega Accesso o Crea un account a partecipare alla conversazione.
8 Anni 5 Mesi fa #4
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Subroutine per la stampa di un floating point
In effetti il problema credo sia quello che ho detto prima.
La lunghezza del numero non e' solo quella delle cifre decimali che vuoi scrivere ma anche della parte non decimale.
Per cui devi tenere conto anche di Ndigit_int.
Forse e' meglio se lavori su una stringa e poi invii la stringa risultante.
Saluti,
Mauro
La lunghezza del numero non e' solo quella delle cifre decimali che vuoi scrivere ma anche della parte non decimale.
Per cui devi tenere conto anche di Ndigit_int.
Forse e' meglio se lavori su una stringa e poi invii la stringa risultante.
Saluti,
Mauro
Si prega Accesso o Crea un account a partecipare alla conversazione.
- paoletto
- Autore della discussione
- Elit Utente
Less
Di più
- Messaggi: 186
- Ringraziamenti ricevuti 3
8 Anni 5 Mesi fa #5
da paoletto
Risposta da paoletto al topic Subroutine per la stampa di un floating point
Si certamente, è come dici: lo spazio occupato dipende anche dal numero di cifre intere. Proverò a lavorare con una stringa e passarla alla funzione write_string.
In effetti facciamo quello che farebbe la sprinf()...soltanto se funzionasse!
Vi farò sapere
Paolo.
In effetti facciamo quello che farebbe la sprinf()...soltanto se funzionasse!
Vi farò sapere
Paolo.
Si prega Accesso o Crea un account a partecipare alla conversazione.
Moderatori: Mauro Laurenti, StefA
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Forum - Ultimi messaggi
-
- Freedom III e compilazioni fallite
- da Mauro Laurenti
-
- MODULO GSM SIM900A
- da FABRIZIO
-
- LTerminal - nuove funzioni
- da Mauro Laurenti
-
- Aggiornamento sito completato
- da Mauro Laurenti
-
- registro a scorrimento PIPO in cascata
- da Mauro Laurenti