HD44780U
Introducción
![]()
Conexiones LCD
Los LCDs que integran este controlador suelen tener 16 pines:
- Vcc y GND
- Vo: Regula el contraste de la pantalla
- Led+ (A) y Led- (K): Retroiluminación
- RS y R/W: Controlan el tipo de operación que se va a enviar
- E: Es el "clock". En el flanco de bajada se envian los datos
- DB0...DB7: Son los pines donde se colocan los datos para enviar al LCD
Ahora veremos como es el funcionamiento general del controlador cuando queremos enviar un dato o instrucción. En las siguientes secciones profundizaré en cada apartado:
![]()
Representación de módulos del HD44780U
En el dibujo se puede ver como los pines RS y R/W controlan si ejecutamos instrucciones de IR o operamos en las memorias DDRAM, CGROM y CGRAM.
En la sección de Pines de instrucciones veremos que tenemos cuatro operaciones a poder ejecutar codificadas con los pines RS y R/W. En nuestro caso (y en la mayoria de los casos) solo se usan dos operaciones:
- Modo de instrucciones IR - RS es 0 y R/W es 0
- DR escribe en DDRAM o CGRAM - RS es 1 y R/W es 0
Por lo que podemos ver el pin R/W siempre está a cero (esto quiere decir que escribimos) y como las operaciones que implican poner el pin R/W a 1 no las utilizaremos podemos suponer que R/W siempre valdrá 0.
Igualmente explicaré las operaciones en que R/W vale 1, pero ya se verá que no se suelen usar.
Los pines de datos (DB0...DB7) se usan de una forma muy sencilla. Hagamos un ejemplo:
Queremos hacer un Display Clear (limpiar la pantalla) y en la tabla Instrucciones vemos que es:
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 0 0 0 0 0 1
Como se ve RS es igual a 0 y R/W es igual a 0, estamos dentro de las instrucciones de IR (ya explicaré que es esto de IR y que instrucciones tiene). Dentro de IR la instrucción 00000001 significa Display Clear. Para pasar esa instrucción a la pantalla colocamos cada bit en su correspondiente pin y la enviamos.
Así es como se envian/reciben instrucciones tanto de IR como de DR.
Pines
Pines de instrucciones
Los pines RS y R/W nos sirven para seleccionar diferentes operaciones. El pin Enable es similar a un "clock". Con el flanco de bajada se envia la instrucción a la pantalla.
Áqui se ven las posibles operaciones cuando se combinan los pines RS y R/W
RS RW Operación 0 0 Modo de instrucciones IR (display clear, ...) 0 1 Se lee el Busy Flag (DB 7 ) y el Address Counter(DB0 to DB6) 1 0 DR escribe en DDRAM o CGRAM 1 1 DR lee de DDRAM o CGRAM
Pin RS
El pin RS selecciona los registros (IR y DR):
Pin R/W
Este pin indica si la instrucción a ejecutar será de escritura o de lectura:
- Cuando R/W = 0 estamos en modo escritura
- Cuando R/W = 1 estamos en modo lectura
Pin Enable
Es el pin encargado de enviar las instrucciones del microcontrolador al lcd.
Para cada instrucción que queramos hacer tenemos que seguir este procedimiento:
Con los pines RS/RW dispuestos para el tipo de instrucción que queremos enviar Colocamos la instrucción (o datos) a transmitir en los pines de datos Ponemos en HIGH el pin Enable Ponemos en LOW el pin Enable (en el flanco de bajada es cuando los datos se transmiten)
digitalWrite(E, LOW); delayMicroseconds(1); digitalWrite(E, HIGH); delayMicroseconds(1); digitalWrite(E, LOW); delayMicroseconds(100);
Pines de datos
Los pines de datos son los que van del DB7 al DB0 (teniendo en cuenta que estamos utilizando una conexión de 8bit).
En estos pines colocamos los datos a transmitir. Por ejemplo, si queremos transmitir la instrucción Display Clear (que es 0000001), en cada pin pondremos el valor correspondiente a la instrucción.
Si la transmision es de 4bits los unicos pines activos son los que van de DB4 a DB7. Se verá más adelante que en este modo de transmisión se tienen que hacer dos envios de datos por operación, uno con los 4 primeros bits y el segundo con los siguientes 4 bits. En el ejemplode Display Clear se enviarian 0000 la primera vez y luego 0001 la segunda vez.
Registros
Los registros son direcciones de memoria (de 8 bits) donde hay guardados datos. Pueden ser instrucciones (tipo display clear) o pueden almacenar datos.
Instruction Register(IR)
- Guarda las instrucciones (display clear, cursor shift, ...)
- Guarda la información de la dirección de la DDRAM y de la CGRAM - No se si esto se refiere a que se guarda la dirección de los datos que se envian a la DDRAM y CGRAM o si guarda la dirección de los simbolos que hay en la DDRAM y CGRAM (por simbolo me refiero a las letras, acentos, ...)
Data Register (DR)
- Guarda temporalmente los datos que se leen/escriben en la DDRAM o la CGRAM
- Cuando la dirección se escribe en la IR, los datos se leen y se guardan en la DR desde la DDRAM o la CGRAM a través de una operacion interna
- The DR is also used for data storage when reading data from DDRAM or CGRAM
- A través del pin RS se seleccionan estos dos registros
Busy Flag (BF)
- El BF indica si el HD44780U está ocupado ejecutando una instrucción. Si lo está no se puede enviar una instrucción nueva hasta que finalize la instrucción en curso.
- Si BF = 1, HD44780U está en modo internal operation y la siguiente instruccion no se aceptará.
- Si BF = 0 el HD44780U está disponible para recibir una nueva instrucción.
- Cuando RS = 0 y RW = 1, el BF se le por el pin DB7 (Pines de instrucciones).
Adress Counter (AC)
Es un registro que sirve para acceder a las memorias CG o DDRAM del LCD. Por ejemplo, si el Puntero de RAM vale 0x00, accedemos a la primera posición de DDRAM o a la de CGRAM.
Solo hay un puntero de RAM que trabaja con las dos RAMs del LCD, y para saber a cuál de ellas accede actualmente debemos ver la instrucción enviada más recientemente.
Las instrucciones Clear Display, Return Home y Set DDRAM Address designan el Puntero de RAM a la DDRAM, mientras que Set CGRAM Address lo designa a la CGRAM.
En el caso de la DDRAM, la dirección que hay en AC viene a representar la posición del cursor (visible o no) del LCD en la pantalla. La AC pasa a valer la siguiente (o anterior) dirección después de ejecutar una instrucción de escritura (o lectura)
Cuando RS = 0 y R/W = 1 el contenido de AC se envia por los pines DB0...DB6 (como se puede ver en la tabla de Pines de instrucciones
RAM
En estas 3 memorias RAMs se guardaran los caracteres a mostrar.
(Imagen representando las 3 memorias y para que sirven)
DDRAM
La DDRAM es la memoria donde se guardan los caracteres a mostrar.
- Cada vez que se quiera mostrar un carácter por el lcd:
- Lo primero que se tiene que hacer es seleccionar, con la instrucción Set DDRAM Address, una dirección de memoria de la DDRAM
- Luego con la instrucción Write data to CG or DDRAM se escribirá el carácter a mostrar en esa dirección de memoria de la DDRAM.
- Guarda los datos a mostrar codificados en 8 bits
- Su capacidad es de 80 x 8 bits, o 80 caracteres
- DDRAM que no se usa para mostrar datos se puede usar como RAM del sistema
- La dirección DDRAM se guarda en Address Counter en hexadecimal
![]()
Pongamos un ejemplo de como funciona:
- En la casilla física del LCD 2 (que corresponde a la dirección de memoria 0x01)queremos mostrar la letra A
- Ejecutamos la instrucción de IR Set DDRAM
- Después de ejecutar esta instrucción el cursor está en la casilla numero 2 del LCD
- En AC está guardada la dirección de memoria de DDRAM, en este caso 0x01
- Ahora ya podemos enviar la letra que queremos escribir con la instrucción Write to DDRAM, en este caso la letra A. Como la instrucción Write DDRAM forma parte del modo DR los datos a enviar serán
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 1 0 1 0 0 0 0 0 0 1
- Después de ejecutar la instrucción Write, AC pasa a incrementarse (o decrementar) automáticamenteen 1. En este ejemplo incrementa en 1, por tanto AC pasa a valer 0x02, es decir que apunta a la casilla número 3
CGRAM
- La CGRAM es la memoria donde se almacenan caracteres personalizados. Es decir, tienes espacio libre para poder crear caracteres con las formas que se quieran para luego poder escribirlos en el lcd.
- Esta memoria dispone de espacio para poder escribir 8 caracteres de 5x8 puntos o 4 caracteres de 5x10 puntos.
- Las areas que no se usan como display se pueden usar como RAM general.
Distribución memoria CGRAM
- En el dibujo se ven 8 "casillas" (se ven 8 porque he decidido representar "casillas" de 5x8 puntos)
- Cada "casilla" se divide en 8 filas.
- Cada fila se divide en 5 pixeles
- Se tiene que seleccionar la fila para luego modificar los 5 pixeles que contiene
- La dirección de cada fila consta de 6 bits
- Los 3 primeros bits seleccionan la "casilla"
- Los tres siguientes seleccionan la fila dentro de la "casilla"
- El pixel "verde" esta en la fila 1 de la casilla 1 por lo tanto su dirección es:
casilla fila 0 0 0 0 0 0
- El pixel "amarillo" está en la segunda "casilla" y cuarta fila:
casilla fila 0 0 1 0 1 1
Creación caracter
Voy a explicar un ejemplo paso a paso para crear un caracter personalizado (la flecha):
- Utilizamos la instrucción Set CGRAM Address para seleccionar la fila donde queremos escribir los pixeles
- La instrucción Set CGRAM Address:
- Los 4 primeros bits definen la operación
- Los siguientes tres bits codifican la casilla, en nuestro caso queremos colocar el caracter en la primera casilla, es decir en la 000
- Los últimos 3 bits codifican la fila. Empezaremos por la primera fila hasta la 8a fila. La primera fila es la 000
- Ahora ya tenemos la dirección de CGRAM que queremos modificar. La instrucción Set CGRAM Address quedará:
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 1 0 0 0 0 0 0
- Con la instrucción Write data to CG or DDRAM modificaremos los pixeles que necesitemos
- Los bits que van de RS a DB5 siempre son 0, los que van de DB4 a DB0 representan cada pixel de la fila
- Queremos "encender" el pixel 3 contando desde la izquierda, asi que tendremos 00100
- La instrucción Write to CGRAM quedara
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 0 0 0 1 0 0
- Con estas dos instrucciones tendremos la "casilla" asi:
- Ahora hagamos la segunda fila
- Primero pasamos la instrucción Set CGRAM Address seleccionando la casilla 1 y la fila 2
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 1 0 0 0 0 0 1
- Segundo pasamos la instrucción Write to CG or DDRAM "encendiendo" los pixeles 2, 3 y 4 contando por la izquiqerda
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 0 0 1 1 1 0
- Ahora la "casilla" esta asi:
CGROM
- Esta memoria no se puede modificar.
- Es la que contiene los patrones de los caracteres que vienen de fábrica.
- Estos caracteres son de 5x8 puntos o 5x10 puntos y suelen representar la mayoria de los simbolos de la tabla ascii.
- Suele guardar 108 patrones de caracteres de 5x8 puntos y 32 patrones de 5x10 puntos.
Instrucciones
Instrucciones referentes a IR
Instrucciones referentes a DR
Código Ejemplo
Comunicación I2C
Hardware necesario
Código
Documentación
- Simulador LCD.- Es una página muy interesante porque te permite simular el funcionamiento del LCD sin tener que implementarlo. Va muy bien para ver como funciona el lcd
- Reading from HD44780-based LCDs.- Discusión de como se leen los datos
- Datasheet.- Datasheet del HD4478
- LiquidCrystal Library.- Libreria del lcd que trae implementada Arduino. A mi me ha servido de mucho mirar el código fuente para aprender el funcionamiento del lcd
- cursomicros.com.-Página muy interesante que explica el funcionamiento del lcd
- PC1602F.-Datasheet LCD PC1602F