PIC 18F45XX EL CONTROL DEL LCD 1. Driver <xlcd.h> Microchip proporciona un driver <xlcd.h> que contine todas las funciones para controlar un LCD genérico con controlador Hitachi HD44780. El archivo se encuentra situado en: c:\Archivos de programa\Microchip\mplabc18\3.40\h El driver necesita que las siguientes funciones de retardo estén declaradas y programadas correctamente: * DelayFor18TCY() * DelayPORXLCD() * DelayXLCD() 1Tcy=4/Fosc, para Xtal de 20Mhz 1Tcy=0.2us 2 2. Funciones de retardo FUNCIONES DE RETARDO OBLIGATORIAS PARA PROGRAMAR EL LCD. Retardos calculados para Xtal=20Mhz void DelayFor18TCY(void) { Delay10TCYx(3); // Retardo de al menos 18 TCy } void DelayXLCD(void) { Delay1KTCYx(30); // Retardo de al menos 5ms } void DelayPORXLCD(void) { Delay1KTCYx(90); // Retardo de al menos 15ms } 3 4. Funciones básicas de control (I) void OpenXLCD(unsigned char lcdtype); Sirve para configurar el tipo de LCD y el tamaño de la matriz de puntos, generalmente 5x7. Es la primera función a ejecutar para poder utilizar el LCD. OpenXLCD(FOUR_BIT & LINES_5X7); unsigned char BusyXLCD(void); Devuelve un cero cuando el lcd está listo para recibir datos. void WriteCmdXLCD(unsigned char cmd); Envía un comando al lcd. Los comandos básicos son: 0b00001111 0b00001011 0b00001111 0b00001101 0b00001111 0b00001110 0b00000001 0b11000000 // Display on // Display off // Cursor on // Cursor off // Cursor Blink // Cursor No Blink // Borrar lcd // Cambio de línea 4 4. Funciones básicas de control (II) void SetCGRamAddr(unsigned char Cgaddr); Selecciona el generador de caracteres. Los datos se guardan en la CGRam. void SetDDRamAddr(unsigned char Ddaddr); Selecciona la ram de datos. Los datos se muestran en el lcd. void WriteDataXLCD(char data); Envía un byte de datos al lcd (DDRam o CGRam en función de la selección). void putsXLCD(char *buffer); Envía una cadena de caracteres void putrsXLCD(const rom char *buffer); Envía una cadena de caracteres en rom 5 5. Funciones de usuario (I) Además de las funciones básicas que proporciona el driver podemos añadir nuevas funciones de control personalizadas. void lcd_init(void) // Configura el lcd y lo prepara para recibir datos/comandos { OpenXLCD(FOUR_BIT & LINES_5X7); // Interface 4Bits con matriz 5x7 ptos. while(BusyXLCD()); // Esperar lcd=listo WriteCmdXLCD(0x01); // Clear display while(BusyXLCD()); // Esperar lcd=listo WriteCmdXLCD(DON&CURSOR_OFF&BLINK_OFF); while(BusyXLCD()); // Esperar lcd=listo WriteCmdXLCD(0x02); // Comando home Delay10KTCYx(1); // Retardo de seguridad } void borrar_lcd(void) // Borra el contenido del lcd { while(BusyXLCD()); // Esperar lcd=listoLCD busy WriteCmdXLCD(0x01); // Borrar lcd } 6 5. Funciones de usuario (II) void cambio_linea(void) // Situa cursor en pos cero de la línea 2 { while(BusyXLCD()); WriteCmdXLCD(0xC0); } void gotoxy(unsigned char col , unsigned char fil) // Situa cursor en x,y { if(fil == 0) { while(BusyXLCD()); WriteCmdXLCD(0x80 | col); // Cursor en linea 1 } else { while(BusyXLCD()); WriteCmdXLCD(0xC0 | col); // Cursor en linea 2 } } 7 6. Funciones de usuario (III) void escribe_caracter(char car) // Envía un carácter { while(BusyXLCD()); WriteDataXLCD(car); } void escribe_digito(unsigned char dato8bits) // Muestra un dígito 0-9 { char tabla[10]={'0','1','2','3','4','5','6','7','8','9'}; escribe_caracter(tabla[dato8bits]); } void escribe_entero(int valor_entero) // Muestra un número entero { char txt_int[16]; itoa(valor_entero,txt_int); // Convertir int a cadena putsXLCD(txt_int); // Mostrar cadena en lcd } 8 7. Creación de un carácter especial (I) El lcd puede mostrar en pantalla cualquiera de los caracteres de la siguiente tabla: 9 7. Creación de un carácter especial (II) Para mostrar en el lcd el carácter 'H' (código 0x48) podemos usar la función: WriteDataXLCD(0x48); o bien WriteDataXLCD('H'); Pero el lcd dispone de 16 posiciones de memoria interna para el generador de caracteres (CGRAM). Para generar un carácter especial hay que enviar al lcd el comando que permite escribir en el generador de caracteres (comando 0x40). Cada carácter ocupa 8 posiciones de memoria, una por cada línea según la tabla siguiente: CGRAM Inicio<>Fin ==================== 0x00 0x40<>0x47 0x01 0x48<>0x4F 0x02 0x50<>0x57 0x03 0x58<>0x5F “ 0x0F “ “ 0xB8<>0xBF 10 7. Creación de un carácter especial (III) Para crear un carácter de una cara sonriente en la posición 0x00 hay que escribir en la cgram los 8 datos que componen el carácter según se indica en la figura: La función anterior carga el carácter en la cgram pero para poder verlo en el lcd hay que usar la función: WriteDataXLCD(0); 11 8. Ejemplo de programación Realizar un programa que muestre en el LCD el texto “I.E.S Luis de Lucena”. Al pulsar RA3 el texto debe cambiar a “D.P.E Curso 2012/2013” durante dos seguntos y volver a mostrar el mensaje inicial. RA3 => 12 Solución (1/2) 13 Solución (2/2) 14 Simulación 15