Diferencia entre revisiones de «HD44780U»

De Proyectos
Ir a la navegación Ir a la búsqueda
Sin resumen de edición
 
(No se muestran 143 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
= Introducción =
<br>
[[File: HD44780.jpg|600px|Conexiones LCD]]<br>
Conexiones LCD<br>
<br>
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
<br>
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:<br>
<br>
[[File:HD44780 LCD.jpg|300px|Representación de módulos del HD44780U]]<br>
Representación de módulos del HD44780U<br>
<br>
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.<br>
En la sección de [[HD44780U#Pines de instrucciones|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.<br>
Igualmente explicaré las operaciones en que R/W vale 1, pero ya se verá que no se suelen usar.<br>
<br>
Los pines de datos (DB0...DB7) se usan de una forma muy sencilla. Hagamos un ejemplo:<br>
Queremos hacer un Display Clear (limpiar la pantalla) y en la tabla [[HD44780U#Instrucciones|Instrucciones]] vemos que es:<br>
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.<br>
Así es como se envian/reciben instrucciones tanto de IR como de DR.<br>
<br>
= Pines =
= Pines =
== Pines de instrucciónes ==
== Pines de instrucciones ==
Estos pines son los que sirven para ejecutar instrucciones. Como se ve en la tabla de inferior, dependiendo del valor de estos pines se selecionaran unas instrucciones a ejecutar u otras
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.<br>
 
<br>
Áqui se ven las posibles operaciones cuando se combinan los pines RS y R/W<br>
  RS RW Operación
  RS RW Operación
  0  0  Modo de instrucciones (display clear, ...)
  0  0  Modo de instrucciones IR (display clear, ...)
  0  1  Se lee el Busy Flag (DB 7 ) y el Address Counter(DB0 to DB6)
  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  0  DR escribe en DDRAM o CGRAM
  1  1  DR lee de DDRAM o CGRAM
  1  1  DR lee de DDRAM o CGRAM
=== Pin RS ===


=== Pin RS ===
El pin RS selecciona los registros (IR y DR):
El pin RS selecciona los registros (IR y DR). Cuando RS = 0 se ejecutan las instrucciones de IR, cuando RS = 1 se ejecutan las instrucciones de DR
*Cuando RS = 0 se ejecutan las instrucciones de [[HD44780U#Instruction Register(IR)|IR]]
*Cuando RS = 1 se ejecutan las instrucciones de [[HD44780U#Data Register (DR)|DR]]


=== Pin R/W ===
=== Pin R/W ===
Este pin indica si la instrucción a ejecutar será de escritura, R/W = 0, o de lectura, R/W = 1
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 ===
=== Pin Enable ===
Es el encargado de iniciar las instrucciones de lectura/escritura. Para cada instrucción que queramos hacer tenemos que seguir este procedimiento:<br/>
Es el pin encargado de enviar las instrucciones del microcontrolador al lcd.<br>
Con los pines RS/RW seleccionamos que tipo de instrucción enviaremos --> 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)
Para cada instrucción que queramos hacer tenemos que seguir este procedimiento:<br/>
<br>
Con los pines RS/RW dispuestos para el tipo de instrucción que queremos enviar <math>\rightarrow</math> Colocamos la instrucción (o datos) a transmitir en los pines de datos <math>\rightarrow</math> Ponemos en HIGH el pin Enable <math>\rightarrow</math> Ponemos en LOW el pin Enable (en el flanco de bajada es cuando los datos se transmiten)


  digitalWrite(E, LOW);
  digitalWrite(E, LOW);
Línea 27: Línea 69:


== Pines de datos ==
== Pines de datos ==
Los pines de datos son los que van del DB7 al DB 0 (teniendo en cuenta que estamos utilizando una conexión de 8bit).<br/>
Los pines de datos son los que van del DB7 al DB0 (teniendo en cuenta que estamos utilizando una conexión de 8bit).<br/>
En estos pines es donde 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.
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.<br>
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.<br>
<br>


= Registros =
= 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) ==
== Instruction Register(IR) ==
Guarda las instrucciones (display clear, cursor shift, ...)<br/>
*Guarda las instrucciones (display clear, cursor shift, ...)
Guarda la información de la dirección de la DDRAM y de la CGRAM<br/>
*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, ...)
Solo puede ser escrito desde la MPU
 
== Data Register (DR) ==
== Data Register (DR) ==
Guarda temporalmente los datos que se leen/escriben en la DDRAM o la CGRAM<br/>
*Guarda temporalmente los datos que se leen/escriben en la DDRAM o la CGRAM
Los datos escritos en la DR desde la MPU son automáticamente escritos en la DDRAM o la CGRAM<br/>
*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
Cuando la inforamción de 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<br/>
*The DR is also used for data storage when reading data from DDRAM or CGRAM
La transferencia de datos entre la MPU se completa cuando la MPU lee la DR<br/>
*A través del pin RS se seleccionan estos dos registros
Después de la lectura, los datos de la DDRAM o CGRAM de la siguiente dirección se envian a la DR para la siguiente lectura desde la MPU<br/>
<br>
A través del pin RS se seleccionan estos dos registros


= Busy Flag (BF) =
= Busy Flag (BF) =
Si BF vale 1, HD44780U está en modo internal operation y la siguiente instruccion no se aceptará<br/>
*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.
Cuando RS = 0 y RW = 1, el BF sale por DB7. La siguiente instrucción tiene que ser escrita después de asegurarse de que BF es 0
*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 ([[HD44780U#Pines de instrucciones|Pines de instrucciones]]).
<br>


= Address Counter (AC) =
= Adress Counter (AC) =
Asigna las direciones a DDRAM y CGRAM<br/>
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.<br>
Cuando la dirección de una instrucción se escribe en la IR, la información de la dirección se envia desde la IR a la AC<br/>
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.<br>
La selección de cualquiera de los dos DDRAM o CGRAM también se determina al mismo tiempo por la instruccion --> La instrucción enviada a la IR a parte de ser instrucción también selecciona la DDRAM o CGRAM<br/>
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.<br>
Después de escribir en (leer de) la DDRAM o CGRAM, el AC se incrementa automaticamente a 1 (decrementa 1) --> La AC pasa a valer la siguiente (o anterior) dirección después de ejecutar una operación de escritura (o lectura)<br/>
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)<br>
Cuando RS = 0 y R/W = 1 el contenido de AC se envia por los pines DB0...DB6
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<br>
<br>


= DDRAM y CGRAM =
= RAM =
**Guarda los datos a mostrar codificados en 8 bits
<br>
**Su capacidad es de 80 x 8 bits, o 80 caracteres  
[[File:HD44780-RAM.jpg|300px]]<br>
**DDRAM que no se usa para mostrar datos se puede usar como RAM del sistema
<br>
**La dirección DDRAM se guarda en AC en hexadecimal
Hay 3 memorias RAM:
*DDRAM - Se guardan los caracteres a mostrar
*CGRAM - Guarda caracteres especiales que puedes crear
*CGROM - Guarda los caracteres típicos de la tabla ascii(A, B, C, ....). No se pueden modificar
<br>
La imagen que hay arriba muestra como si las tres memorias tuvieran una relación de dependencia. Lo he dibujado así porque las memorias CGRAM y CGROM contienen los caracteres que se mostraran por el LCD y en la DDRAM se guardan los caracteres que esta mostrando el LCD.<br>
Explicado de otra manera, cuando quiero mostrar un caracter por el LCD tengo que elegir si quiero el caracter de la memoria CGRAM o CGROM. Una vez hecho esto, paso ese caracter a la DDRAM y de ahí se mostrará por pantalla.<br>
<br>
== 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.
<br>
*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
<br>
[[File:DDRAM.jpg | 799px]]<br>
<br>
Pongamos un ejemplo de como funciona:<br>
*En la casilla física del LCD <span style="color:red;font-size:16px;">2</span> (que corresponde a la dirección de memoria <span style="font-size:16px">0x01</span>)queremos mostrar la letra A
*Ejecutamos la instrucción de [[HD44780U#Instruction Register(IR) |IR]] [[HD44780U#Set DDRAM Address |Set DDRAM]]
*Después de ejecutar esta instrucción el cursor está en la casilla numero <span style="color:red;font-size:16px;">2</span> 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 [[HD44780U#Write to DDRAM | Write to DDRAM]], en este caso la letra <span style="color:orange;font-size:16px">A</span>. Como la instrucción Write DDRAM forma parte del modo [[HD44780U#Data Register (DR) |DR]] los datos a enviar serán
<pre>
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1  0  1  0  0  0  0  0  0  1
</pre>
*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 <span style="color:red;font-size:16px">3</span>


(Páginas 10, 11 y 12 de momento me la salto porque no acabo de ver la utilidad de la información)
== CGRAM ==
*Character Generator RAM (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.
**El usuario puede escribir patrones de caracteres
*Esta memoria dispone de espacio para poder escribir 8 caracteres de 5x8 puntos o 4 caracteres de 5x10 puntos.
**Puede escribir 8 caracteres de 5x8 puntos
*Las areas que no se usan como display se pueden usar como RAM general.
**Puede escribir 4 caracteres de 5x10 puntos
=== Distribución memoria CGRAM ===
**Donde se guardan estos caracteres son en las direcciones que van desde 0000 0000(Uper 4 Bits Lower 4 Bits) hasta 0000 1111(Uper 4 bits Lower 4 Bits) (En la tabla 4 del datasheet se puede entender mejor)<--Creo que esto es así*
<br>
**Las areas que no se usan como display se pueden usar como RAM general
[[File: CGRAM.jpg|800px]]<br>
<br>
*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 y cada fila en 5 pixeles.
**Estos 5 pixeles se modifican con una sola instrucción (en el siguiente apartado se ve que significa esto)
*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" está en la fila 1 de la casilla 1 por lo tanto su dirección es:
<pre>
casilla  fila
0 0 0  0 0 0
</pre>
*El pixel "amarillo" está en la segunda "casilla" y cuarta fila:
<pre>
casilla  fila
0 0 1  0 1 1
</pre>


/*(Tabla 5 de las paginas 19 y 20 no las entiendo)
=== Creación caracter ===
Voy a explicar un ejemplo paso a paso para crear un caracter personalizado (la flecha):
*Primera Fila
**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á:
<pre>
Set CGRAM Ad.    Casilla      Fila
RS R/W DB7 DB6  DB5 DB4 DB3  DB2 DB1 DB0
0  0  0  1    0  0  0    0  0  0
</pre>
**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
<pre>
Write to CG or...        Pixeles
RS R/W DB7 DB6 DB5  DB4 DB3 DB2 DB1 DB0
0  0  0  0  0    0  0  1  0  0
</pre>
*Ahora hagamos la segunda fila
**Primero pasamos la instrucción Set CGRAM Address seleccionando la casilla 1 y la fila 2
<pre>
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0  0  0  1  0  0  0  0  0  1
</pre>
**Segundo pasamos la instrucción Write to CG or DDRAM "encendiendo" los pixeles 2, 3 y 4 contando por la izquiqerda
<pre>
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0  0  0  0  0  0  1  1  1  0
</pre>
*La tercera fila seria:
<pre>
Set CGRAM Ad.    Casilla      Fila
RS R/W DB7 DB6  DB5 DB4 DB3  DB2 DB1 DB0
0  0  0  1    0  0  0    1  0  0


= CGROM =
Write to CG or...        Pixeles
*Character Generator ROM (CGROM)
RS R/W DB7 DB6 DB5  DB4 DB3 DB2 DB1 DB0
**Tiene almacenados patrones de caracteres de 5x8 puntos o 5x10 puntos
0  0  0  0  0    1  0  1  0  1
**Guarda 108 patrones de caracteres de 5x8 puntos y 32 patrones de 5x10 puntos
</pre>
<br>
[[File: HD44780U-Fila01.jpg|150px|Priemra fila]]
[[File: HD44780U-Fila02.jpg|150px|Segunda fila]]
[[File: HD44780U-Fila03.jpg|150px|Tercera fila]]
<br>
 
== 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.
<br>


= Instrucciones =
= Instrucciones =
**Solo el IR y el DR pueden ser controlados por el MPU
*Solo el IR y el DR pueden ser controlados por el MPU
**Antes de empezar la operación interna del HD4478U, la información de control es temporalmente guardada en estos registros para permitir la conexión entre varios MPUS, que operen a diferentes velocidades, o diferentes dispositivos de control de periféricos
*Antes de empezar la operación interna del HD4478U, la información de control es temporalmente guardada en estos registros para permitir la conexión entre varios MPUS, que operen a diferentes velocidades, o diferentes dispositivos de control de periféricos
**La operación interna del HD44780U se determina por señales enviadas desde la MPU
*La operación interna del HD44780U se determina por señales enviadas desde la MPU
**Estas señales, las cuales incluyen la señal RS, R/W y el bus de datos (DB= a DB7), consituyen las instrucciones del HD44780U
*Estas señales, las cuales incluyen la señal RS, R/W y el bus de datos (DB= a DB7), consituyen las instrucciones del HD44780U
(La información de los 4 puntos anteriores es trivial para poder entender el funcionamiento del lcd)
 
 
<pre>
Only the instruction register (IR) and the data register (DR) of the HD44780U can be controlled by the
MPU. Before starting the internal operation of the HD44780U, control information is temporarily stored
into these registers to allow interfacing with various MPUs, which operate at different speeds, or various
peripheral control devices. The internal operation of the HD44780U is determined by signals sent from the
MPU. These signals, which include register selection signal (RS), read/
write signal (R/W), and the data bus (DB0 to DB7), make up the HD44780U instructions (Table 6). There
are four categories of instructions that:
• Designate HD44780U functions, such as display format, data length, etc.
• Set internal RAM addresses
• Perform data transfer with internal RAM
• Perform miscellaneous functions
 
Only the instruction register (IR) and the data register (DR) of the HD44780U can be controlled by the
MPU. Before starting the internal operation of the HD44780U, control information is temporarily stored
into these registers to allow interfacing with various MPUs, which operate at different speeds, or various
peripheral control devices. The internal operation of the HD44780U is determined by signals sent from the
MPU. These signals, which include register selection signal (RS), read/
write signal (R/W), and the data bus (DB0 to DB7), make up the HD44780U instructions (Table 6). There
are four categories of instructions that:
• Designate HD44780U functions, such as display format, data length, etc.
• Set internal RAM addresses
• Perform data transfer with internal RAM
• Perform miscellaneous functions
</pre>
 
 
<b>TABLAS DE LAS INSTRUCCIONES IR</b><br/>
[[File:tabla_6.jpg | 600px]]<br/>
[[File:tabla_6.jpg | 600px]]<br/>
[[File:tabla_6_2.jpg | 600px]]
<br>
<b>TABLAS DE LAS INSTRUCCIONES DR</b><br/>
[[File:tabla_6_2.jpg | 600px]]<br>
== Instrucciones referentes a IR ==
== Instrucciones referentes a IR ==
Son todas las instrucciones en el que el pin RS = 0 y R/W = 0 [[HD44780U#Pines de instrucciones | Tabla Pines]]
=== Clear Display ===
=== Clear Display ===
*Clear Display
*Escribe 0x20 (espacio) en todas las direcciones de la DDRAM
**Escribe 0x20 (espacio) en todas las direcciones de la DDRAM
*Pone la dirección 0 de la DDRAM en AC
**Pone la dirección 0 de la DDRAM en AC
*El display vuelve a su estado original si estuviera desplazado
**El display vuelve a su estado original si estuviera desplazado
*Pone I/D en 1 y S no cambia
**Pone I/D en 1 y S no cambia
 
=== Return Home ===
=== Return Home ===
**Pone en AC la direccion 0 de DDRAM
*Pone en AC la direccion 0 de DDRAM
**El display vuelve a su estado original si estuviera desplazado
*El display vuelve a su estado original si estuviera desplazado
**El contenido de DDRAM no cambia
*El contenido de DDRAM no cambia
 
=== Entry Mode Set ===
=== Entry Mode Set ===
**I/D: Incremento (I/D = 1) o decremento (I/D = 0) la direción de la DDRAM cuando el codigo de un caracter es escrito en (o leido de) DDRAM
*I/D: Incremento (I/D = 1) o decremento (I/D = 0) la direción de la DDRAM cuando el codigo de un caracter es escrito en (o leido de) DDRAM
**Lo mismo pasa cuando se lee o escribe en CGRAM
*Lo mismo pasa cuando se lee o escribe en CGRAM
**S: Si S = 1 el display se desplaza a la derecha (cuando I/D = 1) y a la izquierda (cuando I/D = 0). El display no hace nada si S = 0
*S: Si S = 1 el display se desplaza a la derecha (cuando I/D = 1) y a la izquierda (cuando I/D = 0). El display no hace nada si S = 0
**El display no se desplaza cuando leemos de DDRAM
*El display no se desplaza cuando leemos de DDRAM
**Leer de (o escribir en) CGRAM no desplaza el display
*Leer de (o escribir en) CGRAM no desplaza el display
 
=== Display On/Off Control ===
=== Display On/Off Control ===
**D: D = 1 display on y D = 0 display off. Cuando esta en off los datos permanecen en DDRAM
*D: D = 1 display on y D = 0 display off. Cuando esta en off los datos permanecen en DDRAM
**C: C = 1 el cursor se muestra y C = 0 el cursor no se muestra
*C: C = 1 el cursor se muestra y C = 0 el cursor no se muestra
**B: B = 1 el caracter que marca el cursor parpadea
*B: B = 1 el caracter que marca el cursor parpadea
 
=== Cursor or Display Shift ===
=== Cursor or Display Shift ===
**El cursor o el display se desplazan a la derecha o izquierda sin que se lean o escriban datos según la imagen a continuación
*El cursor o el display se desplazan a la derecha o izquierda sin que se lean o escriban datos según la imagen a continuación
**En un display de dos lineas el cursor se mueve a la segunda cuando este pasa el digito 40 de la primera linea
*En un display de dos lineas el cursor se mueve a la segunda cuando este pasa el digito 40 de la primera linea
**En el display shift el contenido de AC no cambia
*En el display shift el contenido de AC no cambia
[[File: tabla_7.jpg | 600px]]
[[File: tabla_7.jpg | 600px]]
=== Function Set ===
=== Function Set ===
**DL: DL = 1 los datos se envian y reciben en 8bits y DL = 0 se envian y reciben en 4bits
*DL: DL = 1 los datos se envian y reciben en 8bits y DL = 0 se envian y reciben en 4bits
**N: Numero de lineas del display. N = 1, 2 lienas y N = 0, 1 linea
*N: Numero de lineas del display. N = 1, 2 lienas y N = 0, 1 linea
**F: Tamaño de los caracteres. F = 1 5x10 puntos y F = 0 5x8 puntos
*F: Tamaño de los caracteres. F = 1 5x10 puntos y F = 0 5x8 puntos
**Esta función se tiene que llamar en la cabecera del programa antes de ejecutar cualquier otra instrucciones (exceptuando leer Busy Flag y dirección de instrucción). A partir de este punto, esta función no se puede ejecutar a no ser que se cambie la longitud de datos de la interfaz
*Esta función se tiene que llamar en la cabecera del programa antes de ejecutar cualquier otra instrucciones (exceptuando leer Busy Flag y dirección de instrucción). A partir de este punto, esta función no se puede ejecutar a no ser que se cambie la longitud de datos de la interfaz
 
=== Set CGRAM Address ===
=== Set CGRAM Address ===
**Pone la direccón de CGRAM en AC
*Pone la direccón de CGRAM en AC
**Los datos son luego escritos en (o leidos de) la MPU por la CGRAM
*Los datos son luego escritos en (o leidos de) la MPU por la CGRAM
 
=== Set DDRAM Address ===
=== Set DDRAM Address ===
**Pone la dirección de DDRAM en AC
*Pone la dirección de DDRAM en AC
**Los datos son luego escritos en (o leidos de) la MPU por la DDRAM
*Los datos son luego escritos en (o leidos de) la MPU por la DDRAM
**Cuando N = 0 (1 linea) la dirección puede ir desde 0x00 a 0x4F. Cuando N = 1, la dirección puede ir desde 0x00 a 0x27 para la primera liena y 0x40 a 0x67 para la segunda linea
*Cuando N = 0 (1 linea) la dirección puede ir desde 0x00 a 0x4F. Cuando N = 1, la dirección puede ir desde 0x00 a 0x27 para la primera liena y 0x40 a 0x67 para la segunda linea
 
=== Read Busy Flag and Address (instruccion de lectura) ===
=== Read Busy Flag and Address (instruccion de lectura) ===
**Lee la BF (que indica si el sistema esta realizando en ese momento una operacion interna)
*Lee la BF (que indica si el sistema esta realizando en ese momento una operacion interna)
**Si BF = 1 la operación interna se esta realizando
*Si BF = 1 la operación interna se esta realizando
**No se acepta ningun instrucción nueva hasta que BF = 0
*No se acepta ningun instrucción nueva hasta que BF = 0
**A parte de la señal BF, al leer también se obtiene la dirección del AC. Esta dirección es el valor de la anterior instrucción
*A parte de la señal BF, al leer también se obtiene la dirección del AC. Esta dirección es el valor de la anterior instrucción
 
== Instrucciones referentes a DR ==
== Instrucciones referentes a DR ==
Son todas las instrucciones en que el pin RS = 1 y R/W = 0 [[HD44780U#Pines de instrucciones | Tabla Pines]]
=== Write Data to CGRAM or DDRAM ===
=== Write Data to CGRAM or DDRAM ===
**Escribe 8 bits de datos en la CG o DDRAM
*Escribe 8 bits de datos en la CG o DDRAM
**Después de escribir la dirección aumenta (o decrece) automaticamente en 1
*Después de escribir la dirección aumenta (o decrece) automaticamente en 1
 
=== Read Data from CGRAM or DDRAM (instrucción de lectura) ===
=== Read Data from CGRAM or DDRAM (instrucción de lectura) ===
**Lee 8 bits de datos de CG o DDRAM
*Lee 8 bits de datos de CG o DDRAM
**La designación anterior determina si se ha de leer CG o DDRAM
*Antes de esta instrucción, tienen que ejecutarse Set DDRAM Address o Set CGRAM Address para saber de que RAM se va a leer. Sino se ejecutan la primera lectura de datos es invalida
**Antes de esta instrucción, tienen que ejecutarse Set DDRAM Address o Set CGRAM Address. Sino se ejecutan la primera lectura de datos es invalida
*Cuando se ejecutan instrucciones de lectura en serie, la siguiente dirección normalmente la lee la segunda instrucción de lectura
**Cuando se ejecutan instrucciones de lectura en serie, la siguiente dirección normalmente la lee la segunda instrucción de lectura
*Las instrucciones de Set Address no son necesarias ejecutarlas antes de esta instrucción de lectura cuando la operación Cursor or Display Shift desplaza el cursor (cuando se esta leyendo de DDRAM)
**Las instrucciones de Set Address no son necesarias ejecutarlas antes de esta instrucción de lectura cuando la operación Cursor or Display Shift desplaza el cursor (cuando se esta leyendo de DDRAM)
*La operación Cursor or Display Shift es la misma que Set DDRAM Address
**La operación Cursor or Display Shift es la misma que Set DDRAM Address
*Después de leer, el '''entry mode''' incrementa o decrementa la dirección en 1 automáticamente. Sin embargo, el shift display no se ejecuta sin importar el modo entrada.
**Después de leer, el '''entry mode''' incrementa o decrementa la dirección en 1 automáticamente. Sin embargo, el shift display no se ejecuta sin importar el modo entrada.
*El AC se incrementa o decrementa en 1 automáticamente después de esta instrucción.
**El AC se incrementa o decrementa en 1 automáticamente después de las instrucciones de escritura de CGRAM o DDRAM
<br>
**Los datos de la RAM selecionados por AC no se pueden leer en este momento, incluso si las instrucciones de lectura se ejecutan
**Por lo tanto, para leer correctamente los datos, o bien ejecutar el conjunto de instrucciones de dirección o instrucción de desplazamiento del cursor (sólo con DDRAM), justo antes de la lectura de los datos deseados, se ha de ejecutar la instrucción de lectura desde la segunda vez que se envía la instrucción de lectura


= Conexion 8bits/4bits =
<br>
<br>
= Inicialización =
<br>
<br>
= Código Ejemplo =
<br>
<br>
= Comunicación I2C =
<br>
<br>
== Hardware necesario ==
<br>
<br>
== Código ==
<br>
<br>
= Documentación =
= Documentación =
* [http://www.geocities.com/dinceraydin/djlcdsim/djlcdsim.html 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.
* [http://www.geocities.com/dinceraydin/djlcdsim/djlcdsim.html 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
*[http://arduino.cc/forum/index.php?PHPSESSID=1b8544f0d730f30daffb68111aa2289c&topic=37258.30 Reading from HD44780-based LCDs].- Discusión de como se leen los datos
*[http://arduino.cc/forum/index.php?PHPSESSID=1b8544f0d730f30daffb68111aa2289c&topic=37258.30 Reading from HD44780-based LCDs].- Discusión de como se leen los datos
*[http://fab.cba.mit.edu/classes/MIT/863.06/11.13/44780.pdf Datasheet].- Datasheet del HD4478
*[http://fab.cba.mit.edu/classes/MIT/863.06/11.13/44780.pdf Datasheet].- Datasheet del HD4478
*[http://arduino.cc/en/Reference/LiquidCrystal LiquidCrystal Library].- Libreria del lcd que traem implementada Arduino. A mi me ha servido de mucho mirar el código fuente para aprender el funcionamiento del lcd
*[http://arduino.cc/en/Reference/LiquidCrystal 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
*[http://www.cursomicros.com/avr/display-lcd/pines-del-display-lcd.html cursomicros.com].-Página muy interesante que explica el funcionamiento del lcd
*[http://www.powertipusa.com/pdf/pc1602f.pdf PC1602F].-Datasheet LCD PC1602F

Revisión actual - 12:17 21 nov 2014

Introducción


Conexiones LCD
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
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):

  • Cuando RS = 0 se ejecutan las instrucciones de IR
  • Cuando RS = 1 se ejecutan las instrucciones de 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




Hay 3 memorias RAM:

  • DDRAM - Se guardan los caracteres a mostrar
  • CGRAM - Guarda caracteres especiales que puedes crear
  • CGROM - Guarda los caracteres típicos de la tabla ascii(A, B, C, ....). No se pueden modificar


La imagen que hay arriba muestra como si las tres memorias tuvieran una relación de dependencia. Lo he dibujado así porque las memorias CGRAM y CGROM contienen los caracteres que se mostraran por el LCD y en la DDRAM se guardan los caracteres que esta mostrando el LCD.
Explicado de otra manera, cuando quiero mostrar un caracter por el LCD tengo que elegir si quiero el caracter de la memoria CGRAM o CGROM. Una vez hecho esto, paso ese caracter a la DDRAM y de ahí se mostrará por pantalla.

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 y cada fila en 5 pixeles.
    • Estos 5 pixeles se modifican con una sola instrucción (en el siguiente apartado se ve que significa esto)
  • 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" está 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):

  • Primera Fila
    • 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á:
 Set CGRAM Ad.    Casilla       Fila
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
 Write to CG or...        Pixeles
RS R/W DB7 DB6 DB5  DB4 DB3 DB2 DB1 DB0
 0  0   0   0   0    0   0   1   0   0
  • 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
  • La tercera fila seria:
 Set CGRAM Ad.    Casilla       Fila
RS R/W DB7 DB6  DB5 DB4 DB3  DB2 DB1 DB0
 0  0   0   1    0   0   0    1   0   0

 Write to CG or...        Pixeles
RS R/W DB7 DB6 DB5  DB4 DB3 DB2 DB1 DB0
 0  0   0   0   0    1   0   1   0   1


Priemra fila Segunda fila Tercera fila

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

  • Solo el IR y el DR pueden ser controlados por el MPU
  • Antes de empezar la operación interna del HD4478U, la información de control es temporalmente guardada en estos registros para permitir la conexión entre varios MPUS, que operen a diferentes velocidades, o diferentes dispositivos de control de periféricos
  • La operación interna del HD44780U se determina por señales enviadas desde la MPU
  • Estas señales, las cuales incluyen la señal RS, R/W y el bus de datos (DB= a DB7), consituyen las instrucciones del HD44780U

(La información de los 4 puntos anteriores es trivial para poder entender el funcionamiento del lcd)


Only the instruction register (IR) and the data register (DR) of the HD44780U can be controlled by the
MPU. Before starting the internal operation of the HD44780U, control information is temporarily stored
into these registers to allow interfacing with various MPUs, which operate at different speeds, or various
peripheral control devices. The internal operation of the HD44780U is determined by signals sent from the
MPU. These signals, which include register selection signal (RS), read/
write signal (R/W), and the data bus (DB0 to DB7), make up the HD44780U instructions (Table 6). There
are four categories of instructions that:
• Designate HD44780U functions, such as display format, data length, etc.
• Set internal RAM addresses
• Perform data transfer with internal RAM
• Perform miscellaneous functions

Only the instruction register (IR) and the data register (DR) of the HD44780U can be controlled by the
MPU. Before starting the internal operation of the HD44780U, control information is temporarily stored
into these registers to allow interfacing with various MPUs, which operate at different speeds, or various
peripheral control devices. The internal operation of the HD44780U is determined by signals sent from the
MPU. These signals, which include register selection signal (RS), read/
write signal (R/W), and the data bus (DB0 to DB7), make up the HD44780U instructions (Table 6). There
are four categories of instructions that:
• Designate HD44780U functions, such as display format, data length, etc.
• Set internal RAM addresses
• Perform data transfer with internal RAM
• Perform miscellaneous functions


TABLAS DE LAS INSTRUCCIONES IR


TABLAS DE LAS INSTRUCCIONES DR

Instrucciones referentes a IR

Son todas las instrucciones en el que el pin RS = 0 y R/W = 0 Tabla Pines

Clear Display

  • Escribe 0x20 (espacio) en todas las direcciones de la DDRAM
  • Pone la dirección 0 de la DDRAM en AC
  • El display vuelve a su estado original si estuviera desplazado
  • Pone I/D en 1 y S no cambia

Return Home

  • Pone en AC la direccion 0 de DDRAM
  • El display vuelve a su estado original si estuviera desplazado
  • El contenido de DDRAM no cambia

Entry Mode Set

  • I/D: Incremento (I/D = 1) o decremento (I/D = 0) la direción de la DDRAM cuando el codigo de un caracter es escrito en (o leido de) DDRAM
  • Lo mismo pasa cuando se lee o escribe en CGRAM
  • S: Si S = 1 el display se desplaza a la derecha (cuando I/D = 1) y a la izquierda (cuando I/D = 0). El display no hace nada si S = 0
  • El display no se desplaza cuando leemos de DDRAM
  • Leer de (o escribir en) CGRAM no desplaza el display

Display On/Off Control

  • D: D = 1 display on y D = 0 display off. Cuando esta en off los datos permanecen en DDRAM
  • C: C = 1 el cursor se muestra y C = 0 el cursor no se muestra
  • B: B = 1 el caracter que marca el cursor parpadea

Cursor or Display Shift

  • El cursor o el display se desplazan a la derecha o izquierda sin que se lean o escriban datos según la imagen a continuación
  • En un display de dos lineas el cursor se mueve a la segunda cuando este pasa el digito 40 de la primera linea
  • En el display shift el contenido de AC no cambia

Function Set

  • DL: DL = 1 los datos se envian y reciben en 8bits y DL = 0 se envian y reciben en 4bits
  • N: Numero de lineas del display. N = 1, 2 lienas y N = 0, 1 linea
  • F: Tamaño de los caracteres. F = 1 5x10 puntos y F = 0 5x8 puntos
  • Esta función se tiene que llamar en la cabecera del programa antes de ejecutar cualquier otra instrucciones (exceptuando leer Busy Flag y dirección de instrucción). A partir de este punto, esta función no se puede ejecutar a no ser que se cambie la longitud de datos de la interfaz

Set CGRAM Address

  • Pone la direccón de CGRAM en AC
  • Los datos son luego escritos en (o leidos de) la MPU por la CGRAM

Set DDRAM Address

  • Pone la dirección de DDRAM en AC
  • Los datos son luego escritos en (o leidos de) la MPU por la DDRAM
  • Cuando N = 0 (1 linea) la dirección puede ir desde 0x00 a 0x4F. Cuando N = 1, la dirección puede ir desde 0x00 a 0x27 para la primera liena y 0x40 a 0x67 para la segunda linea

Read Busy Flag and Address (instruccion de lectura)

  • Lee la BF (que indica si el sistema esta realizando en ese momento una operacion interna)
  • Si BF = 1 la operación interna se esta realizando
  • No se acepta ningun instrucción nueva hasta que BF = 0
  • A parte de la señal BF, al leer también se obtiene la dirección del AC. Esta dirección es el valor de la anterior instrucción

Instrucciones referentes a DR

Son todas las instrucciones en que el pin RS = 1 y R/W = 0 Tabla Pines

Write Data to CGRAM or DDRAM

  • Escribe 8 bits de datos en la CG o DDRAM
  • Después de escribir la dirección aumenta (o decrece) automaticamente en 1

Read Data from CGRAM or DDRAM (instrucción de lectura)

  • Lee 8 bits de datos de CG o DDRAM
  • Antes de esta instrucción, tienen que ejecutarse Set DDRAM Address o Set CGRAM Address para saber de que RAM se va a leer. Sino se ejecutan la primera lectura de datos es invalida
  • Cuando se ejecutan instrucciones de lectura en serie, la siguiente dirección normalmente la lee la segunda instrucción de lectura
  • Las instrucciones de Set Address no son necesarias ejecutarlas antes de esta instrucción de lectura cuando la operación Cursor or Display Shift desplaza el cursor (cuando se esta leyendo de DDRAM)
  • La operación Cursor or Display Shift es la misma que Set DDRAM Address
  • Después de leer, el entry mode incrementa o decrementa la dirección en 1 automáticamente. Sin embargo, el shift display no se ejecuta sin importar el modo entrada.
  • El AC se incrementa o decrementa en 1 automáticamente después de esta instrucción.


Conexion 8bits/4bits



Inicialización



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