10 – Display LCD 20×4 con librería xlcd.h (XC8)

En la publicación #1, de este blog, se explicó como controlar el popular display LCD 16×2 con la librería xlcd.h, a raíz de esto, muchos me han consultado si podemos controlar un display con mas filas y caracteres ya que en ocasiones necesitamos mostrar mas información. Afortunadamente la librería es muy flexible y en efecto nos permite trabajar con otros tipos de display. En concreto, veremos como manipular el también popular LCD 20×4.

Las direcciones.

El código para controlar un display 20×4 es esencialmente el mismo para un display 16×2, la diferencia radica en las direcciones de las filas y las posiciones de los datos en cada una de ellas. La siguiente tabla muestra las direcciones correspondientes:

direcciones 20x4Tomando como base la información de la tabla, si deseamos colocar el caracter “C” en la tercera fila, posición 18, debemos ubicarnos en la dirección 0x25 y posteriormente enviar el caracter:

SetDDRamAddr(0x25);
putsXLCD("C");

El siguiente código de ejemplo muestra información en todas las filas del display 20×4:

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

//BITS DE CONFIGURACION.....
#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

//Funciones requeridas por la librería XLCD
void DelayFor18TCY(void);
void DelayPORXLCD(void);
void DelayXLCD(void);

int main() {
//Configurando LCD
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 fila
SetDDRamAddr(0x00);
putrsXLCD("PRIMERA FILA LCD20X4");
//Segunda fila
SetDDRamAddr(0x40);
putrsXLCD("SEGUNDA FILA LCD20X4");
//Tercera fila
SetDDRamAddr(0x14);
putrsXLCD("TERCERA FILA LCD20X4");
//Cuarta fila
SetDDRamAddr(0x54);
putrsXLCD("CUARTA FILA LCD20X4");
}
}

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

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

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

Obtendremos el siguiente resultado:

funcionamiento20x4

Como puede apreciarse siempre que se conozcan las direcciones, es muy sencillo manipular este tipo de display con xlcd.h.

Un saludo,