Domanda su programmazione pic in C

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.

Reply to
Telespalla Bob
Loading thread data ...

"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

Reply to
Pier GSi

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

Reply to
i3hev, mario

Il 14/06/2013 22:31, Telespalla Bob ha scritto:

premetto che non conosco il mikroc,

potresti allocare un piccolo buffer di 16 caratteri

unsigned char buf[17]; (16 caratteri + terminatore)

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

Reply to
qUAD dAMAGE

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.

Reply to
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.

Reply to
Telespalla Bob

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? ;)

Reply to
Claudio_F

"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); }

lcd_putch(cifra4+48); lcd_putch(cifra3+48); lcd_putch(cifra2+48); lcd_putch(cifra1+48);

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

lcd_putch(cifra2+48); lcd_putch('.'); lcd_putch(cifra1+48);

Ciao, Pier.

formatting link

Reply to
Pier GSi

Il 15/06/2013 11:35, Claudio_F ha scritto:

ok, grazie, risolto. se però volessi visualizzare quel valore in esadecimale la cosa si complica, giusto? Qualche idea?

Grazie.

Reply to
Telespalla Bob

Il 16/06/2013 22:35, Telespalla Bob ha scritto:

No :D

In realta' e' piu' semplice e veloce visto che una cifra hex corrisponde esattamente a 4 bit:

cifra1 = valore & 15; valore >>= 4; cifra2 = valore & 15; valore >>= 4; cifra3 = valore & 15; valore >>= 4; cifra4 = valore;

cifra1 sono le unità (da 0 a 15) per avere i codici ascii sommi 48 ai valori da 0 a 9, e 65 a quelli da

10 a 15
Reply to
Claudio_F

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.