Pantalla de Cristal Liquido LCD 2×16

La pantalla de cristal líquido o LCD (Liquid Crystal Display) por sus siglas en inglés, es un dispositivo de gran utilidad para mostrar información al usuario en formato alfanumérico o con caracteres especiales, todos estos representados en la tabla ASCII, además de ofrecer la posibilidad de imprimir hasta 8 caracteres adicionales definidos por nosotros mismos.

Al final encontraras enlaces a diferentes ejemplos donde se muestran los distintos uso de este componente.

Físicamente el LCD está construido sobre una tarjeta impresa que contiene los controladores, los pines de conexión, la pantalla y dependiendo de la referencia, un led de retroiluminación.

Dicha pantalla está divida en 2 líneas de 16 posiciones cada una, es decir que podemos mostrar solo 16 caracteres por cada una, siendo un total de 32 por la pantalla completa.

Aunque en realidad el LCD cuenta con una pantalla virtual de 24 caracteres adicionales por línea, o sea que podemos escribir en él un mensaje de hasta 40 caracteres por cada línea pero únicamente se mostraran 16.

En la gráfica se aprecia como dos mensajes escritos en el LCD ocupan los 40 espacios de cada línea pero solo se muestran los primeros 16 de cada una.

Para mostrar los caracteres que se encuentran ocultos debemos hacer un desplazamiento de la pantalla.

Cada espacio del LCD es una matriz de 5×8 puntos, con los cuales se representa cada carácter, sea predefinido como una letra o un número, o un icono personalizado por nosotros.

El LCD tiene tres memorias la DD RAM, la CG ROM y la CG RAM.

La DD RAM (Display Data RAM), es la memoria donde se almacenan los caracteres que se están visualizando en pantalla, tanto la física como la que llamamos virtual, o sea que almacena el dato de los 40 espacios disponibles por cada línea, es decir 80 espacios, cada uno con un peso de 1 byte, siendo en total una memoria de 80 bytes.

Cada espacio en la memoria DD RAM tiene una dirección a la cual se puede acceder para escribir el dato que queremos mostrar en él.

En la línea 1 las direcciones de memoria van desde 00h hasta 27h,  en la línea 2 desde 40h hasta 67h, cada una de las 40 posiciones representadas en su valor hexadecimal.

La CG ROM (Character Generator ROM), es una memoria de solo lectura donde esta guardados lo caracteres que trae por defecto el LCD, es decir, los números, letras y símbolos especiales. Dependiendo de la referencia de nuestro LCD puede traer el código ROM 00 con caracteres japoneses o ROM 02 con alfabeto Europeo estándar.

Las siguientes tablas muestran los caracteres definidos en el LCD según el código ROM.

Código ROM 00, alfabeto japonés estándar:

Código ROM 02, alfabeto europeo estándar:

La forma de mostrar cada carácter en el LCD es a través de su código binario, si se nota, la parte superior y lateral izquierda de cada tabla está marcada con 4 MSB (Most Significant Bit / Bit Más Significativo) y 4 LSB (Less Significant Bit / Bit Menos Significativo). Al unir los MSB con LSB correspondientes al carácter donde se cruzan, podemos representarlo en pantalla.

Si queremos representar la k (minúscula), debemos enviar el dato 01101011 (0x6B).

La CG RAM (Character Generator RAM) es la memoria donde podemos almacenan los caracteres o iconos personalizados. Se conforma de 64 posiciones de 5 bits dividas en 8 bloques, cada uno de estos bloques es el espacio donde podemos almacenar nuestro carácter o icono personalizado.

Podemos ver estos 8 bloques en las tablas de las CG ROM, numerados entre paréntesis desde 0000 0000 hasta 0000 0111.

Las direcciones de cada bloque dentro de la CG RAM van desde la 00h hasta 3Fh, igualmente representadas en formato hexadecimal.

El modo en que se almacena un nuevo icono en la CG RAM, es enviando un dato binario a cada posición de cada bloque, con un 1 tenemos un punto encendido y con un cero un punto apagado.

En la gráfica se muestra los datos que hay que enviar a cada posición para el bloque 1, para los demás bloques es similar, lo que cambia son las direcciones en la CG RAM.

Para imprimir en pantalla el icono que hemos definido debemos enviar el dato con su dirección como se muestra en las tablas de la memora CG ROM.

Pines del LCD

Por lo general los LCD vienen con 16 pines en su placa (en algunas ocasiones 14, puesto que no cuentan con el led de retroiluminación).

Veamos la función de cada uno:

