LCDs alfanuméricos compatibles HD44780
Jordi Bartolomé 1-2-2004
Introducción
Conexiones
Caracteres y comandos
Caracteres
Comandos
Inicialización
Introducción
Existen gran variedad de LCDs en el mercado, pero quizás los más utilizados en los pequeños proyectos de electrónica son los LCDs alfanuméricos compatibles con el controlador HD44780 de Hitachi. Existen otros tipos de LCDs con mejores prestaciones gráficas, pero este controlador ofrece una interfaz muy sencilla y versátil para controlar LCDs alfanuméricos, lo que lo hace ideal para proyectos con microcontrolador en los que no se desea complicar el hardware ni el software.
Los LCDs compatibles con el controlador HD44780 se presentan en el mercado con diferentes configuraciones que se diferencian por el numero de filas y de columnas. Existen modelos con 8,16,20,24,32 o 40 columnas y 1,2 o 4 filas. La mayoría de los modelos disponen de caracteres de 5x7 pixels, mientras que algunos tienen caracteres de 5x10 pixels. La programación de los distintos modelos es prácticamente idéntica, con alguna pequeña diferencia en el proceso de inicialización, configuración y organización de los caracteres en memoria.
Conexiones
Normalmente la conexión se realiza mediante un conector de 14 o 16 pins. El conector de 16 pins se usa solo en los modelos que disponen de retroiluminación. De estos pins, 8 son para las líneas de datos, 3 para las líneas de control, y el resto son para la alimentación, el control del contraste y el control de la retroiluminación si la tiene. Estos pins no siempre aparecen ordenados en la placa del LCD, por eso, antes de conectar nada es bueno consultar el datasheet para evitar equivocarse y soldar donde no toca. Normalmente estos pins son:
| Pin |
Nombre |
Función |
| 1 |
GND |
Masa |
| 2 |
VCC |
Alimentación |
| 3 |
VEE |
Control del contraste |
| 4 |
RS |
Selección de registro de comandos o de datos. |
| 5 |
R/!W |
Escritura o lecutra |
| 6 |
E |
Enable. |
| 7 |
D0 |
Bit 0 de datos |
| 8 |
D1 |
Bit 1 de datos |
| 9 |
D2 |
Bit 2 de datos |
| 10 |
D3 |
Bit 3 de datos |
| 11 |
D4 |
Bit 4 de datos |
| 12 |
D5 |
Bit 5 de datos |
| 13 |
D6 |
Bit 6 de datos |
| 14 |
D7 |
Bit 7 de datos |
| 15 |
VCC |
Alimentación de la retroiluminación |
| 16 |
VBL |
Control de la retroiluminación |
Estos LCDs pueden operar en modo de 8bits o en modo de 4bits. Este documento únicamente describe el modo de 8 bits, pero con cuatro ideas básicas se puede extender al de 4 bits: la diferencia entre los dos modos es que en el modo de 4bits la transferencia del dato se realiza en dos ciclos de 4 bits mientras que en el modo de 8 bits se realiza en un único ciclo de 8 bits. Si se usa el modo de 4 bits la transferencia de datos tiene lugar por las líneas de datos de D4..7, el resto de líneas, es decir D0..3 se puede conectar a masa mediante una resistencia (p.ej de 10k). Como se puede ver, el primer modo consume menos puertos de E/S pero es mas lento y un poco mas complejo de programar, en cambio el segundo modo consume mas puertos de E/S pero es mas rápido y sencillo de programar. Como todas las operaciones son de escritura, en este documento también se supone que en todo momento la línea R/W esta a 0, es decir directa ente conectada a masa. 
Esquema de las conexiones en modo 8 bits

Esquema de las conexiones en modo 4 bits
Caracteres y comandos
El funcionamiento general del LCD, en el modo de 8 bits, consiste en ejecutar simultaneamente las siguientes acciones:
- mantener el dato en las lineas de datos.
- indicar mediante la linea RS si el dato es un carácter o un comando . Cuando RS está a 0 los datos se interpretan como un comando mientras que cuando esta a 1 se interpretan como un carácter.
- una vez el dato esta listo y se ha indicado si es un carácter o comando se da un pulso a la señal E para que el LCD capture los datos. En función de si se trata de un comando o un carácter, se ejecutará una operación, o se escribirá un carácter en pantalla. La duración del pulso es una variable importante ya que en LCDs antiguos, con controladores lentos, puede ser que un pulso demasiado rápido no de tiempo al LCD a procesar los datos. |
|
|
Timing orientativo de las señales involucradas en el envío de un dato. La primera figura muestra el envío de un comando (R/S=0) mientras que la segunda muestra el envío de un carácter (R/S=1) Por tanto a través de la línea de datos del LCD se pueden transmitir dos tipos de datos: los correspondientes a caracteres y los correspondientes a comandos. |
|
Caracteres
Tal como se comenta en el apartado anterior, el LCD captura el dato en la subida de la señal E y sabe que se trata de un carácter porque la señal R/S esta a 1. Cuando el LCD recibe un carácter, lo único que hace es capturarlo, y guardarlo en la memoria de texto en la posición apuntada por el cursor. Además si el cursor se encuentra una zona visible del LCD este carácter aparecerá por pantalla en la correspondiente posición.
Estos LCDs disponen de una tabla de 256 caracteres distintos la mayoría de los cuales corresponden al alfabeto occidental y al los símbolos fonéticos Katakana japoneses. La distribución de los caracteres es la siguiente:

