Comprendiendo las pantallas compatibles con LCD HD44780

ArticleCategory: [Choose a category, translators: do not translate this, see list below for available categories]

Hardware

AuthorImage:[Here we need a little image from you]

[jan.svenungson]

TranslationInfo:[Author + translation history. mailto: or http://homepage]

original in en Jan Svenungson 

en to es Juan José Marí Morate 

AboutTheAuthor:[A small biography about the author]

Jan ha sido usuario de GNU/Linux desde 1996 y sólo ha tenido 2 reinicios no intencionados desde entonces. (No cuentan los reinicios por fallos de corriente).

Abstract:[Here you write a little summary]

Este artículo tratará de enseñarte una o dos cosas sobre las pantallas compatibles LCD HD44780.
Veremos cómo conectarla al puerto paralelo y cómo programarla con un pequeño programa llamado LCDInfo.
No supongas que será sólo enchufar, ejecutar un programa y obtener todo lo que necesitas en la pantalla, pero te ayudará a comprender cómo el hardware puede hacer lo que tú quieres que haga.

ArticleIllustration:[One image that will end up at the top of the article]

[HD44780]

ArticleBody:[The main part of the article]

Introducción

Primero, es necesario conseguir algo de hardware y algunos programas. Asumo que cuentas con un ordenador con un puerto paralelo estándar (el de impresora) donde sea posible ejecutar GNU/Linux con gcc y glibc.
También necesitarás una pantalla LCD que sea compatible con HD44780, cableado para conectarla a tu puerto paralelo y un potenciómetro si deseas cambiar el contraste. Seguramente, para encender la pantalla, requerirás más potencia que la que tu puerto paralelo pueda ofrecerte, y será necesario que la tomemos de algún otro lugar en tu ordenador. La mejor manera de hacer esto es usando un conexión estándar de +5v. (los mismos empleados por las unidades de disco, los discos duros, etc...).

Cuando tengas conectada la pantalla LCD necesitas saber cómo funciona. Podíamos haber dejado eso para otros artículos, pero intentaré explicar algo de los interiores de la pantalla que te ayudará a programarla.

Nuestro fin último, es mostrar algo útil en la pantalla. Como referencia utilizaré un pequeño programa llamado LCDInfo que soporta la mayoría de las capacidades de la HD44780 pero no las muestra instantáneamente. Es una versión alpha y estoy trabajando aún en ella cuando me sobra tiempo.
Si nunca has programado en C, debes saber que serían convenientes algunos conocimientos previos puesto que es necesario leer algo de C. Asumo que eres un principiante en C puesto que ese es mi nivel actual.

Cómo conectarla

[schematic] Primero, vamos a echarle un vistazo a los diferentes pines disponibles en el LCD y vamos a explicar qué es lo que hace cada uno.

El pin 1 se conoce como VSS y es para ir a GND.
El pin 2 se conoce como CDD y es la fuente de corriente que es de +5v.
El pin 3 se conoce como VLC y está conectado al potenciómetro para decidir el contraste de la pantalla.
El pin 4 es el pin RS y dependiendo de este pin la pantalla se dispone a recibir instrucciones o datos.
El pin 5 es el pin que controla R/W (lectura/escritura) cuando la pantalla LCD está enviando o recibiendo.
El pin 6 es el pin de activación. Cuando funciona de baja a alta intensidad y luego de nuevo a baja intensidad, la pantalla LCD lee los pines 4.5 y 7-14.
Los pines 7-14 son la linea del bus de datos conocida como DB0-DB7, y es por donde se envian los bits de datos al LCD y controla dónde y qué ha de ser escrito en la pantalla.
Los pines 15 y 16 sólo están presentes en las pantallas con retroiluminación y son simplemente +5V y GND con una resistencia de 3.8 Ohm entre el pin 15 y +5V

Para saber donde se debería conectar todo esto en el puerto de la impresora, puedes mirar el esquema de la derecha donde he intentado que todo esté lo más claro posible. Haz click en el diagrama esquemático para obtener una imagen mucho más grande.
Este esquema sólo se aplica si deseas cambiar el contraste de la pantalla. Simplemente conecté el pin 3 y el pin 1 a GND y a mi me funcionó bastante bien. Si tienes en tu habitación una luz un tanto extraña, quizás te convendría añadir un potenciómetro también.

Cuando emplees fuente de alimentación del PC, por favor, házlo con sumo cuidado. Si usas la corriente del cable equivocado, obtendrás +12V y eso "freirá" tu LCD. El cable que necesitas emplear es el rojo. El amarillo es +12V y el negro es GND.
Si haces esto correctamente el LCD debería tener la primera (y la tercera si existe) linea negra cuando enciendas el PC.

Cómo funciona el LCD

Un LCD no hace nada a menos que se lo ordenes específicamente. Simplemente espera a obtener una activación válida (como cuando activamos un pin alto, esperamos unos instantes y lo volvemos a desactivar). En ese momento la pantalla lee los datos o instrucciones que han de ser procesadas y vuelve a esperar hasta tener nuevos datos para enviar o recibir.
En este artículo nunca recibiremos información de la LCD hasta que el pin R/W (L/E) se encuentre siempre bajo, lo que quiere decir que está escribiendo.
El pin RS será bajo siempre, excepto cuando escribamos caracteres, puesto que todo se consideran instrucciones
Esto hace que sea muy simple programar la pantalla.

Ahora que sabemos esto, comenzaremos encendiendo la pantalla y preparándola para recibir información. Esto estará acabado cuando durante la secuencia de inicio donde le estamos diciendo a la pantalla que se encienda, activa sus funciones para ser usada.
Si obtienes la electricidad del PC, este debería estar encendido, de lo contrario es la primera cosa que se debería hacer.
El siguiente paso es el "ajuste de funciones", que depende mucho del tipo de pantalla que dispongas.
Para hacer más fácil la comprensión, explicaré exactamente que haremos cuando usemos la función "ajuste de funciones".
DB2 es la fuente de caracteres y debería ser más bajo que 5x7 puntos.
DB3 Son las líneas de la pantalla y deberían ser más altas ocupando dos líneas. ¿Qué pasa si tienes 4 líneas en la pantalla? Nada, puesto que la primera y tercera línea son las mismas en la memoria de la pantalla.
DB4 Es lo largo de los datos y esto decide si tienes 4 o 8 DB, si conectas la pantalla de acuerdo con mis esquemas, deberías obtener esta DB alta.
Entonces ajusta DB5 alto para decirle a la pantalla que esto es una instrucción de "ajuste de funciones", y asegurémonos de que RS y R/W es bajo para activar una rejilla. Para los pequeños ajustes, consulta el manual, puesto que asumo que sólo nos detenemos microsegundos cuando esperamos para que la pantalla reaccione.

Y, ¿sobre el código?

Aquí veremos las partes del programa LCDInfo que es necesario para comprender como funciona la interfaz de HD44780. Puedes descargar el programa LCDInfo al final del artículo o mirar directamente el código en iolcd.c y lcdinfo.c haciendo click aquí

Lo que necesitamos ahora son las instrucciones escritas en C y créanme cuando les digo que es fácil. Iré paso por paso por el código, e incluso si eres un principiante en C, serás capaz de entenderlo.
Primero incluiremos algunas cabeceras y definiremos funciones (mira el código fuente para más información). Ahora viene lo divertido.
#define D_REGISTER 0
#define I_REGISTER 2
#define WRITE_DATA 8
#define BASE 0x378

int main(void)
{
  ioperm(BASE,3,1);
  [CUT]
}
Esta es la primera instrucción de la función principal la cual nos da permisos para acceder al puerto paralelo. BASE debería ser 0x378 o algo así y eso significa que tendremos acceso a 0x378, 0x379 y 0x380 que es básicamente el puerto de la impresora.
El motivo por el que existen tres direcciones es porque el puerto está dividido entre datos, estado y control. Para nosotros esto significa que debemos ajustar los pines de datos primero y después los pines de control, puesto que no es posible realizar esto en un sólo comando.
Lo siguiente ha realizar es la función descrita a continuación.
void function_set(void)
{
  outb(56, BASE);
Esto ajusta los pines DB a una malla de 5x7 puntos, con base a 2 líneas, etc...
  outb(I_REGISTER + WRITE_DATA, BASE + 2);
Esto ajusta los pines RS y R/W para recibir instrucciones y escribir. He realizado varias variables globales de I_REGISTER y WRITE_DATA que equivalen a 2 y 8.
Lo próximo es activar la subida y la bajada.
  outb(ENABLE + I_REGISTER + WRITE_DATA, BASE + 2);
  usleep(0);
  outb(I_REGISTER + WRITE_DATA, BASE + 2);
}
Básicamente este código pone el activo en alto, espera y pone el activo en bajo. El comando para el usleep(0); no es realmente el ideal pero aún no he finalizado con el código para la pantalla.
Necesitaremos algunos de tus mejores deseos cuando RS y R/W esté encendido en el código cuando he dicho que debería estar bajo en las instrucciones. Esto es debido a que los pines 1, 14 y 17 son de "hardware invertido" significando que si el pin 14 está en "apagado" tan pronto como el puerto lo advierta, ¡el pin estará en alto!.
Bien, dije que sería fácil. ¿Acaso no lo es?

Cómo obtener caracteres en la pantalla

Probablemente desearás utilizar la pantalla para algo práctico como... ¿mostrar texto?. Sin problemas.
El código es idéntico para imprimir un caracter y ajustar las funciones. Lo único que necesitamos es cambiar alguna variable. No queremos estropear los ajustes de RS. La función print_character() se debe parecer a esto:
void print_character(int character)
{
  outb(D_REGISTER + WRITE_DATA, BASE + 2);
  outb(character, BASE);
  outb(ENABLE + D_REGISTER + WRITE_DATA, BASE + 2);
  usleep(0);
  outb(D_REGISTER + WRITE_DATA, BASE + 2);
}
Como puedes observar, he cambiado "I_REGISTER" a "D_REGISTER" y "56" a "character" pero ¿Qué es lo que significa?. Si miras tus manuales de códigos de caracteres lo entenderás.
Lo único que necesitamos es alimentar la función con caracteres, (desde que empleamos C no necesitamos hacerlo puesto que lo hacemos con un integrador), y entonces el caracter aparecerá en la pantalla. ¡¡¡Oh!!!

Con este código, tienes el esqueleto de un programa LCD, listo para modificar ajustándolo a tus necesidades, mostrando la memoria libre, las conexiones HTTP activas o lo que desees. Algunos ejemplos estan en LCDInfo Que es un programa que muestra algunas cosas disponibles en el /proc filesystem en un ordenador con GNU/Linux.

Referencias