Alimentación:

VSS: Alimentación a tierra (GND).

VDD: Alimentación positiva, +5 Voltios.

V0: Permite graduar el contraste de la pantalla, se conecta un potenciómetro por el cual se le administra una tensión variable entre 5 y 0 Voltios.

A: Ánodo (alimentación positiva) del led de retroiluminación, hay que tener precaución de conectarlo a una tensión de 3 voltios o a través de una resistencia (regularmente de 330 ohms) a la alimentación VDD.

K: Cátodo (alimentación a tierra) del led de retroiluminación.

Control:

E (Enable): Recibe la señal para habilitar o inhabilitar la comunicación entre el LCD y el controlador.

E = 0 Comunicación con el LCD inhabilitada.

E = 1 Comunicación con el LCD habilitada.

RS (Register Select): Permite seleccionar el registro al que vamos a acceder, de datos o de control.

RS = 0 Registro de control seleccionado.

RS = 1 Registro de datos seleccionado.

R/W (Read/Write): Permite leer o escribir el LCD.

R/W = 0 Escritura en LCD.

R/W = 1 Lectura del LCD.

Bus de datos:

D0 – D7: A través del bus de datos bidireccional se envían los comandos de configuración, escritura y lectura del LCD, este puede ser establecido para trabajar a 8 o 4 bits. A 8 bits se usa la totalidad de pines desde D0 a D7, si se configura a 4 bits, solo se usaran los más significativos desde D4 a D7, siendo D7 el bit de más peso en cualquier caso.

Conexión del LCD al controlador

Se entiende por controlador al dispositivo que será el encargado de enviar la información al LCD para que funcione correctamente e imprima los datos requeridos.

Hay distintas formas de conectar el LCD, la que escojamos depende de nuestra necesidad, en la siguiente gráfica mostramos algunas.

Podemos ver que todas coinciden con la necesidad de tener un potenciómetro para ajustar el contraste, de resto los cambios varían en dos cosas, en la cantidad de bits del bus de datos (8 o 4) y la necesidad de solo escribir o leer y escribir.

Más arriba donde explicamos el rol que cumple el pin RW, mencionamos que si este se encuentra en 0, el LCD estará listo para ser escrito, es por eso que para algunas aplicaciones en las que no se requiere de la lectura de este se conecta directamente a tierra, de este modo nos ahorramos una salida de nuestro controlador.

Teniendo esto en cuenta se puede llegar a la conclusión de que para controlar un LCD requerimos como mínimo 6 pines de nuestro controlador y máximo 11.

Comandos del LCD

El LCD se maneja por comandos que se envían a través del bus de datos y que según el estado del pin RS estos se muestran en pantalla o sirven para la configuración de su funcionamiento, en la siguiente tabla los mostramos.

Descripción de los bits:

X: No importa su valor, es indiferente.

I|D: Dirección movimiento del cursor.

0 = Movimiento del cursor a la izquierda.

1 = Movimiento del cursor a la derecha.

S: Desplazamiento de pantalla.

0 = Sin desplazamiento automático.

1 = Con desplazamiento automático.

D: Encendido del display.

0 = Pantalla apagada.

1 = Pantalla encendida.

C: Encendido del cursor.

0 = Cursor apagado.

1 = Cursor visible.

B: Parpadeo del cursor.

0 = Parpadeo apagado.

1 = Parpadeo encendido.

S|C: Desplazamiento de cursor o pantalla.

0 = Desplazamiento de cursor.

1 = Desplazamiento de pantalla.

R|L: Dirección del desplazamiento.

0 = Desplazamiento a la izquierda.

1 = Desplazamiento a la derecha.

DL: Bits del bus de datos.

0 = Bus de datos a 4 bits.

1 = Bus de datos a 8 bits.

N: Número de líneas.

0 = Pantalla a una línea.

1 = Pantalla a dos líneas.

F: Tamaño del carácter.

0 = Carácter a 5×7 puntos.

1 = Carácter a 5×10 puntos.

BF: Bandera de display ocupado.

0 = Display desocupado.

1 = Display ocupado.

Tiempo de ejecución de los comandos

Cada que enviamos un comando al LCD debemos tener en cuenta que cada uno tiene un tiempo de duración mientras el LCD lo detecta, ejecuta y queda libre para atender al próximo.

Para saber en qué momento está listo el LCD para recibir el próximo comando basta con solo leer el bit de ocupado, si se encuentra en 1 indica que aún se encuentra realizando una tarea, si se encuentra en 0 significa que ahora está listo para recibir una nueva orden.

