Domanda

Sto programmando una foto 16f84a in hitech C per pilotare un hd44780 lcd. Finora ho inizializzato l'LCD e posso scrivere singoli caratteri e stringhe sull'LCD. Ora devo fare qualcosa del genere:

var = 250;
lcd_write_string (" MyVar ha valore: " + var);
quindi l'LCD dovrebbe mostrare "MyVar ha un valore: 250"

Prima di tutto come dovrei concatenare una var e una stringa? secondo, la variabile var contiene un numero binario a 8 bit (0-255 in decimale). Se var = 23; il numero di 8 bit deve essere diviso in 2 per rappresentare il 2 e il 3 in ascii per essere quindi mostrato dall'LCD. come posso fare questo? Sembra che devo fare 10 conversioni di base o un albero if per dividere tutti i numeri a 2 cifre per poi essere visualizzati nell'LCD. C'è un modo più semplice per aggirare questo?

grazie!

È stato utile?

Soluzione

Perché non usi semplicemente printf ("% d " ;, var) ?

var = 250;
char *static_msg = "MyVar has value:";
char msg[sizeof(static_msg) + 4];

sprintf(msg, "%s %d", static_msg, var);
lcd_write_string(msg);

Altri suggerimenti

Supponendo che il tuo set di strumenti non includa la libreria C standard o che tu voglia capire come farlo da solo, ecco l'approccio che prenderei:

Dichiara un buffer di tanti caratteri quanti possono essere visualizzati sul display LCD. Scrivi la tua stringa fissa all'inizio di quel buffer. Determina quanti caratteri saranno larghi la tua variabile (c'è un po 'di matematica che tralascerò qui, ma penso che sia un esercizio ragionevole). Usando quella lunghezza e la lunghezza della stringa fissa, scopri dove andranno le cifre del tuo numero nel buffer. Usando gli stessi costrutti matematici di prima, scrivi le cifre in quello spazio, una per una. C'è un trucco del linguaggio C (richiesto dallo standard) che ti consente di capire il valore del carattere di una cifra decimale con l'espressione '0' + digit . Spero che tu veda come funziona. Infine, termina il buffer comunque la tua funzione lcd_write_string e chiamalo sul buffer.

Come indicato da altri intervistati, questo implementa essenzialmente una piccola parte della famiglia di funzioni printf della libreria standard. Penso che valga la pena capire l'implementazione, anche se puoi (e dovresti!) Usare la libreria nel codice di produzione.

Dal momento che questo puzza vagamente di compiti a casa, non sto ancora elaborando ulteriormente. Se hai bisogno di aiuto su punti specifici, cercherò aggiornamenti alla domanda.

Se il compilatore C include le funzioni standard della libreria C, sprintf può essere usato in modo simile a printf , al fine di produrre una stringa.

sprintf può essere utilizzato per produrre una stringa formattata (come char * ), che presumibilmente potrebbe essere inviata alla funzione lcd_write_string .

Il problema con sprintf () è che non sai quanti byte devi allocare prima di chiamare sprintf (). Di solito uso il seguente ksprintf () in sostituzione.

typedef struct __kstring_t {
  size_t l, m;
  char *s;
} kstring_t;

int ksprintf(kstring_t *s, const char *fmt, ...)
{
  va_list ap;
  int l;
  va_start(ap, fmt);
  l = vsnprintf(s->s + s->l, s->m - s->l, fmt, ap); // not working with glibc 2.0
  va_end(ap);
  if (l + 1 > s->m - s->l) {
    s->m = s->l + l + 2;
    kroundup32(s->m);
    s->s = (char*)realloc(s->s, s->m);
    va_start(ap, fmt);
    l = vsnprintf(s->s + s->l, s->m - s->l, fmt, ap);
  }
  va_end(ap);
  s->l += l;
  return l;
}

Per usarlo:

kstring_t *str = calloc(1, sizeof(kstring_t));
ksprintf(str, "%s, %d\n", aString, aInteger);
ksprintf(str, "a second line: %s\n", aString2);
free(str->s); free(s);

ksprintf () non funziona con glibc 2.0 perché vsnprintf non restituisce il numero di byte nella stringa. È necessario raddoppiare ripetutamente la memoria nell'allocazione. Pagina man di Linux " man snprintf " fornisce anche un esempio. Sul tuo sistema, dovresti controllare il comportamento di vsnprintf (), che è C99, non C90 però.

Un altro modo per farlo sarebbe usare lcd_write_string come puntatore a funzione e fare questo:

printf(lcd_write_string,"MyVar has value: %d",var)

Funziona correttamente sul compilatore CCS Pic C, se lcd_write_string è dichiarato come

void lcd_write_string (char c);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top