01 – Librería XLCD para el manejo de displays LCD

XLCD.h es una librería del compilador C18 de Microchip, que se utiliza para controlar displays LCD. Esta librería puede utilizarse con XC8 para realizar la misma función.

En la guía MPLAB para las librerías del compilador C18 (pág. 75) se explican detalladamente las funciones disponibles así como los argumentos de cada una de ellas. También, proporciona un pequeño ejemplo de implementación. Recomiendo que se revise dicho documento para comprender con mayor facilidad el código que aquí se muestra. El display que vamos a utilizar es un 16×2 basado en el controlador HITACHI HD44780, el cual es ampliamente utilizado en circuitos de visualización microcontrolados.

El circuito.

La librería viene pre configurada (xc8 ver 1.2) de la siguiente manera:

  • Puerto de datos: Puerto B.
  • Modo de operación: 4 bits, parte baja del puerto B (B0:B3). Esto significa que B0 debe conectarse a D4 del display, B1 a D5, B2 a D6 y B3 a D7.
  • LCD RS: B5
  • LCD RW: B6
  • LCD E: B4

Esta configuración es muy eficiente ya que podemos controlar el display con un solo puerto, el circuito de prueba en Proteus sería similar al siguiente:

CIrcuito LCD

En el circuito no se muestra el cristal de cuarzo a utilizar que en este caso será de 20MHZ, de manera que el oscilador se configurará convenientemente para proporcionar un Fosc = 48MHZ. De acuerdo con el datasheet del microcontrolador (pág. 30) PLLDIV debe ser = 5, para proporcionar 4MHZ al circuito PLL y HSPLL debe ser = 2 (96MHZ /2) para asegurar 48MHZ como Fosc. La definición precisa del Fosc es vital cuando se utiliza la librería XLCD por lo tanto, se debe procurar que la Fosc deseada esté correctamente configurada.

Funciones de retardo requeridas.

La librería requiere que el usuario defina los siguientes retardos para el display:

Funciones de retardo de xlcd

Estas funciones deben calcularse manualmente tomando como base la Fosc anteriormente configurada. Veamos en detalle cada una de ellas:

DelayFor18TCY: requiere 18 ciclos de instrucción, hay dos métodos para conseguir este retardo. Un método consiste en repetir secuencialmente unas doce veces la función Nop(). La otra manera es utilizar la función Delay10TCYx() pasándole como argumento un valor entero que represente el retardo equivalente a 18TCY, haciendo unos cálculos se puede decir que este valor anda por 2.5 por MHZ. Entonces, estamos trabajando con un Fosc = 48MHZ tendríamos que 2.5 x 48 = 120, la función nos quedaría Delay10TCYx(120). Personalmente prefiero este segundo método, la función completa sería así:

void DelayFor18TCY(void)
{
 Delay10TCYx(120);
}

DelayPORXLCD: se utiliza para implementar un retardo de 15ms. Para este caso se utiliza la ecuación (15ms x 48MHZ) / 4, que nos da como resultado 180000, tomamos 180 como argumento para el método, de manera que el código sería:

void DelayPORXLCD(void)
{
 Delay1KTCYx(180);
 return;
}

DelayXLCD: se utiliza para implementar un retardo de 5ms, aplicamos la misma ecuación de manera que: (5ms x 48MHZ) / 4, nos da como resultado 60000, tomamos 60 como argumento para el método:

void DelayXLCD(void)
{
 Delay1KTCYx(60);
 return;
}

Utilizando las ecuaciones anteriores, podemos adecuarnos perfectamente o cualquier otro Fosc soportado por el microcontrolador.

El código completo es el siguiente:

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <plib/xlcd.h>
#include <plib/delays.h>

