Pregunta

Programaba una imagen de 16f84a en hitech C para manejar un hd44780 lcd. Hasta ahora tengo el lcd inicializado y puedo escribir caracteres individuales y cadenas en el lcd. Ahora necesito hacer algo como esto:

var = 250;
lcd_write_string (" MyVar tiene el valor: " + var);
entonces el lcd debería mostrar "MyVar tiene un valor: 250"

En primer lugar, ¿cómo debo concatenar una var y una cadena? segundo, la variable var contiene un número binario de 8 bits (0-255 en decimal). Si var = 23; el número de 8 bits debe dividirse en 2 para representar el 2 y el 3 en ascii para que luego se muestre en el lcd. ¿Cómo puedo hacer esto? Parece que tengo que hacer conversiones de base 10 o un árbol if para dividir todos los números de 2 dígitos que luego se mostrarán en la pantalla LCD. ¿Hay alguna manera más fácil de evitar esto?

¡gracias!

¿Fue útil?

Solución

¿Por qué no usas 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);

Otros consejos

Suponiendo que su conjunto de herramientas no incluye la biblioteca C estándar, o que desea descubrir cómo hacerlo usted mismo, este es el enfoque que tomaría:

Declare un búfer de tantos caracteres como la pantalla LCD puede mostrar. Escriba su cadena fija en el comienzo de ese búfer. Determine cuántos caracteres de ancho tendrá su variable (hay algunas matemáticas que dejaré aquí, pero creo que es un ejercicio razonable). Usando esa longitud y la longitud de la cadena fija, averigua dónde irán los dígitos de tu número en el búfer. Usando las mismas construcciones matemáticas que antes, escribe los dígitos en ese espacio, uno por uno. Hay un truco del lenguaje C (requerido por el estándar) que le permite calcular el valor de carácter de un dígito decimal mediante la expresión '0' + dígito . Con suerte, ya ves cómo funciona. Finalmente, finalice el búfer como su función lcd_write_string espera, y llámelo en el búfer.

Como lo indicaron otros encuestados, esto esencialmente implementa una pequeña parte de la familia de funciones printf de la biblioteca estándar. Creo que vale la pena averiguar la implementación, incluso si puede (y debería) usar la biblioteca en el código de producción.

Dado que esto huele vagamente a tarea, no estoy elaborando más por el momento. Si necesita ayuda sobre puntos específicos, buscaré actualizaciones para la pregunta.

Si el compilador de C viene con las funciones de biblioteca estándar de C, entonces sprintf se puede usar de manera similar a printf , para producir una cadena.

sprintf puede usarse para producir una cadena formateada (como char * ), que presumiblemente podría enviarse a la función lcd_write_string .

El problema con sprintf () es que no sabe cuántos bytes necesita asignar antes de llamar a sprintf (). Usualmente uso el siguiente ksprintf () como reemplazo.

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

Para usar eso:

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 () no funciona con glibc 2.0 porque vsnprintf no devuelve el número de bytes en la cadena. Necesita duplicar repetidamente la memoria en la asignación. Linux man page " man snprintf " También da un ejemplo. En su sistema, debe verificar el comportamiento de su vsnprintf (), que es C99, no C90.

Otra forma de hacer esto sería usar lcd_write_string como puntero de función y hacer esto:

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

Esto funciona correctamente en el compilador CCS Pic C, si lcd_write_string se declara como

void lcd_write_string (char c);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top