2009-09-13 6 views
1

Je programmation une image 16f84a dans C de hitech pour conduire un LCD hd44780. Jusqu'à présent, j'ai lcd initialisé et peut écrire des caractères individuels et des chaînes à l'écran LCD. Maintenant, je dois faire quelque chose comme ceci:Comment concaténer des vars dans une image programmée c?

var = 250;
lcd_write_string ("MyVar a la valeur:" + var);
si l'écran doit afficher « MaVar a une valeur: 250 »

d'abord comment dois-je concaténer un var et une chaîne? Ensuite, 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 ensuite être affiché par le lcd. Comment puis-je faire ceci? Il semble que je doive faire des conversions en base 10 ou un arbre if pour diviser tous les nombres à 2 chiffres pour ensuite les afficher dans le lcd. Y a-t-il un moyen plus simple de contourner cela?

merci!

+0

A google rapide suggère qu'il existe de nombreux compilateurs pour ce PIC. La réponse dépendra de celle que vous utilisez. –

Répondre

4

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); 
+0

merci les gars, la réponse de qrdl a fonctionné. Cependant, l'utilisation de printf charge les bibliothèques externes et nécessite plus de mémoire. Je l'ai eu comme ça: lcd_write_num (var/10); lcd_write_num (var% 10); mais cela ne fonctionne que pour les nombres à 2 chiffres. le hic est que le 16f84a a si peu de mémoire en utilisant l'une de ces 2 méthodes pratiquement surchargé la photo. J'ai fini par utiliser un 16f628a et les choses fonctionnent parfaitement maintenant en utilisant la méthode de qrdl. Merci beaucoup! – Juank

+0

trouvé une autre option concernant la manipulation des chiffres pas de concaténation. vérifier: http://www.mikroe.com/fr/books/picbook/5_chapter.htm – Juank

0

Si le compilateur C est livré avec les fonctions de la bibliothèque standard C, puis sprintf peut être utilisé similaire à printf, afin de produire une chaîne.

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

1

Supposant votre jeu d'outils ne comprend pas la bibliothèque standard C, ou que vous voulez savoir comment faire vous-même, voici l'approche que je prendrais:

Déclare un tampon autant de caractères que l'écran LCD peut afficher. Ecrivez votre chaîne fixe dans le début de ce tampon. Déterminez combien de caractères votre variable sera (il y a des maths que je laisse de côté ici, mais c'est un exercice raisonnable je pense). En utilisant cette longueur, et la longueur de la chaîne fixe, déterminez où iront les chiffres de votre numéro. En utilisant les mêmes constructions mathématiques que précédemment, écrivez les chiffres dans cet espace, un par un. Il y a une astuce du langage C (requis par la norme) qui vous permet de déterminer la valeur de caractère d'un chiffre décimal par l'expression '0' + digit. J'espère que vous voyez comment cela fonctionne. Enfin, terminez le tampon mais votre fonction lcd_write_string attend, et appelez-le sur le tampon.

Comme indiqué par d'autres répondants, cela implémente essentiellement une petite partie de la famille de fonctions printf de la bibliothèque standard. Je pense qu'il vaut la peine de comprendre la mise en œuvre, même si vous pouvez (et devriez!) Utiliser la bibliothèque dans le code de production. Comme cela sent vaguement comme devoir, je n'élabore pas encore plus loin. Si vous avez besoin d'aide sur des points spécifiques, je rechercherai les mises à jour de la question.

0

Le problème avec sprintf() est que vous ne savez pas combien d'octets vous devez allouer avant d'appeler sprintf(). J'utilise habituellement ksprintf() 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 que:

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 glibc 2.0, car vsnprintf ne retourne pas le nombre d'octets dans la chaîne.Vous devez doubler à plusieurs reprises la mémoire dans l'allocation. La 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.

0

Une autre façon de le faire serait d'utiliser lcd_write_string comme un pointeur de fonction et faire ceci:

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

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

void lcd_write_string (char c); 
+0

Cela ne fonctionnera que si c'est le compilateur CCS. C'est une solution de contournement pour ce compilateur car il ne peut pas passer une chaîne constante complète en paramètre, donc il définit la fonction comme un char et permet au programmeur de surmonter cette lacune du compilateur, générant automatiquement les boucles internes pour l'imprimer. –

Questions connexes