Control de una pantalla de cristal líquido, LCD.

A continuación se describe el funcionamiento de una pantalla LCD de 1 línea x 16 caracteres, disponible en el laboratorio. Es común a todos los LCDs cuyo controlador sea el chip HD44780 de Hitachi.

Internamente tiene una memoria RAM de 80 posiciones de 8 bits. En cada posición se encuentra un carácter, que se corresponde con una posición en la pantalla. La posición de memoria 0 se corresponde con la fila 1 columna 1, la posición 1 con la fila 1 columna 2, etc. De forma automática, está continuamente leyendo esa memoria, obteniendo el código ASCII allí almacenado y representándolo en la pantalla, de forma similar al funcionamiento de una controladora de video en el PC.

Para presentar un texto se escribe sobre la memoria interna. Si el LCD se encuentra correctamente inicializado y el cursor está en la primera posición (fila 1 columna 1), el primer carácter que se escriba se presentará en la esquina superior izquierda. El siguiente que se envíe en la siguiente columna y así sucesivamente, sin necesidad de indicar las posiciones de memoria donde queremos escribir el carácter, el incremento lo hace de forma automática, siempre que así se haya programado.

Además se pueden enviar comandos para controlar la presentación. Para todo esto tiene dos buses, uno de datos (D0-D7) y otro de control (E, R/W y RS), que se comportan de la siguiente manera:

Bus de control:

Bus de datos:

El protocolo de estas señales para la escritura de datos se presenta en la siguiente figura:

Figura 1

La conexión entre la pantalla LCD y el puerto paralelo del PC es la siguiente:

Señales de Control en el LCD Número de pin en el conector del puerto paralelo

RS (control de modo) Pin 17 (bit 3 del puerto de Control)

R/W (lectura/escritura) Pin 14 (bit 1 del puerto de Control)

E (habilitación) Pin 1 (bit 0 del puerto de Control)

Bus de datos del LCD

De D0 a D7 Pines del 2 al 9. Puerto de Datos

Alimentación:

+5V Pin 16 (bit 2 del puerto de control). Este bit deberá estar siempre a nivel alto.

GND Pin 18

 

En la práctica se deberán elaborar una serie de rutinas que permitan manejar la pantalla: control del cursor, borrado, escritura de caracteres, efectos especiales ( intermitencia, rotación izquierda y derecha, etc).

Se recomienda consultar las referencias ofrecidas para un LCD de 40x2, basado en el mismo controlador que el disponible en el laboratorio, en la dirección http://www.doc.ic.ac.uk/~ih/doc/lcd/intro.html.

Para más detalle, consultar las hojas de características del fabricante [1]. En los artículos [2] y [3] se proponen métodos de conexión a un sistema microprocesado, tanto conectado a un puerto dedicado como conectado mapeado en memoria [2].

A modo aclaratorio se incluye en código C un programa que inicializa la pantalla LCD y presenta un texto. Estudiar lo que hace, cómo y porqué puede ayudar a comprender el funcionamiento del LCD.

/*************************************************************************/

/* UNIVERSIDAD AUTÓNOMA DE MADRID */

/* E. T. S. de Ingeniería Informática */

/* Laboratorio de E. T. C. II */

/* GdRivera, Noviembre 1998 */

/* */

/* Control de una pantalla de cristal líquido (LCD) a través del puerto */

/* paralelo de un PC. El LCD tiene un controlador del tipo HD 44780 */

/* */

/* El LCD tiene su bus de datos conectado al puerto de datos del puerto */

/* paralelo. Las señales de control del LCD se generan a través de pines */

/* del puerto de control del pto. paralelo. */

/* La conexión entre el puerto paralelo y los pines del LCD es: */

/* */

/* Función: Pin pto. paral. Pines LCD */

/* Bus de datos 2-9 7-14 */

/* Sel. de reg (RS) 17 4 */

/* Lect/Escr (R/W) 14 5 */

/* Selección (E) 1 6 */

/* Vcc 16 2 */

/* GND 18 1 */

/*************************************************************************/

#include <conio.h>

#include <dos.h>

#define P_Datos 0x3BC /* Dir. puerto de datos del puerto paralelo */

#define P_Control 0x3BE /* Dir. puerto de control puerto paralelo */

void Enviar_Control (int Dato) /* Envía una orden de control, generando */

{ /* las señales de protocolo necesarias */

outportb (P_Control,0x0e); /* RS y R/W = 0, E=1 */

outportb (P_Datos,Dato);

outportb (P_Control,0x0f); /* " " " y E=0 */

outportb (P_Control,0x0e); /* E=1 */

outportb (P_Control,0x06); /* RS=1 */

delay (3); /* Ajuste en la temporización */

}

void Enviar_Dato (int Dato)

{

delay (1);

outportb (P_Control,0x06); /* RS=1, R/W = 0, E=1 */

outportb (P_Datos,Dato);

outportb (P_Control,0x07); /* RS=1, R/W = 0, E=0 */

outportb (P_Control,0x06); /* E=1 */

}

int main()

{

int i;

char *cadena="Lab de E.T.C. II";

char *cadena1="Bienvenido UAM ";

char *cadena2="Si se lee esto ";

char *cadena3="has aprobado ETC";

/* Secuencias de configuración del LCD (consultar la referencia */

/* de Batron "Power Supply Reset" e "Instructions". */

Enviar_Control (0x38); /* Function set: 8 bits, 2 líneas */

Enviar_Control (0x0c); /* Display ON, cursor OFF */

Enviar_Control (0x06); /* Entry mode set: cursor con incremento */

Enviar_Control (0x01); /* Borra el display y pone a 0 el puntero*/

Enviar_Control (0x80); /* Selecciona la RAM de datos */

for (i=0x0;i<0x16;i++) /* Este bucle llena el display con */

Enviar_Dato (cadena[i]); /* los 16 caracteres de la línea */

delay (1000);

Enviar_Control (0x01);

for (i=0x0;i<0x16;i++)

Enviar_Dato (cadena1[i]);

delay (1000);

Enviar_Control (0x01);

for (i=0x0;i<0x16;i++)

Enviar_Dato (cadena2[i]);

delay (1000);

Enviar_Control (0x01);

for (i=0x0;i<0x16;i++)

Enviar_Dato (cadena3[i]);

return 0;

}

Bibliografía (consultar con el profesor de prácticas)

[1] Dot Matrix LCD Controller & Driver, BATRON. Hojas de características.

[2] Ejemplo 10.1. Prácticas con microcontroladores de 8 bits, Javier Martínez Pérez y Mariano Barrón Ruiz. Editorial McGraww-Hill. 1993.

[3] Proyectos con displays LCD. Revista de electrónica Elektor, Octubre 1990.