Tal como se puede ver en la tabla, los 16 primeros códigos corresponden a los caracteres definidos por el usuario (en la CGRAM): debería haber 16 caracteres asociados a estos códigos pero en realidad solo hay 8, lo que es debido a que acceder a los códigos situados entre 08h y 0Fh equivale a acceder a los códigos situados de 00h y 07h. Los códigos que van del 33 al 127 corresponden a los caracteres occidentales, mientras que los que van desde el código 161 hasta el 254 corresponden a caracteres nipones. Los 15 últimos códigos, del 240 al 255, son símbolos comunes entre los que se encuentran el símbolo de la división o las típicas letras griegas. Los códigos que en la tabla aparecen vacíos no tienen caracteres asociados y al mostrar uno de estos simplemente se mostrara un caracteres en blanco.
Comandos
Tal como se comenta en el apartado anterior, el LCD captura el dato en la subida de la señal E y sabe que se trata de un comando porque la señal R/S está a 0. Cuando recibe un comando el LCD ejecuta una acción u otra en función del comando de que se trate. Existen diferentes comandos:
|
| Display & Cursor home: D7..0: 0000 001X |
X: puede tomar cualquier valor |
Lleva el cursor al inicio, es decir que sitúa el cursor en la dirección 0x00. Esta instrucción es útil para situar el cursor en una posición válida conocida, si se produce algún error de escritura o posicionamiento en el LCD. |
| Clear Display: D7..0: 0000 0001 |
Hace lo mismo que el comando anterior pero además borra todo el contenido del LCD |
| Character Entry Mode: D7..0: 0000 01AB |
A:1 Incremento 0 Decremento. |
B:1 Desplazamiento del cursor activo 0 Desplazamiento del cursor inactivo. |
Este comando permite configurar el desplazamiento del cursor tras la inserción de un carácter. Es decir que permite configurar si tras capturar un carácter, el cursor del LCD se ha de desplazar hacia atrás o hacia delante. También permite escoger si se desea que este autodesplazamiento este o no activado. Por tanto, como se puede deducir, este comando lo único que hace es configurar el incremento o decremento automático de la dirección de escritura tras una escritura en la memoria de texto. |
El uso de este desplazamiento automático puede simplificar bastante la introducción de caracteres en el display, ya que con este activado, para mostrar un mensaje simplemente hay que ir enviando los caracteres que se quieren mostrar sin preocuparse de la posición del cursor, ya que el mismo cursor se sitúa en la siguiente posición. En cambio si se tiene el desplazamiento del cursor inactivo, antes de enviar cada carácter habrá que especificar la posición del cursor, es decir la dirección de la memoria de texto donde se va a escribir, ya que sino se estarán sobreescribiendo los caracteres anteriormente escritos. |
| Display On/Off & Cursor: D7..0: 0000 1ABC |
A:1 Display activado 0 Display desactivado |
B:1 Underline del cursor activado 0 Underline del cursor desactivado |
C:1 Parpadeo del cursor activado 0 Parapadeo del cursor desactivado. |
Comando que permite activar el LCD y también inicializar algunos parámetros referentes al cursor. Permite seleccionar si se desea que el cursor este visible en forma de “_”, y si se desea que este parapadee o no parpadee. |
| Display Content/Cursor Shift: D7..0: 0001 ABXX |
A:1 Movimiento del contenido 0 Movimiento del cursor: |
|
B:1 Desplazamiento del contenido hacia la derecha 0 Desplazamiento del contenido hacia la izquierda. |
X: puede tomar cualquier valor |
Este comando sirve para seleccionar si se desea que al insertar un nuevo carácter se desplace todo el contenido del LCD o si solo se desea que se desplace el cursor. También permite seleccionar la dirección de desplazamiento del contenido, es decir si se quiere que al introducir un carácter en una posición el resto del texto se desplace a la derecha o a la izquierda. |
Esto permite emular por ejemplo, la entrada de caracteres en las calculadoras, en las que normalmente el cursor aparece en el extremo derecho de la pantalla y al ir añadiendo los diferentes dígitos estos aparecen en el extremo derecho a la vez que los caracteres anteriormente entrados se van desplazando hacia la izquierda a medida que se introducen nuevos dígitos. |
| Function Set: D7..0: 001A BCXX |
A:1 Interfaz en modo 8 bits 0 Interfaz en modo 4 bits |
B:1 LCD de 2 líneas 0 LCD de 1 línea |
C:1 Caracteres de 5x10 pixels 0 Caracteres de 5x7 pixels |
Esta instrucción permite inicializar correctamente el LCD, especificando el modo de trabajo que se va a usar (8 bits o 4 bits), el numero de líneas lógicas del LCD (1 o 2), y el tipo de caracteres que se utilizan en este (5x10 o 5x7 pixels). |
| Set CGRAM Address: D7..0: 01DD DDDD |
D: bits de la dirección CGRAM |
Este comando permite seleccionar la dirección de la CGRAM sobre la que se quiere escribir. La CGRAM es la Caracter Generator RAM la cual permite almacenar hasta 8 caracteres definidos por el usuario. Cada 8 posiciones de la CGRAM contienen un carácter de forma que, cada posición de 8 bits contiene la tira de pixels de cada una de las filas del carácter. De cada tira de bits solo se utilizan los 5 bits mas bajos, debido a que el ancho del carácter es de 5 pixels. De estas 8 filas, la primera fila, es decir la situada en la dirección más baja de las 8, corresponde a la parte superior del carácter, mientras que la última, es decir la situada en la posición más alta de las 8, corresponde a la parte inferior del carácter. Además de estas 8 filas solo se muestran las 7 primeras debido a que la fila 8, la correspondiente a la parte inferior, suele estar ocupada por el cursor. |
Así para definir un carácter, solo hay que enviar un comando de establecimiento de dirección CGRAM con una dirección múltiple de 8 y a continuación enviar las 8 tiras de bits que forman el carácter, teniendo en cuenta las especificaciones anteriores. El envío de los datos correspondientes a la tira de bits se realiza como si se trataran de caracteres. |
| Set Display Address: D7..0: 1DDD DDDD |
D: bits de la dirección del cursor |
Este comando permite situar el cursor donde se escribirá el siguiente carácter, es decir en la posición del LCD deseada. Cada posición del LCD tiene asociada una dirección concreta en la memoria de texto, de forma que para mostrar un carácter en esa posición concreta hay que escribir sobre su dirección de memoria asociada. |
A primera vista, como disponemos de 7 bits de dirección, podemos pensar que podemos direccionar y escribir en 128 posiciones de la memoria de texto, pero en realidad no todas estas direcciones tienen asociadas una posición en el LCD. De estas 128 direcciones solo están disponibles 80 . Estas 80 direcciones se organizan en 40 direcciones por línea cuando el display dispone de 2 líneas, o en 80 direcciones por línea cuando el LCD dispone de 1 línea. Únicamente los displays de 40 columnas y 2 líneas, y los de 20 columnas y 4 líneas son capaces de mostrar las 80 direcciones. El resto de modelos solo muestran las primeras posiciones de cada línea, o sea, las que caben en el LCD. De hecho se puede visualizar el contenido de la memoria de texto que queda fuera del área visible del LCD haciendo uso de los comandos de desplazamiento. |
Por lo general en los LCDs que solo hacen uso de una línea esta comienza en la dirección 00h de la memoria de texto. En cambio, en los LCDs que hacen uso de dos líneas la primera línea también comienza en la dirección 00h, mientras que la segunda línea comienza en la dirección 40h. Los LCDs de 4 lineas en realidad solo hacen uso de 2 líneas, lo que sucede es que estas se disponen físicamente entrelazadas tal como muestran las figuras del documento. |
Además la correspondencia posición del carácter vs. dirección de memoria depende del modelo de LCD. Incluso en LCDs con el mismo numero de columnas y filas esta correspondencia puede ser diferente dependiendo del fabricante, de hecho existen infinidad de disposiciones diferentes. Los siguientes esquemas muestran las correspondencias posición carácter vs. dirección de memoria, mas frecuentes: |

Modelo 16 columnas x 1 fila |

Modelo 20 columnas x 1 fila |

Modelo 16 columnas x 2 filas |

Modelo 20 columnas x 2 filas |

Modelo 16 columnas x 4 filas |

Modelo 20 columnas x 4 filas |
|
Inicialización
Para que el LCD funcione correctamente hay que inicializarlo adecuadamente. Para inicializar adecuadamente el LCD hay que configurar el modo de trabajo, el número de líneas y el tamaño de carácter mediante el comando Function Set . También hay que ejecutar el comando Display On/Off & Cursor con el fin de activar el LCD y el cursor. |
|