Salve, sto facendo un circuito con pic16f876, tastiera a matrice e display lcd 20x4. Ho una variabile tipo char usata come contatore, e mi serve visualizzare sull'lcd il valore di questo contatore. Come si fa a convertire un valore numerico in una stringa ascii da usare con il comando Lcd_out(...); ? Uso MikroC
Grazie.
Didn't find your answer? Ask the community — no account required.
P
Pier GSi
"Telespalla Bob" ha scritto nel messaggio news:51bb7da5$0$1373$ snipped-for-privacy@reader1.news.tin.it...
unsigned char cifra1,cifra2,cifra3,cifra4;
void decbcd (unsigned int valore){
cifra1 = valore % 10; valore = valore / 10; cifra2 = valore % 10; valore = valore / 10; cifra3 = valore % 10; cifra4 = valore / 10;
}
poi, con:
decbcd(1435);
Ottengo in cifra1, cifra2, cifra3 e cifra4 migliaia, centinaia, decine, unita'.
Ciao, Pier.
formatting link
I
i3hev, mario
se non ricordo male, io ho usato un semplice sprintf()
--
73 es 51 de i3hev, op. mario
Non è Radioamatore, se non gli fuma il saldatore!
- Campagna "Il Radioamatore non è uno che ascolta la radio"
it.hobby.radioamatori.moderato
formatting link
formatting link
Q
qUAD dAMAGE
Il 14/06/2013 22:31, Telespalla Bob ha scritto:
premetto che non conosco il mikroc,
potresti allocare un piccolo buffer di 16 caratteri
poi lo formatti con snprintf (o sprintf se il tuo compilatore non è ansi C compatibile)
snprintf(buf,16,Valore: %u,variabile_contatore);
infine invia al display la stringa formattata: Lcd_out(1,1,buf);
Ricordati di includere la libreria string.h
#include
Esiste anche la funzione itoa() che converte un intero in una stringa, ma non l'ho mai utilizzata.
Ciao
T
Telespalla Bob
Il 14/06/2013 22:41, Pier GSi ha scritto:
Ok, grazie. comunque sicuro che non sia il contrario, ovvero unità in cifra1 e via di seguito? però a me serve il codice ascii corrispondente ad ogni cifra del valore da visualizzare.
T
Telespalla Bob
Il 14/06/2013 23:00, qUAD dAMAGE ha scritto:
grazie, itoa() non la trovo in mikroc proverò a studiare questa sprintf, non la conoscevo... ciao.
C
Claudio_F
Il 15/06/2013 08:58, Telespalla Bob ha scritto:
Si, unita' in cifra1, tra l'altro questo sistema secondo me usa molte meno risorse di funzioni generali di conversione (stiamo parlando di un PIC di fascia media/bassa, quindi userei il C il piu' possibile in "modo assembly")
Aggiungere 48? ;)
P
Pier GSi
"Telespalla Bob" ha scritto nel messaggio news:51bc1094$0$1358$ snipped-for-privacy@reader2.news.tin.it...
Si scusa, ovviamente avete ragione...ero di fretta ed ho invertito.
Come ti ha detto Claudio_F basta aggiungere 48 ed ottieni il carattere ASCII corrispondente.
usando la mia libreria
void lcd_putch(char c) { LCD_RS = 1; // caratteri PORTC = (PORTC & 0xF0) | (c >> 4); //caricamento primi 4 bit LCD_STROBE; //ciclo il pin EN PORTC = (PORTC & 0xF0) | (c & 0x0F); //caricamento altri 4 bit LCD_STROBE; //ciclo il pin EN DelayUs(50); }
E' un metodo semplice, siccome sono microprocessori poco potenti preferisco evitare routine complesse. In genere evito anche di lavorare in virgola mobile per poi formattare il risultato, se ad esempio mi è necesasrio un decimale preferisco fare le operazioni con numeri interi moltiplicando per
10 e poi inserire il punto decimale quando è ora di visualizzare su display:
decbcd(2349); //visualizzo 234.9
if(cifra4){lcd_putch(cifra4+48);}else{lcd_putch(' ' );} //soppressione zero non significativo
if(cifra4==0 && cifra3==0){lcd_putch(' ');}else{lcd_putch(cifra3+48);} //soppressione zero non siginficativo