//CON ESTE ORDEN DE CONFIGURACION FUNCIONA RB5.....
#pragma config PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 2
#pragma config FOSC = HSPLL_HS, FCMEN = OFF, IESO = OFF
#pragma config PWRT = OFF, BOR = OFF, VREGEN = OFF
#pragma config WDT = OFF, WDTPS = 32768
#pragma config MCLRE = ON, LPT1OSC = OFF, PBADEN = OFF
#pragma config STVREN = ON, LVP = OFF, ICPRT = OFF, XINST = OFF

#define _XTAL_FREQ 48000000

//Retardos requeridos por la librería XLCD
void DelayFor18TCY(void);
void DelayPORXLCD(void);
void DelayXLCD(void);

int main() {
 //Configurando LCD 4 bits mutilínea
 OpenXLCD(FOUR_BIT & LINES_5X7);
 //Esperar hasta que el display esté disponible.
 while(BusyXLCD());
 //Mover cursor a la derecha...
 WriteCmdXLCD(0x06);
 //Desactivando el cursor.
 WriteCmdXLCD(0x0C);

 while(1)
 {
 //Primera línea
 SetDDRamAddr(0x00);
 putrsXLCD("HOLA");
 //Segunda línea
 SetDDRamAddr(0x40);
 putrsXLCD("MUNDO");
 }

}
void DelayFor18TCY(void)
{
 Delay10TCYx(120);
}

void DelayPORXLCD(void)
{
 Delay1KTCYx(180);
 return;
}

void DelayXLCD(void)
{
 Delay1KTCYx(60);
 return;
}

Al simular en Proteus veríamos lo siguiente:

Simulacion

Consideraciónes sobre la implementación en el circuito.

Como se puede observar en la configuración de los bits del microcontrolador, he colocado un comentario respecto a RB5, esto se debe a que he notado que algunas veces el puerto B funciona erróneamente cuando se coloca la configuración autogenerada por MPLABX mediante la herramienta “Configuration bits”. Por lo general utilizo esta herramienta, pero en este caso particular para evitar estos “extraños errores” prefiero editar los bits de configuración manualmente, dejándolos tal como se observa en el código anteriormente mostrado. Aclaro que este comportamiento anómalo se da únicamente en el circuito real no en la simulación. El siguiente micro video muestra la ejecución en el circuito:

Conclusiones.

Utilizar la librería XLCD es sencillo, pero que pasaría si ya tenemos un circuito previamente diseñado que no utiliza el puerto B como puerto de datos,  en este caso debemos modificar las macro de la librería y compilarla nuevamente, aprovechando que la placa de desarrollo que estoy utilizando tiene conectado el display al puerto D, explicaré posteriormente como cambiar las configuraciones por defecto.

Acerca de jjguevara09

Me gusta la electrónica
Esta entrada fue publicada en Microcontroladores PIC y etiquetada , , , , , , . Guarda el enlace permanente.

8 respuestas a 01 – Librería XLCD para el manejo de displays LCD

  1. Alejandro dijo:

    buen documento y bien explicado (Y)

    Me gusta

  2. Pingback: 02 – Modificando la librería XLCD | guias para principiantes

  3. Excelente tutorial, muchas gracias.

    Me gusta

  4. anonimo dijo:

    no me funciona, ya eh intentado usar la libreria desde una carpeta, copiandola con todas las demas y mandándola a llamar como header pero nada

    Me gusta

  5. ANgeL dijo:

    FUNCIONA IGUAL PARA EL PIC16G877A

    Me gusta

    • jjguevara09 dijo:

      Buen día, si te refieres al PIC16F877A, la respuesta es no, ya que las librerías periféricas solo están disponibles para la familia PIC18. Para este PIC habría que construir la librería “manualmente”.

      Me gusta

  6. nb dijo:

    excelentes tutoriales, podrías hacer un ejemplo para conectar un termopar tipo k a este pic… muchas gracias…

    Me gusta

  7. Pingback: 10 -Display LCD 20×4 con librería xlcd.h (XC8) | Guías para principiantes

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s