Aquí va un corto pero interesante artículo acerca de cómo utilizar la función printf de C para escribir en un LCD utilizando el compilador HITECH-C Lite. No tengo intención ahora mismo de explicar el procedimiento para escribir en un LCD dado que necesitaría una entrada enorme. Por éso ésta entrada está orientada a todos aquellos programadores de PICs que al igual que yo se han topado con los problemas de escribir, por ejemplo, un numero decimal en un display LCD, 8 segmentos, puerto serie, etc.
En el C "de toda la vida", para imprimir algo en la salida estándar, la manera más común es echar mano de la librería stdio.h. Entre otras muchas funciones que define ésta librería se encuentra la función printf.
Un pequeño ejemplo:
#include <stdio.h>
void main(){
void main(){
int miEdad = 22;
printf("Mi edad es %d", miEdad);
getchar(); // Paramos la ejecución hasta que se pulse una tecla
}printf("Mi edad es %d", miEdad);
getchar(); // Paramos la ejecución hasta que se pulse una tecla
Lo que nos interesa de éste pequeño código es la línea 4. Es decir, la línea en la que aparece el printf de marras. El resultado de éste programa mostraría por pantalla el texto "Mi edad es 22".
Para refrescar la memoria de aquellos que no se acuerden del uso exacto de ésta función, como primer parámetro se envía la cadena con los tokens %, y los demás parámetros son los valores o variables que deseamos que aparezcan en lugar de cada token respectivamente. Así %d es substituido por el valor de la variable miEdad en nuestro programilla.
Una vez entendido ésto, si lo pasamos a PIC C (a partir de ahora haremos referencia de ésta manera al lenguaje utilizado para el compilador HITECH C) nos encontramos con que al compilar se muestra un error que nos viene a explicar que falta la función "putch".
Por lo que he podido deducir de mis escasas experiencias, la función printf() se encarga de construir la cadena, realizando los cálculos necesarios en los valores pasados como parámetro, y posteriormente los sustituye. Digamos que crea una cadena con el formato que queremos. A continuación, llama a la función putch() una vez por cada carácter de la cadena en cuestión. Y simplemente, la función putch() envía el carácter recibido a la salida estándar.
Aquí viene el meollo de la cuestión. En C normal, la salida estándar viene predefinida como la consola de dos, bash...etc. Generalmente es lo más común a la hora de probar los programas. Digamos que ya viene así montado, y si quieres que esa información se envíe a otro sitio tienes que modificar la salida.
En cambio, en PIC C, la función putch() viene definida como vacía. No tiene código. De ésta manera somos nosotros quienes al crear nuestro programa, decidimos a dónde van a parar nuestros datos.
Se deduce entonces de la información anterior, que para escribir (por ejemplo) en el puerto B, solo hay que hacer 3 cosas:
- Incluir la libreria stdio.h.
- Definir la función void putch(char c)
- Llamar a printf() de la forma normal.
Para terminar de aclarar todo ésto, un ejemplo:
/* LA IDEA ES IMPRIMIR LA CADENA "Mi edad es 22" MEDIANTE LA FUNCIÓN PRINTF EN UN LCD, Y UTILIZANDO EL FORMATO DE CADENAS TÍPICO DE C (%d) /*
#include <htc.h>
#include <stdio.h>
#define _XTAL_FREQ 8000000
#include "C:\users\Marcos\Electronica\lib\lcd.h"
void putch(char c){ // DEFINIMOS LA FUNCIÓN PUTCH
void main(void){
int miEdad = 22; // DECLARAMOS UNA VARIABLE
printf("Mi edad es %d", miEdad); // IMPRIMIMOS
while(1); // NO HACER NADA
}
Cuando utilicéis la función printf tened en cuenta que el uso de memoria se va a disparar. Sobre todo cuando#include <htc.h>
#include <stdio.h>
#define _XTAL_FREQ 8000000
#include "C:\users\Marcos\Electronica\lib\lcd.h"
void putch(char c){ // DEFINIMOS LA FUNCIÓN PUTCH
lcd_putc(c); // ENVIAMOS EL CHAR AL LCD
}void main(void){
int miEdad = 22; // DECLARAMOS UNA VARIABLE
printf("Mi edad es %d", miEdad); // IMPRIMIMOS
while(1); // NO HACER NADA
utilicéis impresión de datos en coma flotante (%f). Si teneis alguna pregunta no dudéis en
Un saludo!!
Marcos R. - @IAmRutiguer
si podes, seria bueno que colocaras el código de la función lcd_putc(c),
ResponderEliminar