Comprendiendo las pantallas compatibles con LCD HD44780


Por Haylem Candelario Bauzá.

Buscando en la red encontré este interesante artículo que seguro será de agrado para muchos, ya que estamos necesitados de estos conocimientos y no tenemos demasiadas fuentes de información de nuestra red.
Comparto con la comunidad este tutorial para incentivar la innovación en nuestro país.

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

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 5×7 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 5×7 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.

¿Te resultó interesante? Compártelo ...



elMor3no

Publicado por elMor3no

http://gutl.jovenclub.cu » Forma parte de GUTL desde el 6 diciembre, 2011. Usuario de GNU/Linux desde hace varios años. Coordinador Nacional de GUTL.

Este artículo tiene 2 comentarios

  1. Muy bueno este post, nunca habia pensado en usar pantallas LCD con la PC, siempre las he utilizado con micros de 8 bits como el intel 8051( o cualquiera de sus clones de otros fabricantes) o con micros PIC, esta alternativa con el PC puede servir para cualquier inventico, es importaante decir que el HD44780 es el controlador de la pantalla LCD pero comercialmente los modulos LCD que lo contienen se nombran LM016, LM017, LM018, LM020, LM032, LM041, LM044, en dependencia de la cantidad de lineas y de caracteres por lineas.
    Es importante decir tambien que los LCD que usan este controlador pueden funcionar en modo 8 bits (me refiero a las lineas DB0 a DB7) como en este post o en modo 4 bits (solo utilizando las ultimas 4 lineas de bus DB4 a DB7) lo cual permite ahorrar terminales que se pudieran utilizar en otra cosa por ejemplo un sensor de temperatura.
    Salu2

  2. Hablando de sensor para el que no sabe programar, en el repo hay un programa llamado lcdproc y LCD.

    El LCD es un servidor que espera ordenes de lcdproc y muestra por la pantalla sin hacer mas nada la temperatura del pc el uso de cpu como si fuera conky :-).

    Es compatible con casi todos los drivers.

    Necesita tener el puerto paralelo activado. Es importante resaltar que en debian el puerto paralelo lp0 normal esta desactivado debes modificar el archivo /etc/modules y alli pone lp para que cargue el modulo lp al inicio o bien

    modprobe lp en la terminal para usarlo temporalmente. Esto crea el desaparecido /dev/lp0 que en debian por defecto no aparece.

Los comentarios están cerrados.