Librería para manejo LCD compatible con Hitachi 44780. Dispone de la posibilidad de trabajar en modo de 4-bits con R/W siempre y cuando se seleccionen pines tolerables a 5V para dispositivos de 3.3V o sin R/W. También implementa el manejo del LCD mediante 3 pines y un registro de desplazamiento (4094, 74164, ect) todos estos modos se selecciona con 2 definiciones (USE_RW y USE_3PINES).
Tiene implementada las siguientes funciones:
• Open_LCD(Tipo)
o Tipo = LINEA_5X7,LINEA_5X10 o LINEAS_5X7
• BusyLCD();
• WriteCmdLCD(cmd)
• putcLCD(data) .Con reconocimiento de caracteres especiales ‘\f’,’\n’
• putsLCD(*data)
• GotoxyLCD(x,y)
Ejemplo:
Modo 4 bits con R/W:
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=29138.0;attach=11028)
Modo 3 pines y registro de desplazamiento:
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=29138.0;attach=11030)
Modificación de funciones de bajo nivel de la librería stdio.h para re-direccionar salida de datos de printf.
Podemos utilizar la función printf para formatear datos y enviar por puerto UART, SPI, CAN, I2C (Caso especial) y LCD entre otros ejemplos. Una forma fácil que encontré fue la siguiente:
Agregar una variable externa a la función write.c (…\Microchip\MPLAB C30\src\pic30) __OUT_PER que seleccionará que periférico utilizar para la salida de datos. Esta variable la definimos en nuestro archivo principal y allí controlaremos su valor.
En el archivo write.c solo hacemos un switch para seleccionar los periféricos de salida de datos manteniendo la original sin hacer cambios mayores:
extern int __OUT_PER;
switch(__OUT_PER){
case 0: // UART
while ((ustatus->TRMT) ==0);
*txreg = *(char*)buffer++;
break;
case 1: // LCD
WriteDataLCD(*(char*)buffer++);
break;
case 2: // SPI
break;
case 3: // CAN
break;
}
También debemos agregar la definición de la función externa utilizada, por ejemplo para el caso del LCD:
extern void WriteDataLCD(char data);
Y no debemos olvidarnos de agregar el archivo write.c al proyecto para que sea re-compilado y efectivizar los cambios.
Quedando la librería con la modificación para usar printf en el envío de datos al LCD:
#include <p24fj64ga002.h>
/* ** *********************************************************************************** ** */
_CONFIG2(IESO_OFF & WUTSEL_LEG & FNOSC_PRI & FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMOD_HS);
_CONFIG1(JTAGEN_OFF & BKBUG_OFF & FWDTEN_OFF);
/* ** *********************************************************************************** ** */
//#define FCY 10000000UL
#include "LCD_C30.h"
#include <stdio.h>
#define LCD_rev 1.0
int __OUT_PER=1;
/* ** *********************************************************************************** ** */
main(void){
OpenLCD(LINEAS_5X7);
printf("Probando LCD\n%C30 v:%1.1f",LCD_rev
);
while(1){}
}
Saludos!