por Jan Svenungson <jan.svenungson(at)linux.nu>
Sobre el autor:
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).
Traducido al español por:
Juan José Marí Morate <juanjosemari(en)telefonica.net>
Contenidos:
|
Comprendiendo las pantallas compatibles con LCD HD44780
Resumen:
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.
_________________ _________________ _________________
|
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
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
Formulario de "talkback" para este artículo
Cada artículo tiene su propia página de "talkback". A través de esa página puedes enviar un comentario o consultar los comentarios de otros lectores
<--, regresar al índice de este número
2004-02-04, generated by lfparser version 2.41