Determinar cuándo está libre u ocupado el LCD parece una tarea tediosa, el hecho que tener que verificar contantemente su estado es una buena práctica, pero hay un método con el que podemos estar seguros de enviar comandos satisfactoriamente dando el tiempo suficiente para ser procesados entre uno y otro. Esto se logra conociendo cuales son los tiempos de ejecución de cada uno.

Como vemos los tiempos de ejecución son lo bastante cortos, de hecho los que más tardan tienen un tiempo de 1,64 milisegundos, perfectamente con generar un retraso máximo de 2 milisegundos antes de enviar la próxima instrucción será suficiente para asegurarnos de no encontrarnos con un display ocupado.

Comando Tiempo de ejecución
Borrar display 1,64 milisegundos
Cursor a inicio 1,64 milisegundos
Modo de funcionamiento 40 microsegundos
Cursor on / off 40 microsegundos
Desplazamiento cursor / display 40 microsegundos
Modo de transferencia 40 microsegundos
Acceso a memoria CGRAM 40 microsegundos
Acceso a memoria DDRAM 40 microsegundos
Escritura de datos en memoria 40 microsegundos

Secuencia de inicialización del LCD

Antes de imprimir mensajes en el LCD, debemos de configurarlo con los comandos que vimos anteriormente, a continuación mostramos la secuencia típica para el uso de un bus de datos a 8 y a 4 bits.

Secuencia de iniciación 8 bits (códigos en hexadecimal para lenguaje C):

Esta configuración requiere que todos los pines desde D0 a D7 siendo D7 el más significativo, vayan conectados al controlador.

  • Elegimos el modo de trasferencia (8 bits), número de líneas del LCD que vamos a usar (2 líneas), y el tamaño del carácter (5×7). Código: 0x38 (0011 1000).
  • Llevamos el cursor al inicio. Código: 0x02 (0000 0010).
  • Encendemos el display, hacemos el cursor invisible, desactivamos el parpadeo del cursor. Código: 0x0B (0000 1100).
  • Elegimos la dirección del movimiento del cursor a la derecha sin desplazamiento de pantalla. Código: 0x06 (0000 0110).
  • Borramos la pantalla para limpiarla de cualquier carácter no deseado. Código: 0x01 (0000 0001).
  • Listos para imprimir en pantalla.

 

Secuencia de iniciación 4 bits (códigos en hexadecimal para lenguaje C):

Esta configuración requiere que los pines desde D4 a D7 siendo D7 el más significativo, vayan conectados al controlador y los restantes D0 a D3, estén al aire.

Con la configuración a 4 bits debemos dividir el código de comando que vamos a enviar en datos de igualmente 4 bits, enviando primero los más significativos seguido de los menos significativos.

Inicialmente hay que especificarle al LCD que vamos a trabajar a 4 bits.

  • Elegimos el modo de trasferencia (4 bits), número de líneas del LCD que vamos a usar (2 líneas), y el tamaño del carácter (5×7). Códigos: 0x02 (0010) – 0x08 (1000).
  • Llevamos el cursor al inicio. Códigos: 0x00 (0000) – 0x02 (0010).
  • Encendemos el display, hacemos el cursor invisible, desactivamos el parpadeo del cursor. Códigos: 0x00 (0000) – 0x0B (1100).
  • Elegimos la dirección del movimiento del cursor a la derecha sin desplazamiento de pantalla. Códigos: 0x00 (0000) – 0x06 (0110).
  • Borramos la pantalla para limpiarla de cualquier carácter no deseado. Código: 0x00 (0000) – 0x01 (0001).
  • Listos para imprimir en pantalla.

 

Hay que tener en cuenta que antes de enviar cada comando de configuración se debe poner el pin RS en 0. El pin E debe estar en 1 para que el LCD lea lo que hay en su bus de datos, se debe pasar a 0 luego de al menos 2 milisegundos con el fin de que el LCD haya tenido tiempo de leer y ejecutar el comando recibido.

Cuando trabajamos a 4 bits, el trabajo con el bit E es un poco más complejo: se debe poner en 1, enviar los bits más significativos del comando a transmitir, pasar a 0 luego de al menos 2 milisegundos, para después volver a 1 y enviar los 4 bits restantes correspondientes a los menos significativos, finalmente el pin E pasa de nuevo a 0 luego de otros 2 milisegundos. Este proceso se realiza por cada comando, sea de configuración o de escritura.

 

En los siguientes enlaces encontraras ejemplos de cómo usar el LCD: