Hola a todos, pues como siempre y reconozco que siempre tropiezo en la misma piedra una y otra vez, todas las respuestas o la mayoría están en la documentación del fabricante.
en la documentación hay unas tablas donde se muestran las secuencias para la utilización del módulo LCD, no vale con hacerle un power reset solo al PIC hay que también hacérselo al display.
de todas maneras revisando el driver del fabricante he visto algunas cosas raras que he modificado y veo que funciona bien, por lo menos por lógica debería de hacerlo, ahora quiero vuestra opinión.
Resulta que las librerías suministradas por Microchip se definen las configuraciones para el manejo del módulo y por lo que veo no concuerda con lo que especifica el fabricante del LCD.
me explico.
en el archivo xlcd.h las definiciones que trae el archivo por defecto son estas.
/* Display ON/OFF Control defines */
#define DON 0b00001111 /* Display on */
#define DOFF 0b00001011 /* Display off */
#define CURSOR_ON 0b00001111 /* Cursor on */
#define CURSOR_OFF 0b00001101 /* Cursor off */
#define BLINK_ON 0b00001111 /* Cursor Blink */
#define BLINK_OFF 0b00001110 /* Cursor No Blink */
/* Cursor or Display Shift defines */
#define SHIFT_CUR_LEFT 0b00000100 /* Cursor shifts to the left */
#define SHIFT_CUR_RIGHT 0b00000101 /* Cursor shifts to the right */
#define SHIFT_DISP_LEFT 0b00000110 /* Display shifts to the left */
#define SHIFT_DISP_RIGHT 0b00000111 /* Display shifts to the right */
/* Function Set defines */
#define FOUR_BIT 0b00101100 /* 4-bit Interface */
#define EIGHT_BIT 0b00111100 /* 8-bit Interface */
#define LINE_5X7 0b00110000 /* 5x7 characters, single line */
#define LINE_5X10 0b00110100 /* 5x10 characters */
#define LINES_5X7 0b00111000 /* 5x7 characters, multiple line */
Y como se puede ver los valores no son los mismos que las especificaciones, con lo cual yo lo he dejado así:
/* Display ON/OFF Control defines */
#define DON 0b0000001100 /* Display on */
#define DOFF 0b0000001000 /* Display off */
#define CURSOR_ON 0b0000001010 /* Cursor on */
#define CURSOR_OFF 0b0000001000 /* Cursor off */
#define BLINK_ON 0b0000001001 /* Cursor Blink */
#define BLINK_OFF 0b0000001000 /* Cursor No Blink */
/*Entry mode set */
#define INCREMENT 0b0000000110 /*Increment */
#define DECREMENT 0b0000000100 /*Decrement */
#define DISPLAY_SIFT_ON 0b0000000101 /* The display sift */
#define DISPLAY_SIFT_OFF 0b0000000100 /* The display does no sift */
/* Cursor or Display Shift defines */
#define SHIFT_CUR_LEFT 0b0000010000 /* Cursor shifts to the left */
#define SHIFT_CUR_RIGHT 0b0000010100 /* Cursor shifts to the right */
#define SHIFT_DISP_LEFT 0b0000011000 /* Display shifts to the left */
#define SHIFT_DISP_RIGHT 0b0000011100 /* Display shifts to the right */
/* Function Set defines */
#define EIGHT_BIT 0b0000110000 /* 8-bit Interface */
#define FOUR_BIT 0b0000100000 /* 4-bit Interface */
#define SINGLE_LINE 0b0000100000 /* One-line display */
#define TWO_LINE 0b0000101000 /* Two-line display */
#define CARAC_5X10 0b0000100100 /* 5x10 characters */
#define CARAC_5X7 0b0000100000 /* 5x7 characters */
/* Funciones manejo display*/
#define CLEAR 0b0000000001 /*Limpiamos el LCD*/
al haber modificado yo esos parámetros ya no nos sirve la manera de llamarlos en la funciones OpenXLCD(), comandXLCD
hay una librería por ahí que la manera de emplear esos parámetros son así.
OpenXLCD(FOUR_BIT & LINES_5X7); //Configuramos el lcd como de 4 hilos
comandXLCD(DON & CURSOR_OFF & BLINK_OFF ); //Activar el display, desactivar cursor y parpadeo del cursor
Y esta es la modificación que he hecho yo
OpenXLCD(FOUR_BIT | TWO_LINE | CARAC_5X7); //Configuramos el lcd como de 4 hilos, dos líneas y carácter 5x7
while( BusyXLCD() ); //wait untill LCD controller is busy
comandXLCD(DON | CURSOR_OFF | BLINK_OFF ); //Display ON, Cursor Off, Blink Off
while( BusyXLCD() ); //wait untill LCD controller is busy
comandXLCD(INCREMENT);
while( BusyXLCD() ); //wait untill LCD controller is busy
a su vez he tenido que modificar el archivo openxlcd.c solo la sección que muestro.
// Turn the display on then off
while(BusyXLCD()); // Wait if LCD busy
WriteCmdXLCD(DOFF & CURSOR_OFF & BLINK_OFF); // Display OFF/Blink OFF
while(BusyXLCD()); // Wait if LCD busy
WriteCmdXLCD(DON & CURSOR_ON & BLINK_ON); // Display ON/Blink ON
// Clear display
while(BusyXLCD()); // Wait if LCD busy
WriteCmdXLCD(0x01); // Clear display
// Set entry mode inc, no shift
while(BusyXLCD()); // Wait if LCD busy
WriteCmdXLCD(SHIFT_CUR_LEFT); // Entry Mode
// Set DD Ram address to 0
while(BusyXLCD()); // Wait if LCD busy
SetDDRamAddr(0x80); // Set Display data ram address to 0
return;
a esta forma
// Turn the display on then off
while(BusyXLCD()); // Wait if LCD busy
WriteCmdXLCD(DOFF | CURSOR_OFF | BLINK_OFF); // Display OFF/Blink OFF
while(BusyXLCD()); // Wait if LCD busy
WriteCmdXLCD(DON | CURSOR_ON | BLINK_ON); // Display ON/Blink ON
// Clear display
while(BusyXLCD()); // Wait if LCD busy
WriteCmdXLCD(CLEAR); // Clear display
// Set entry mode inc, no shift
while(BusyXLCD()); // Wait if LCD busy
WriteCmdXLCD(SHIFT_CUR_LEFT); // Entry Mode
// Set DD Ram address to 0
while(BusyXLCD()); // Wait if LCD busy
SetDDRamAddr(0x80); // Set Display data ram address to 0
return;
Creo que lo que he hecho yo es más lógico que lo que viene por defecto, pero no obstante al igual me equivoco y el driver original tiene una razón que yo no veo, a ver si algún experto da su opinión.
gracias a todos