Question

Je programme une image 16f84a dans hitech C pour piloter un écran LCD hd44780. Jusqu'à présent, l'écran LCD est initialisé et je peux écrire des caractères individuels et des chaînes sur l'écran LCD. Maintenant, je dois faire quelque chose comme ça:

var = 250;
lcd_write_string ("MyVar a la valeur:" + var);
l’écran LCD devrait donc indiquer que "MyVar a une valeur de 250"

Tout d’abord, comment dois-je concaténer une var et une chaîne? Deuxièmement, la variable var contient un nombre binaire de 8 bits (0-255 en décimal). Si var = 23; le nombre de 8 bits doit être divisé en 2 pour représenter le 2 et le 3 en ascii pour être ensuite montré par le lcd. Comment puis-je faire ceci? Il semble que je doive faire des conversions en base 10 ou une arborescence if pour scinder tous les nombres à 2 chiffres et les afficher ensuite dans l'écran LCD. Y a-t-il un moyen plus facile de contourner cela?

merci!

Était-ce utile?

La solution

Pourquoi n'utilisez-vous pas simplement 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);

Autres conseils

Si votre jeu d'outils n'inclut pas la bibliothèque C standard ou si vous souhaitez savoir comment le faire vous-même, voici l'approche que je prendrais:

Déclarez un tampon d’autant de caractères que l’écran ACL peut en afficher. Ecrivez votre chaîne fixe au début de ce tampon. Déterminez le nombre de caractères compris dans votre variable (il y a des calculs que je laisse de côté, mais je pense que c'est un exercice raisonnable). En utilisant cette longueur et la longueur de la chaîne fixe, déterminez où vont dans le tampon les chiffres de votre numéro. En utilisant les mêmes constructions mathématiques que précédemment, écrivez les chiffres un par un dans cet espace. Il existe une astuce du langage C (requise par la norme) qui vous permet de déterminer la valeur en caractères d’un chiffre décimal à l’aide de l’expression '0' + chiffre . Espérons que vous voyez comment cela fonctionne. Enfin, terminez le tampon de la manière que votre fonction lcd_write_string l’attend et appelez-le dans le tampon.

Comme l’ont indiqué d’autres personnes interrogées, cela implémente essentiellement une petite partie de la famille de fonctions printf de la bibliothèque standard. Je pense que cela vaut la peine de comprendre l’implémentation, même si vous pouvez (et devriez!) Utiliser la bibliothèque dans le code de production.

Puisque cela sent vaguement comme un devoir, je n’élabore pas davantage pour le moment. Si vous avez besoin d'aide sur des points spécifiques, je rechercherai des mises à jour de la question.

Si le compilateur C est livré avec les fonctions de bibliothèque C standard, sprintf peut être utilisé de la même façon que printf , afin de générer une chaîne.

sprintf peut être utilisé pour produire une chaîne mise en forme (comme char * ), qui pourrait vraisemblablement être envoyée à la fonction lcd_write_string .

Le problème avec sprintf () est que vous ne savez pas combien d'octets vous devez allouer avant d'appeler sprintf (). J'utilise habituellement le ksprintf () suivant en remplacement.

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

Pour utiliser cela:

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 () ne fonctionne pas avec la glibc 2.0 car vsnprintf ne renvoie pas le nombre d'octets dans la chaîne. Vous devez doubler à plusieurs reprises la mémoire allouée. Page de manuel Linux " man snprintf " donne également un exemple. Sur votre système, vous devriez vérifier le comportement de votre vsnprintf (), qui est C99, pas C90 cependant.

Une autre méthode consiste à utiliser lcd_write_string en tant que pointeur de fonction et à procéder ainsi:

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

Ceci fonctionne correctement sur le compilateur CCS Pic C, si lcd_write_string est déclaré comme

void lcd_write_string (char c);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top