Está en la página 1de 49

Capítulo 3

Control de un display LCD de modo texto


El objetivo que se persigue es que el alumno adquiera unos conocimientos generales
sobre el funcionamiento de un display LCD que le permitan utilizar un dispositivo de
estas características de una forma sencilla y, si lo desea, mejorar o perfeccionar el
ejemplo que se pone a su disposición.

El funcionamiento del display LCD a que hace referencia este documento va gobernado
por el controlador HD44780U de Hitachi. Hoy día existen varios dispositivos en el
mercado compatibles con este controlador por lo que la descripción que aquí se facilita
valdrá para un gran número de dispositivos. En cualquier caso se recomienda consultar
en cada caso la documentación facilitada por el fabricante.

3.1 Descripción general

Cuando se adquiere un display LCD lo primero que se puede observar es su apariencia


externa. Éste se compone de una placa de circuito impreso rectangular, de un tamaño
similar al del “display”, sobre la que van soldados el LCD, el controlador y el resto de
componentes, formando todo un conjunto compacto.

1
 Figura 1 - Aspecto general de un “display”.

Bien en la parte superior o en la inferior debe encontrarse el conjunto de puntos (14 en


el dispositivo que aquí se describe) que permiten su conexión. Numerados de izquierda
a derecha tienen la siguiente funcionalidad:

PIN Símbolo Descripción


1 Vss Masa
2 Vdd Alimentación
3 Vo Voltaje de ajuste del contraste
4 RS Selección de registro
5 R/W Lectura / escritura
6 E Validación de datos (Enable)
7 D0 Bit de datos menos significativo
8 D1 Bit de datos
9 D2 Bit de datos
10 D3 Bit de datos
11 D4 Bit de datos
12 D5 Bit de datos
13 D6 Bit de datos
14 D7 Bit de datos más significativo
Tabla 1 – Función de los puntos de conexión.

Los tres primeros puntos de conexión (pins) son para la alimentación y control del
contraste. Los tres siguientes (RS, R/W y E) son para el control y los restantes (D0 a
D7) son para el intercambio de datos.

El gobierno de la pantalla LCD lo lleva a cabo el controlador HD44780U de Hitachi (o


similar). La utilización correcta del dispositivo depende del conocimiento que se tenga
sobre su funcionamiento, señales de control, instrucciones, etc. Asimismo, la forma de
conexión al microcontrolador dependerá de los diferentes modos de funcionamiento del
“display” por lo que resulta imprescindible describir su funcionamiento.

3.2 Funcionamiento del display

A modo de introducción general, el “display” es un dispositivo que dispone de un puerto


de Entrada/Salida por el que recibe instrucciones y datos y por el que devuelve
información sobre su estado interno. Para ello dispone de algunos registros que se
seleccionan mediante las líneas de control. Cada operación necesita de unos tiempos de
ejecución que se describirán posteriormente. Todo este proceso de comunicación se

2
controla con las tres líneas de control (RS, R/W y E) conforme al cronograma del
dispositivo.

3.2.1 Alimentación y control de contraste


La alimentación de 5 V. la recibe a través de los dos primeros puntos de conexión, al
primero (Vss) se conecta la masa y al segundo (Vdd) los 5 voltios, con un consumo de
corriente que no excede de 5mA. El tercero (Vo) permitirá el control del contraste
variando la tensión en el mismo entre 0 (contraste mínimo) y 5 voltios (contraste
máximo). A la hora de conectarlo, podremos optar entre dos soluciones:

1. Fijar el contraste a su valor máximo.

Ésta es la solución más sencilla, para lo cual se conectará este punto a


5 V.

2. Regular el contraste.

Para esta solución se conectará un potenciómetro en configuración de


divisor de tensión variable, conforme se detalla en la figura y con el
que se suministra la tensión deseada entre 0 y 5 V.


Figura 2 – Conexión de un potenciómetro de contraste.

Cabe recordar que cada fabricante puede optar por diferentes soluciones de polarización
para la regulación del contraste y por tanto será necesario consultar la documentación
del dispositivo.

3.2.2 La pantalla y los caracteres


El “display” está formado por un LCD (Liquid Crystal Display, pantalla de cristal
líquido) de dos líneas con 16 posiciones cada una. Cada posición está formada por una
matriz que puede ser de 5 x 8 ó de 5 x 10 puntos, para representar los diferentes
caracteres o símbolos. La pantalla está gobernada por el controlador HD44780U que

3
dispone de dos plantillas de caracteres predefinidas en la CGROM (Character
Generator ROM). La primera plantilla está formada por 160 caracteres de 5 x 8 puntos
más 32 de 5 x 10 y la segunda por 240 caracteres de 5 x 8 puntos. Ambas se pueden
consultar en el Anexo I.

En la tabla 2 se muestran los caracteres más importantes de la referida plantilla. Los


códigos de cada carácter vienen dados en hexadecimal y se puede comprobar que
coinciden con los códigos en ASCII.

Código Carac. Código Carac. Código Carac. Código Carac. Código Carac. Código Carac.
$20 Espacio $30 0 $40 @ $50 P $60 ` $70 P
$21 ¡ $31 1 $41 A $51 Q $61 A $71 Q
$22 “ $32 2 $42 B $52 R $62 B $72 R
$23 # $33 3 $43 C $53 S $63 C $73 S
$24 $ $34 4 $44 D $54 T $64 D $74 T
$25 % $35 5 $45 E $55 U $65 E $75 U
$26 & $36 6 $46 F $56 V $66 F $76 V
$27 ‘ $37 7 $47 G $57 W $67 G $77 W
$28 ( $38 8 $48 H $58 X $68 H $78 X
$29 ) $39 9 $49 I $59 Y $69 I $79 Y
$2A * $3A : $4A J $5ª Z $6A J $7A Z
$2B + $3B ; $4B K $5B [ $6B K $7B {
$2C , $3C < $4C L $5C \ $6C L $7C |
$2D - $3D = $4D M $5D ] $6D M $7D }
$2E . $3E > $4E N $5E ^ $6E N $7E ~
$2F / $3F ? $4F O $5F _ $6F O $7F ⌂
Tabla 2 – Conjunto de caracteres de uso más común.

En el caso aquí referido, la matriz de cada posición de la pantalla LCD es de 5 x 8


puntos, por lo que sólo tiene sentido usar la segunda plantilla de 240 caracteres
predefinidos.

3.2.3 La memoria del “display”


El “display” dispone de dos memorias de acceso aleatorio. La DDRAM (Display Data
RAM) donde se guardan los datos que se presentan en la pantalla y consta de 80
posiciones de 8 bits, es decir, 80 caracteres, y la CGRAM (Character Generator RAM)
que permite definir caracteres de usuario diferentes de los predefinidos en la CGROM.
Veamos a continuación su funcionamiento:

3.2.3.1 Display Data RAM (DDRAM)

Como ya se ha comentado dispone de 80 posiciones destinadas a guardar los caracteres


a representar en la pantalla. Esta memoria se puede configurar en el modo de una línea,
en cuyo caso tendrá las 80 direcciones consecutivas, o en modo de dos líneas (se
entiende que sólo tiene sentido si la pantalla LCD es de dos líneas), quedando

4
fraccionada en dos bloques de 40 posiciones consecutivas por línea. Existe una tercera
variante implementada con un LCD de cuatro líneas en la que se fracciona en cuatro
bloques de 20 posiciones.

DDRAM

Modo de 1 línea.
1 2 3 4 5 6 7 79 80
Dirección 00 01 02 03 04 05 06  4E 4F

Modo de 2 líneas.
1 2 3 4 5 6 7 39 40
Línea 1 00 01 02 03 04 05 06  26 27

Línea 2 40 41 42 43 44 45 46 66 67

Figura 3 – Configuración en los modos de una y dos líneas.

Como la pantalla LCD tiene únicamente 16 posiciones, se puede pensar en el “display”


como en un display virtual de una línea de 80 caracteres, o bien, dos de 40, donde la
pantalla real es una ventana en la que se visualizan una o dos líneas de 16 caracteres.
Mas adelante se verá cómo se puede desplazar la pantalla real sobre el display virtual.

Cualquier operación de escritura en el “display” se trata, en realidad, de una escritura en


la DDRAM y será visible o no en la pantalla dependiendo de la posición relativa que en
un momento dado tenga la ventana de visualización.


Figura 4 – Display virtual y pantalla LCD.

3.2.3.2 Character Generator RAM (CGRAM)

La memoria CGRAM permite definir caracteres de usuario. En total consta de 64


posiciones de 5 bits. El controlador HD44780U puede trabajar con pantallas LCD
cuyos caracteres están definidos mediante matrices tanto de 5 x 10 como de 5 x 8
puntos. Cada fila de cada matriz se corresponde con una dirección de memoria y cada

5
uno de los cinco bits se corresponde, a su vez, con un punto de la fila, de modo que un 1
indica que el punto está encendido y un 0 que está apagado.

Para direccionar la CGRAM se precisan 6 bits (26 = 64). En el caso de un LCD con
matrices de 5 x 10 puntos, la memoria se divide en cuatro bloques de 10 posiciones,
correspondiendo cada posición con una de las 10 filas de la matriz. Los primeros cuatro
bits de la dirección CGRAM servirán para determinar la fila de la matriz y los dos bits
restantes serán para direccionar cada uno de los cuatro bloques posibles. Si el LCD
tiene matrices de 5 x 8, como es el caso que aquí se describe, la memoria se divide en
ocho bloques de ocho posiciones, de modo que con los tres bits de menor peso se
recorren las filas de cada bloque y con los tres de mayor peso se recorren cada uno de
los ocho caracteres de usuario.

Dirección Dato
CGRAM CGRAM
000 1 0 0 0 1
001 0 1 0 1 0
010 1 1 1 1 1
011 0 0 1 0 0
000 100 1 1 1 1 1
101 0 0 1 0 0
110 0 0 1 0 0
111 0 0 0 0 0
000 0 1 1 1 0
001 0 1 1 1 0
010 0 1 1 1 0
011 0 0 1 0 0
001 100 1 1 1 1 1
101 0 0 1 0 0
110 0 1 0 1 0
111 1 0 0 0 1

000 0 0 1 0 0
001 0 1 0 1 0
010 1 0 0 0 1
011 1 0 0 0 1
111 100 1 0 1 0 1
101 1 0 1 0 1
110 1 1 1 1 1
111 0 0 0 0 0
Tabla 3 - Creación de caracteres de usuario.

6
3.2.4 Señales de control y registros internos
Para el control se dispone de cuatro señales: validación de datos (E), selección de
lectura/escritura (R/W), selección de registro (RS) e indicador de sistema ocupado
(BF). Los registros internos son tres: el contador de direcciones (AC), el registro de
instrucciones (IR) y el de datos (DR).

3.2.4.1 Señales de control

 Validación de datos, “Enable” (E): Cuando no se utiliza el


“display” esta señal debe permanecer a 0. Cuando se desea realizar
una transferencia de información (lectura o escritura) se ponen los
datos y las señales de control deseadas y se valida la operación con
E=1, debiendo permanecer en ese estado lógico durante un tiempo
superior a 500 ns., para que se realice correctamente la captura de los
datos en el registro. Cuando se devuelve la señal de validación a su
estado de reposo, E=0, la ejecución de la instrucción se inicia con el
flanco de bajada de esta señal. El periodo completo de la señal de
validación, formado por el estado lógico 1 seguido del estado lógico
0, no podrá ser inferior a 1 s.

 Selección de lectura/escritura, “Read/Write” (R/W): Se selecciona


R/W=0 para realizar una operación de escritura en el display y
R/W=1 para la lectura de datos del mismo.

 Selección de registro, “Register Select” (RS): Con RS=0 se


selecciona el registro de instrucciones (IR), y con RS=1 se
selecciona el de datos (DR).

 Indicador de ‘sistema ocupado’, “Busy Flag” (BF): Es una señal


que proporciona el sistema y que, con valor 1 (BF=1), indica que el
“display” está ejecutando una operación interna y no podrá aceptar
una nueva instrucción hasta que termine, momento en el cual pasa a
valor 0 (BF=0). El BF podrá ser leído en el último bit del registro de
instrucciones (IR7) para lo que se deberá seleccionar el registro IR
en modo lectura (RS=0, R/W=1).

7
 Figura 5 – Ejemplo de cronograma de las señales de control. (Extraído del catálogo de Hitachi).

3.2.4.2 Registros internos

 Contador de direcciones, “Address Counter” (AC): Apunta la


dirección de memoria DDRAM o CGRAM sobre la que se escribe o
se lee un dato. Su valor se incrementa o decrementa automáticamente
en una unidad después de cada operación según se haya configurado
previamente. Para modificar o leer la dirección del AC se utilizan los
siete primeros bits del registro IR (IR0-IR6). El valor de este
contador es utilizado también por el circuito de control del cursor,
que lo colocará en la posición que éste indica.

 Registro de instrucciones, “Instruction Register” (IR): En este


registro se escriben las instrucciones que se desea que el display
ejecute. También se puede leer el valor del contador de direcciones
(AC) en los primeros 7 bits (IR0 - IR6), teniendo disponible en el
octavo (IR7) la señal indicadora de ‘sistema ocupado’ (BF).

 Registro de datos, “Data Register”, (DR): Se utiliza para las


operaciones de escritura y lectura en la memoria DDRAM o
CGRAM.

En la tabla 4 se resumen las señales de control asociadas a la selección de registro.

RS R/W Acción
0 0 Operación de escritura en IR (instrucción u operación interna).
0 1 Operación de lectura de IR (permite leer el AC (IR0-IR6) y el BF (IR7)).
1 0 Operación de escritura en DR (escritura del dato en la DDRAM o CGRAM).
1 1 Operación de lectura de DR (lectura del dato de la DDRAM o CGRAM).
Tabla 4 – Selección de registro.

8
3.2.5 Conjunto de instrucciones
El LCD se controla mediante instrucciones que se resumen en la tabla 5. En las líneas
siguientes se ofrece una breve descripción de cada una.
INSTRUCCION RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Duración
Borrar display. 0 0 0 0 0 0 0 0 0 1 1.52 ms.
Cursor a inicio. 0 0 0 0 0 0 0 0 1 --- 37 s.
Establecer modo de trabajo. 0 0 0 0 0 0 0 1 I/D S 37 s.
Control ON/OFF del display. 0 0 0 0 0 0 1 D C B 37 s.
Desplazamiento del cursor / display. 0 0 0 0 0 1 S/C R/L --- --- 37 s.
Establecer modo de interfaz. 0 0 0 0 1 DL N F --- --- 37 s.
Fijar dirección de CGRAM. 0 0 0 1 ACG ACG ACG ACG ACG ACG 37 s.
Fijar dirección de DDRAM. 0 0 1 ADD ADD ADD ADD ADD ADD ADD 37 s.
Lectura de BF y AC 0 1 BF AC AC AC AC AC AC AC 0 s.
Escritura de datos en CGRAM/DDRAM 1 0 Datos a escribir 37 s.
Lectura de datos en CGRAM/DDRAM 1 1 Lectura de datos 37 s.

I/D = 1 Incremento. I/D = 0 Decremento.


S=1 Display acompaña al desplazamiento. S=0 Display quieto.
S/C = 1 Desplazar el display. S/C = 0 Desplazar el cursor.
R/L = 1 Desplazamiento a derecha. R/L = 0 Desplazamiento a izquierda.
DL = 1 Modo 8 bits. DL = 0 Modo 4 bits.
N=1 Dos líneas. N=0 Una línea.
F=1 Fuentes de 5 x 10 puntos. F=0 Fuentes de 5 x 8 puntos.
BF = 1 Ocupado internamente. BF = 0 Listo para recibir comandos.

Tabla 5 – Resumen de instrucciones.

3.2.5.1 Borrar display, “Clear Display”

 CÓDIGO: $01

 DESCRIPCIÓN: Esta instrucción escribe el carácter blanco ($20)


en todas las posiciones de la DDRAM, pone el contador de
direcciones (AC) a cero y devuelve el display a su posición de inicio
si se encuentra desplazado. También lo configura en el modo de
incremento (I/D=1).

 TIEMPO DE EJECUCIÓN: 1.52 ms.

3.2.5.2 Cursor a inicio, “Return Home”

 CÓDIGO: $02

 DESCRIPCIÓN: Envía el cursor a la posición 0, es decir, carga la


dirección 0 en el contador de direcciones (AC) y devuelve el display
a la posición de inicio.

 TIEMPO DE EJECUCIÓN: 37 s.

9
3.2.5.3 Establecer modo de trabajo, “Entry Mode Set”

 CÓDIGO: 0 0 0 0 0 1 I/D S [$0 (4-7)]

 DESCRIPCIÓN: Cada vez que se realiza una lectura o escritura el


contador de direcciones (AC) se incrementa o decrementa en función
del valor del bit I/D.

I/D: Cuando I/D=1, el contador de direcciones se incrementa y el


cursor se mueve hacia la derecha y cuando es I/D=0 se decrementa y
el cursor se mueve hacia la izquierda.

S: Con el bit S=1 se indica al display real que se desplace junto con
el cursor, con lo que da la impresión de que es el display el que se
desplaza, ya que cursor y display real mantienen la misma posición
relativa. Si S=0 el display permanece quieto y podemos observar
cómo el cursor avanza con cada escritura.

 TIEMPO DE EJECUCIÓN: 37 s.

3.2.5.4 Control ON/OFF del display

 CÓDIGO: 0 0 0 0 1 D C B [$0 (8-F)] (Valor típico $0E)

 DESCRIPCIÓN: Con este comando se activan y desactivan el


display, el cursor y la función de parpadeo.

D: Cuando D=0, el display funciona normalmente pero la pantalla


LCD está apagada. Todos los caracteres que se escriban
permanecerán en la DDRAM y se harán visibles en el momento en
que hagamos D=1.

C: Con C=1 se activa el cursor y con C=0 se desactiva, es decir, no


se ve.

B: Si B=1, el carácter que se halla en la posición del cursor parpadea.


Si B=0, no parpadea.

 TIEMPO DE EJECUCIÓN: 37 s.

3.2.5.5 Desplazamiento del cursor o display

 CÓDIGO: 0 0 0 1 S/C R/L 0 0

10
 DESCRIPCIÓN: Esta instrucción desplaza el cursor o el display
una posición a derecha o izquierda, según se indique con los bits S/C
y R/L. S/C=1 desplaza el display real y S/C=0 desplaza el cursor.
Con R/L=1/0 se indica que el desplazamiento sea a
derecha/izquierda.

 TIEMPO DE EJECUCIÓN: 37 s.

3.2.5.6 Establecer modo de interfaz, “Function Set”

 CÓDIGO: 0 0 1 DL N F 0 0

 DESCRIPCIÓN: Con esta instrucción se configuran tres aspectos


del “display”: La longitud del bus de datos, el número de líneas y el
tipo de fuentes.

DL: Si DL=1, se configura un bus de datos de 4 bits, usando sólo los


de mayor peso del puerto (DB4 a DB7) y, si DL=0, el bus es de ocho
bits (DB0 a DB7). En el modo de cuatro bits cada instrucción se
envía en dos bloques consecutivos.

N: Si N=1, el controlador trabaja en el modo de dos líneas (sólo tiene


sentido con un LCD de dos líneas) y si N=0 trabaja en el modo de
una línea.

F: Con F=1 se elige el juego de caracteres de 5 x 10 puntos y si F=0


el juego a utilizar es el de 5 x 8 puntos.

 TIEMPO DE EJECUCIÓN: 37 s.

3.2.5.7 Fijar dirección de CGRAM

 CÓDIGO: 0 1 A5 A4 A3 A2 A1 A0

 CÓDIGO TÍPICO: 0 1 0 0 0 0 0 0 (Acceso a la posición cero de la


CGRAM)

 DESCRIPCIÓN: La dirección especificada en A5–A0 se copia en el


contador de direcciones para el acceso a la CGRAM.

 TIEMPO DE EJECUCIÓN: 37 s.

11
3.2.5.8 Fijar dirección de DDRAM

 CÓDIGO: 1 A6 A5 A4 A3 A2 A1 A0

 CÓDIGO TÍPICO: 1 0 0 0 0 0 0 0 (Acceso a la posición cero de la


DDRAM).

 DESCRIPCIÓN: La dirección (A6-A0) se copia en el contador de


direcciones para el acceso a la DDRAM.

 TIEMPO DE EJECUCIÓN: 37 s.

3.2.5.9 Escritura de datos en la CGRAM o DDRAM

 CÓDIGO: 1 0 D D D D D D D D

 DESCRIPCIÓN: Escribe el dato especificado en la DDRAM o


CGRAM. La escritura en una u otra memoria viene determinada por
la operación previa. En el caso de iniciarse una escritura nueva,
mediante la operación de fijar una dirección de la CGRAM o
DDRAM. Por defecto se trabaja siempre en la DDRAM. No debe
olvidarse que tras cada escritura el AC se incrementa o decrementa
automáticamente.

 TIEMPO DE EJECUCIÓN: 37 s.

3.2.5.10 Lectura de datos de la CGRAM o DDRAM

 CÓDIGO: 1 1 D D D D D D D D

 DESCRIPCIÓN: Esta instrucción funciona de forma idéntica a la


escritura y permite conocer los datos grabados en estas memorias.

 TIEMPO DE EJECUCIÓN: 37 s.

3.2.6 Secuencia típica de inicialización del LCD


Cuando se va a comenzar a utilizar el display, es necesario configurar previamente el
dispositivo. Ello se hace a través de una secuencia de inicialización con la que se define,
el tamaño del bus de datos, el número de líneas, el juego de caracteres, etc., tras la cual
ya se puede enviar caracteres al display.

Hay que tener en cuenta que el controlador HS44780U dispone de un circuito de reset
interno que, al conectar la alimentación, realiza, durante 10 ms., la siguiente secuencia:

12
1. Borra display ($01).

2. Establece interfaz de datos de 8 bits, una línea y fuentes de 5 x 8


puntos ($20).

3. Display, cursor y parpadeo apagados ($08).

4. Modo de incremento con el display real quieto ($06).

Partiendo de esta configuración inicial parece necesario establecer una secuencia de


inicio para configurarlo conforme a la forma de conexión del hardware y a la aplicación
que se le vaya a dar. A continuación se describe una secuencia típica, válida para la
operación en 8 y 4 bits.

1. Interfaz de datos de 8 o 4 bits, una línea y fuentes de 5 x 8 puntos


($20 o $30).

2. Incrementar contador de direcciones y display quieto ($06).

3. Display y cursor encendidos y sin parpadeo ($0E).

Tras esta secuencia se encuentra listo para imprimir datos.

3.2.7 Formas de conexión a un microcontrolador


A la hora de conectar el display a un microcontrolador existen dos factores que van a
determinar la forma de conexión y que son: la longitud del bus de datos y los modos de
control del LCD. A su vez, el microcontrolador va a jugar un papel determinante en
función de los recursos que tenga disponibles, como son la memoria, puertos de entrada,
salida o bidireccionales, etc.

3.2.7.1 Longitud del bus de datos

El bus de datos del display es de 8 bits, pero puede configurarse para trabajar con
cuatro, multiplexando los bytes en grupos de 4 bits (nibbles). Esto permite ahorrar 4
puntos de conexión (pins) del puerto de entrada/salida de datos, pero tiene el
inconveniente de que el software de control es más complejo, ya que debe controlar
además el proceso de multiplexación.

13
3.2.7.2 Modos de control del LCD

Existen dos formas de controlar el LCD dependiendo de si se usa o no el bit indicador


de ocupado:

 Control en bucle cerrado: En este caso se observa el bit de ocupado


(BF) hasta que el display termine la ejecución de la instrucción en
curso. Esto se podrá hacer con diferentes técnicas. Por ejemplo
mediante un bucle de observación hasta que finalice la instrucción en
ejecución (BF=0), o bien, provocando un proceso de interrupción
cuando se cumple esa condición BF=0, etc. Para realizar el control en
bucle cerrado es necesario conectar el pin DB7 del display a un
puerto bidireccional que deberá configurarse como salida o entrada
de forma alternativa, cada vez que se lee el BF o se envía un dato.

 Control en bucle abierto: De este segundo modo no se realiza


comprobación alguna sobre el estado del display. Se considera a éste
como si de un componente pasivo se tratara. Esto se puede hacer si se
tienen en cuenta los tiempos máximos de ejecución de las
instrucciones indicados por el fabricante. Después de enviar una
instrucción, se espera un tiempo tal que asegure que la instrucción ha
finalizado antes de enviar la siguiente.

Si se opta por este control, se puede realizar una segunda simplificación en el hardware
derivada de considerar que no va a ser necesario leer ningún registro del display, con lo
que se podría configurar de modo permanente en modo escritura. De este modo no es
necesario dedicar una línea de control para esta función (R/W=0) y por tanto sólo son
necesarias dos señales de control (RS y E).

El control en bucle cerrado goza de una mayor velocidad ya que se establece un dialogo
entre el LCD y el micro. También es cierto que la complejidad del software es mucho
mayor ya que hay que realizar muchas mas operaciones diferentes para cada instrucción
que se envía, pero se pueden evitar los tiempos de espera del control en bucle abierto y
dedicarlos a procesar otras tareas. En función de la aplicación que se quiera diseñar se
optará por la velocidad de la primera solución o la sencillez de la segunda.

14
Bus de 4 bits Bus de 8 bits
3 pins de salida para el control 3 pins de salida para el control
Bucle cerrado
4 pins E/S 8 pins de E/S para los datos
2 pins de salida para el control 2 pins de salida para el control
Bucle abierto
4 pins de salida para los datos 8 pins de salida para los datos
Tabla 6 – Puntos de conexión necesarios según las diferentes opciones.

3.3 Ejemplos de control del LCD con el micro MC68331

La potencia del microcontrolador 68331 y su variedad de puertos permite implementar


cualquier control que se desee de forma aislada. La elección de la forma de conexión y
del tipo de control no es una decisión que se deba tomar a priori, sino que debe ir
integrado en el diseño global de la aplicación que se quiera realizar y de la que forma
parte el display como un módulo de presentación. La mayor o menor complejidad de la
aplicación, el número de señales que es preciso manejar, la memoria disponible, la
necesidad de que funcione en tiempo real, etc., son las características que, de verdad,
van a determinar la conexión y el control. Es interesante tener siempre presente que,
ante varias soluciones alternativas que cumplen con los objetivos de diseño y fiabilidad,
siempre es deseable escoger la más sencilla.

El objetivo de este ejemplo es ofrecer un punto de partida a aquellos alumnos que


necesiten utilizar el display para la presentación de datos. Por ello se han implementado
sendos controles, en bucle abierto y en bucle cerrado, de una forma estructurada,
describiendo brevemente cómo se han resuelto algunos de los problemas relativos a su
puesta en funcionamiento.

3.3.1 Ejemplo de control en bucle abierto

3.3.1.1 Descripción de la aplicación de control

La aplicación va a consistir en la realización de una serie de acciones que se detallan en


la lista que se muestra a continuación:

1. Escribir la frase, “PRIMERA PRUEBA. ESCRITURA NORMAL


DE TEXTO”.

2. Escribir de nuevo, “ESPERE UNOS SEGUNDOS DESPUES DE


APAGARSE EL DISPLAY”.

3. Apagar el display.

15
4. Escribir en la DDRAM el siguiente párrafo: “En un lugar de la
Mancha de cuyo nombre no quiero acordarme, no ha mucho .......”
sin que aparezca en la pantalla.

5. Encender la pantalla e ir avanzando el display, primero hacia delante


y después hacia detrás un total de tres veces seguidas en cada sentido.

3.3.1.2 Descripción de la conexión y modo de control

En primer lugar se realizará la conexión de la alimentación y de la señal de contraste de


cualquiera de las formas descritas en 2.1. A continuación hay que conectar las señales de
control y datos al microcontrolador.

En este ejemplo se va a optar por un control en bucle abierto y con ocho bits de datos.
Las tres señales de control (E, RS y R/W) se van a conectar a los bits 5 (PC4), 6 (PC5)
y 7 (PC6) del puerto C del micro y las de datos al puerto E. Cabe observar que sería
posible prescindir de la señal R/W conectándola a masa de forma permanente,
economizando así un bit del puerto.

3.3.1.3 Implementación en código ensamblador del programa de


control

A continuación se adjunta el código en lenguaje ensamblador que realiza las tareas


arriba descritas. El interés del programa reside en las secciones INSTRUCCIONES
DEL LCD y SERVICIOS DEL DISPLAY. En la primera se han implementado todas las
instrucciones que puede ejecutar el LCD y en la segunda algunos servicios de más alto
nivel que permiten realizar acciones de utilidad general más complejas a partir de las
instrucciones de una forma trasparente para el usuario. Para ello los servicios son
invocados mediante una excepción TRAP #n sin la necesidad de conocer cómo
funcionan.

******************************************************************************

* REGISTROS SIM *

******************************************************************************

SIMCR EQU $FFFA00 * Controla la configuración del sistema ($00CF).

SYNCR EQU $FFFA04 * Fija frecuencia y modo de operación del reloj ($3F08).

RSR EQU $FFFA06 * Guarda la causa de un reset (Ej.-$80, reset hardware).

PORTE EQU $FFFA11 * Registro de lectura y escritura en el puerto E.

PORTE1 EQU $FFFA13 * Tiene exactamente la misma función que el anterior.

DDRE EQU $FFFA15 * Determina el sentido del puerto E pin a pin.

16
PEPAR EQU $FFFA17 * Asignación del puerto E (Puerto o control de BUS).

PORTF EQU $FFFA19 * Registro de lectura y escritura en el puerto F.

PORTF1 EQU $FFFA1B * Tiene exactamente la misma función que el anterior.

DDRF EQU $FFFA1D * Determina el sentido del puerto F pin a pin.

PFPAR EQU $FFFA1F * Asignación del puerto F (Puerto F o control de BUS).

PICR EQU $FFFA22 * Configuración de interrupciones periódicas ($000F).

PITR EQU $FFFA24 * Contiene la cuenta del timer periódico ($0000).

SYPCR EQU $FFFA21 * Controla las funciones de monitorización del sistema

* como es el caso del Watchdog. ($40 anula watchdog).

SWSR EQU $FFFA27 * Se debe escribir periódicamente si Watchdog activado.

CSPAR0 EQU $FFFA44 * Sirve junto con CSPAR1 para configurar la función de

CSPAR1 EQU $FFFA46 * los pins de Chip Select (CS, Port C, etc.).

PORTC EQU $FFFA41 * Registro de escritura en el puerto C.

******************************************************************************

* REGISTROS GPT-PWM *

******************************************************************************

GPTMCR EQU $FFF900 * Configuración del GPT.

ICR EQU $FFF904 * Configuración de interrupciones del GPT.

DDRGP EQU $FFF906 * Determina el sentido del puerto GP.

PORTGP EQU $FFF907 * Registro de lectura y escritura del puerto GP.

OC1M EQU $FFF908 * Máscara para asignar los pin de captura de OC.

OC1D EQU $FFF909 * Registro de datos a comparar con el puerto OC.

TCNT EQU $FFF90A * Registro del GPT asociado a las capturas IC, OC y PAI.

PACTL EQU $FFF90C * Configuración del acumulador de pulsos PAI.

PACNT EQU $FFF90D * Es el contador de registro de eventos del PAI.

TIC1 EQU $FFF90E * Capturan el TCNT cuando se registra un evento en IC1.

TIC2 EQU $FFF910 * Capturan el TCNT cuando se registra un evento en IC2.

TIC3 EQU $FFF912 * Capturan el TCNT cuando se registra un evento en IC3.

TOC1 EQU $FFF914 * Cuando coincide con TCNT causa eventos en los pin OC.

TOC2 EQU $FFF916 * Si el valor coincide con TCNT causa un evento en OC2.

TOC3 EQU $FFF918 * Si el valor coincide con TCNT causa un evento en OC3.

TOC4 EQU $FFF91A * Si el valor coincide con TCNT causa un evento en OC4.

TI4O5 EQU $FFF91C * Pin compartido (Puede realizar una función TIC o TOC).

TCTL1 EQU $FFF91E * Configura el modo de comparación y nivel de salida.

TCTL2 EQU $FFF91F * Configura que flanco provoca la captura en los IC.

TMSK1 EQU $FFF920 * Habilita las interrupciones de IC y OC.

TMSK2 EQU $FFF921 * Habilita las interrupciones del PAI y del TIMER.

TFLG1 EQU $FFF922 * Registro de flags de interrupciones de IC y OC.

17
TFLG2 EQU $FFF923 * Registro de flags de interrupciones del PAI y TIMER

CFORC EQU $FFF924 * Fuerza una salida en los pin OC y PWM.

PWMC EQU $FFF925 * Configuración del PWM.

PWMA EQU $FFF926 * Determina el ancho de pulso. ($80 es medio ciclo)

PWMB EQU $FFF927 * Determina el ancho de pulso. ($80 es medio ciclo)

PWMCNT EQU $FFF928 * Registro del contador del PWM.

PWMBUFA EQU $FFF92A * Buffer para prevenir glitches cuando modificamos PWMA.

PWMBUFB EQU $FFF92B * Buffer para prevenir glitches cuando modificamos PWMB.

PRESCL EQU $FFF92C * Guarda el valor del multiplicador del GPT.

******************************************************************************

* TIPOS DE RETARDO *

******************************************************************************

CORTO EQU $03FF * Del orden de 100us.


LARGO EQU $BFFF * Del orden de 5ms.

RETARDO EQU $6FFF * Se usa para el avance de caracteres.

******************************************************************************

* CONSTANTES DE INTERÉS *

******************************************************************************

INI_DR EQU $00 * Inicio de línea única de caracteres.

FIN_DR EQU $4F * Fin línea única de caracteres.

L1_INI_DR EQU $00 * Inicio de la primera línea.

L1_FIN_DR EQU $27 * Fin de la primera línea.

L2_INI_DR EQU $40 * Inicio de la segunda línea.

L2_FIN_DR EQU $67 * Fin de la segunda línea.

LCD_LONG EQU $0F * Longitud de la pantalla del LCD.

******************************************************************************

* PUERTOS DEL DISPLAY *

******************************************************************************

BYTE_DATA EQU PORTE * Puerto de datos.

BYTE_CONTROL EQU PORTC * Puerto de control.

BIT_ENABLE EQU 4 * Se usa para controlar el proceso de comunicación.

* con el controlador del display.

BIT_RS EQU 5 * Selección del tipo de registro al que se escribe:

* 0 - Registro de Instrucciones (IR).

* 1 - Registro de Datos (DR).

BIT_RW EQU 6 * Cambio entre los modos de lectura y escritura.

18
******************************************************************************

* VECTORES DEL RESET *

******************************************************************************

ORG $0

PILA_RESET DC.L FIN_PILA

PC_RESET DC.L PRINCIPAL

******************************************************************************

* VECTORES DE INTERRUPCIÓN *

******************************************************************************

ORG $80

VECTOR0 DC.L DRIVER_DISPLAY

******************************************************************************
* PUNTERO DE PILA *

******************************************************************************

ORG $4000

PILA DS.L 200

FIN_PILA:

******************************************************************************

* LISTA DE MENSAJES *

******************************************************************************

ORG $2000

MENSAJES DC.L MENS1,MENS2,MENS3

MENS1 DC.B 'PRIMERA PRUEBA. ESCRITURA NORMAL DE TEXTO.',$00

MENS2 DC.B 'ESPERE UNOS SEGUNDOS DESPUES DE APAGARSE EL DISPLAY.',$00

MENS3 DC.B 'En un lugar de la Mancha de cuyo nombre no quiero acordarme, no


ha mucho .......',$00

******************************************************************************

* SUBRUTINAS *

******************************************************************************

ORG $1000

******************************************************************************

* CONFIGURACION DEL HARDWARE DEL MICRO *

******************************************************************************

19
*************************** INHAB_WDOG ****************************

* Inhabilita el Watchdog que es una función de monitoriración del *

* sistema para detectar la entrada en un bucle infinito. *

*******************************************************************

INHAB_WDOG:

MOVE.B #$40,SYPCR * Inhabilitamos WatchDog

RTS

*----------------------------------------------------------------------------*

************************** PORT_EC_CFG ****************************

* Con esta rutina se configuran los puertos E y C que son los que *

* se usan para controlar el display y el teclado. *

*******************************************************************

PORT_EC_CFG
MOVE.B #$FF,DDRE * PE0..PE7 salidas.

MOVE.B #$00,PEPAR * Configura el registro de control del puerto E.

MOVE.B #$00,CSPAR0 * PC0-PC2 utilizables.

MOVE.W #$0000,CSPAR1 * PC3-PC6 utilizables.

MOVE.B #$00,PORTE

MOVE.B #$0F,PORTC

RTS

*----------------------------------------------------------------------------*

******************************************************************************

* RUTINAS DE CONTROL *

******************************************************************************

***************************** DELAY *******************************

* Produce un retardo cuya duración viene determinada por el valor *

* almacenado en el registro D1. *

*******************************************************************

DELAY

SUB.L #1,D1

BNE DELAY

RTS

*----------------------------------------------------------------------------*

***************************** TOGGLE ******************************

* Provoca la ejecución de la instrucción, generando un pulso de *

* duración determinada por el valor del registro D2 en la línea *

* Enable del LCD. *

*******************************************************************

20
TOGGLE

MOVE.L D1,-(A7)

MOVE.L D2,D1

BSET.B #BIT_ENABLE,BYTE_CONTROL

BSR DELAY

MOVE.L D2,D1

BCLR.B #BIT_ENABLE,BYTE_CONTROL

BSR DELAY

MOVE.L (A7)+,D1

RTS

*----------------------------------------------------------------------------*

******************************************************************************

* INSTRUCCIONES LCD *
******************************************************************************

************************** CFG_DISPLAY ****************************

* Configura el modo de funcionamiento del display. Básicamente se *

* reduce a tres aspectos: *

* 1 - Comunicación con el display con 8 o 4 bits. *

* 2 - 1 o 2 líneas en pantalla. *

* 3 - Dos tipos de fuentes 5x8 o bien 5x10 puntos. *

* Suprimiendo el asterisco correspondiente se puede modificar la *

* opción seleccionada por defecto. *

* Retardo necesario CORTO *

*******************************************************************

CFG_DISPLAY

MOVE.B #$30,BYTE_DATA * Modo 8 bits, una línea, fuentes 5x8 puntos.

* BCLR.B #4,BYTE_DATA * Modo 4 bits.

* BSET.B #3,BYTE_DATA * Habilita 2 líneas.

* BSET.B #2,BYTE_DATA * Fuentes de 5x10 puntos.

BSR TOGGLE

RTS

*----------------------------------------------------------------------------*

*************************** MODO_AVC ******************************

* El cursor avanza cuando se escribe un carácter en el registro *

* DR. El display permanece estático. *

* Retardo necesario CORTO. *

*******************************************************************

21
MODO_AVC

MOVE.B #$06,BYTE_DATA * Cursor adelante, display no acompaña.

BSR TOGGLE

RTS

*----------------------------------------------------------------------------*

*************************** MODO_AVT ******************************

* El cursor y el display avanzan solidariamente cuando se escribe *

* un carácter en el registro DR. *

* Retardo necesario CORTO. *

*******************************************************************

MODO_AVT

MOVE.B #$07,BYTE_DATA * Cursor adelante, display acompaña.

BSR TOGGLE
RTS

*----------------------------------------------------------------------------*

*************************** MODO_RTC ******************************

* El cursor retrocede cuando se escribe un carácter en el regis- *

* tro DR. El display permanece estático. *

* Retardo necesario CORTO. *

*******************************************************************

MODO_RTC

MOVE.B #$04,BYTE_DATA * Cursor atrás, display no acompa¤a.

BSR TOGGLE

RTS

*----------------------------------------------------------------------------*

*************************** MODO_RTT ******************************

* El cursor y el display retroceden solidariamente cuando se es- *

* cribe un carácter en el registro DR. *

* Retardo necesario CORTO. *

*******************************************************************

MODO_RTT

MOVE.B #$05,BYTE_DATA * Cursor atrás, display acompaña.

BSR TOGGLE

RTS

*----------------------------------------------------------------------------*

22
************************** MODO_NORMAL ****************************

* Se configura el modo del display. Por defecto estarán tanto el *

* display como el cursor encendidos y sin parpadear el carácter *

* donde se encuentra el cursor. *

* Retardo necesario CORTO *

*******************************************************************

MODO_NORMAL

MOVE.B #$0E,BYTE_DATA * Display y Cursor ON, blinkin OFF

* BCLR.B #2,BYTE_DATA * Display OFF

* BCLR.B #1,BYTE_DATA * Cursor OFF

* BSET.B #0,BYTE_DATA * Blinking ON

BSR TOGGLE

RTS

*----------------------------------------------------------------------------*

**************************** MODO_OFF *****************************

* Produce el apagado de la pantalla del LCD. Se puede seguir en- *

* viando ordenes al display que ser n ejecutadas. La única dife- *

* rencia es que no aparece reflejado hasta que no se enciende de *

* el LCD. *

* Retardo necesario CORTO *

*******************************************************************

MODO_OFF

MOVE.B #$08,BYTE_DATA * Display y Cursor ON, blinkin OFF

BSR TOGGLE

RTS

*----------------------------------------------------------------------------*

***************************** CLEAR *******************************

* Borra el contenido del display y situa el cursor a la izquierda *

* Retardo necesario INDEFINIDO *

*******************************************************************

CLEAR

MOVE.B #$01,BYTE_DATA

BSR TOGGLE

RTS

*----------------------------------------------------------------------------*

23
************************** RETURN_HOME *****************************

* Devuelve el cursor a la primera posición conservando el conteni- *

* de la memoria del display. *

* Retardo necesario LARGO *

********************************************************************

RETURN_HOME

MOVE.B #$02,BYTE_DATA

BSR TOGGLE

RTS

*----------------------------------------------------------------------------*

*************************** CURS_IZQ ******************************

* Mueve el cursor a la izquierda sin modificar el texto. *

* Retardo necesario CORTO *


*******************************************************************

CURS_IZQ

MOVE.B #$10,BYTE_DATA

BSR TOGGLE

RTS

*----------------------------------------------------------------------------*

*************************** CURS_DCHA *****************************

* Mueve el cursor a la derecha sin modificar el texto. *

* Retardo necesario CORTO *

*******************************************************************

CURS_DCHA

MOVE.B #$14,BYTE_DATA

BSR TOGGLE

RTS

*----------------------------------------------------------------------------*

*************************** DISP_IZQ ******************************

* Desplaza la ventana del display hacia la izquierda. *

* Retardo necesario CORTO *

*******************************************************************

DISP_IZQ

MOVE.B #$1C,BYTE_DATA

BSR TOGGLE

RTS

24
*************************** DISP_DCHA *****************************

* Desplaza la ventana del display hacia la derecha. *

* Retardo necesario CORTO *

*******************************************************************

DISP_DCHA

MOVE.B #$18,BYTE_DATA

BSR TOGGLE

RTS

*----------------------------------------------------------------------------*

************************** CGRAM_ADDR *****************************

* Coloca la dirección indicada en el contador de la Memoria del *

* Generador de Caracteres (CGRAM). Este generador permite definir *

* 8 caracteres de usuario en el modo 5x8 y cuatro en el de 5x10 *


* puntos. Para un correcto uso de la instrucción deberemos escri- *

* bir una de las 64 direcciones posibles (de $00 a $3F) en *

* BYTE_DATA. *

* Retardo necesario CORTO *

*******************************************************************

CGRAM_ADDR

ADD.B #$40,BYTE_DATA

BSET.B #BIT_RS,BYTE_CONTROL

BSR TOGGLE

BCLR.B #BIT_RS,BYTE_CONTROL

RTS

*----------------------------------------------------------------------------*

************************** DDRAM_ADDR *****************************

* Coloca la dirección indicada en el contador de la Memoria de *

* Datos del Display (DDRAM). Existen 80 posiciones disponibles *

* que serán consecutivas cuando el display trabaje en una única *

* línea o repartidas en dos grupos de 40 cuando trabaje en el *

* modo de dos líneas. *

* V‚ase detalle a continuación: *

* - 80 posiciones x 1 línea - las direcciones van de $0 a $4F. *

* - 40 posiciones x 2 líneas - las direcciones se reparten: *

* Línea primera: de $00 a $27. *

* Línea segunda: de $40 a $67. *

* Retardo necesario CORTO *

*******************************************************************

25
DDRAM_ADDR

ADD.B #$80,BYTE_DATA

BSET.B #BIT_RS,BYTE_CONTROL

BSR TOGGLE

BCLR.B #BIT_RS,BYTE_CONTROL

RTS

*----------------------------------------------------------------------------*

*************************** ESCRIBIR ******************************

* Esta instrucción permite escribir en el registro de datos (DR) *

* una palabra que puede ir destinada a la memoria del generador *

* de caracteres (CGRAM) o a la de datos del display (DDRAM) de- *

* pendiendo de cual fu‚ la última selección. El dato a escribir *

* lo pondremos en el puerto de datos (BYTE_DATA). *


* Retardo necesario CORTO. *

*******************************************************************

ESCRIBIR

BSET.B #BIT_RS,BYTE_CONTROL

BSR TOGGLE

BCLR.B #BIT_RS,BYTE_CONTROL

RTS

*----------------------------------------------------------------------------*

******************************************************************************

* RUTINAS DE INICIALIZACIÓN DE DISPOSITIVOS *

******************************************************************************

**************************** INI_LCD ******************************

* Esta rutina realiza toda la inicialización del display tras el *

* encendido del mismo. Después de su ejecución el display queda *

* preparado para recibir ordenes y caracteres. *

*******************************************************************

INI_LCD

MOVE.L #CORTO,D2 * Fijamos la duración de retardo.

BSR CFG_DISPLAY

BSR MODO_NORMAL

BSR CLEAR

RTS

*----------------------------------------------------------------------------*

26
******************************************************************************

* SERVICIOS DE DISPOSITIVOS *

******************************************************************************

******************************************************************************

* SERVICIOS DEL DISPLAY *

******************************************************************************

************************** ESCR_MENSAJE ***************************

* Esta rutina escribe un mensaje completo en el display en el *

* sentido natural de escritura cuya dirección de inicio se la pa- *

* samos a través del registro A0. El símbolo con que deber ter- *

* minarse el mensaje es $00. Si el mensaje es superior a los 16 *

* caracteres que tiene el LCD, al alcanzar el final de la línea *

* automáticamente se cambia del modo AVC al AVT en el que el dis- *

* play acompaña al cursor dando la sensación de que el texto se *


* desplaza. *

*******************************************************************

ESCR_MENSAJE

MOVEM.L D0-D2,-(A7)

MOVE.L #LARGO,D2

BSR RETURN_HOME

MOVE.L #CORTO,D2

BSR MODO_AVC

MOVE.B #LCD_LONG,D0 * Cuenta los caracteres escritos en el display.

BUCLE1

TST.B (A0)

BEQ FIN1

MOVE.B (A0)+,BYTE_DATOS

BSR ESCRIBIR

SUB.B #1,D0

BEQ FIN_LIN1

MOVE.L #RETARDO,D1

BSR DELAY

BRA BUCLE1

FIN_LIN1

BSR MODO_AVT * Cambia al modo AVT para que el display acompañe al cursor.

BRA BUCLE1

FIN1

MOVEM.L (A7)+,D0-D2

RTS

27
*************************** DSP_ADELANTE **************************

* Esta rutina desplaza hacia la derecha la pantalla del display *

* recorriendo las 80 posiciones del registro DDRAM. *

*******************************************************************

DSP_ADELANTE

MOVEM.L D0-D1,-(A7)

MOVE.B #FIN_DR,D0 * Cuenta los caracteres escritos en el display.

BUCLE2

BSR DISP_DCHA

MOVE.L #RETARDO,D1

BSR DELAY

SUB.B #1,D0

BNE BUCLE2

MOVEM.L (A7)+,D0-D1
RTS

*----------------------------------------------------------------------------*

**************************** DSP_ATRAS ****************************

* Esta rutina desplaza hacia la izquierda la pantalla del display *

* recorriendo las 80 posiciones del registro DDRAM. *

*******************************************************************

DSP_ATRAS

MOVEM.L D0-D1,-(A7)

MOVE.B #FIN_DR,D0 * Cuenta los caracteres escritos en el display.

BUCLE3

BSR DISP_IZQ

MOVE.L #RETARDO,D1

BSR DELAY

SUB.B #1,D0

BNE BUCLE3

MOVEM.L (A7)+,D0-D1

RTS

*----------------------------------------------------------------------------*

************************** DRIVER_DISPLAY *************************

* Esta rutina realiza el servicio indicado a través del registro *

* D7 con un número ordinal. Para llamar a la rutina de servicio *

* se coloca el número de servicio en el registro D7 y se ejecuta *

* un TRAP #0. *

*******************************************************************

28
DRIVER_DISPLAY

MOVEM.L D0-D1,-(A7)

CMP.B #1,D7

BEQ SERVICIO1

CMP.B #2,D7

BEQ SERVICIO2

CMP.B #3,D7

BEQ SERVICIO3

SERVICIO1

BSR ESCR_MENSAJE

BRA FIN

SERVICIO2

BSR DSP_ADELANTE

BRA FIN
SERVICIO3

BSR DSP_ATRAS

FIN

MOVEM.L (A7)+,D0-D1

RTE

*----------------------------------------------------------------------------*

******************************************************************************

* PRINCIPAL *

******************************************************************************

ORG $400

PRINCIPAL

BSR INHAB_WDOG

BSR PORT_EC_CFG

BSR INI_LCD

MOVEA.L #MENSAJES,A6

MOVEA.L (A6)+,A0

MOVE.L #1,D7

TRAP #0

MOVEA.L (A6)+,A0

MOVE.L #1,D7

TRAP #0

BSR MODO_OFF

MOVEA.L (A6),A0

MOVE.L #1,D7

29
TRAP #0

BSR MODO_NORMAL

MOVE.B #3,D3

LOOP1

MOVE.L #2,D7

TRAP #0

SUB.B #1,D3

BNE LOOP1

MOVE.B #3,D3

LOOP2

MOVE.L #3,D7

TRAP #0

SUB.B #1,D3

BNE LOOP2
FINAL

BRA FINAL

END

3.3.1.3.1 Observaciones sobre el ajuste de parámetros

Existen ciertos parámetros que ha sido necesario someterlos a un ajuste, como son los
retardos.

3.3.1.3.1.1 Ajuste de la señal de activación, “Enable”.


Esta señal es la que gobierna el proceso de comunicación con el display. La función
“toggle” tiene como objetivo conformar un pulso sobre la línea de activación (E). Esta
función utiliza una subrutina llamada “DELAY” que introduce el retardo necesario para
definir el periodo de esta señal. Cada vez que se llama a la función TOGGLE, ésta
genera un pulso de aspecto más o menos cuadrado en la señal ”Enable” cuyo periodo
dependerá del valor que se cargue en el contador de retardo DELAY. A continuación se
detallan las dos subrutinas:

***************************** DELAY *******************************

* Produce un retardo cuya duración viene determinada por el valor *

* almacenado en el registro D1. *

*******************************************************************

DELAY

SUB.L #1,D1

BNE DELAY

RTS

30
*----------------------------------------------------------------------------*

***************************** TOGGLE ******************************

* Provoca la ejecución de la instrucción, generando un pulso de *

* duración determinada en la línea Enable del LCD. *

*******************************************************************

TOGGLE

MOVE.L D2,D1

BSET.B #BIT_ENABLE,BYTE_CONTROL

BSR DELAY

MOVE.L D2,D1

BCLR.B #BIT_ENABLE,BYTE_CONTROL

BSR DELAY

RTS

El display requiere de 37 s. para completar la mayoría de las instrucciones. Por tanto si
se elige un periodo de señal de 100 s., 50 s. por ciclo, con toda seguridad siempre
habrá terminado la instrucción. Para el ajuste de este periodo se ejecuta la rutina
TOGGLE en un bucle infinito y se mide con el osciloscopio el periodo de la señal
resultante, que iremos ajustando variando el valor de la constante CORTO. También se
debe generar esta señal con un retardo superior a los 1.6 ms. que requiere la instrucción
cursor a inicio (Return Home). Para ello se procederá de igual forma ajustando el valor
de la constante LARGO.

3.3.2 Ejemplo de control en bucle cerrado

3.3.2.1 Descripción de la aplicación de control

La aplicación va a consistir en la repetición secuencial de un conjunto de mensajes, en


particular, los números del uno al nueve más el cero y la frase siguiente: ES UNA
PRUEBA DE MENSAJE LARGO PARA VER QUE PASA, esperándose que si el
servicio de escritura de mensajes es lo bastante rápido, sólo sean visibles en el display
los dieciséis caracteres últimos de la frase, esto es: “ARA VER QUE PASA”.

3.3.2.2 Descripción de la conexión y modo de control

El modo de conexión no difiere con respecto al caso anterior, con la salvedad de que en
esta ocasión sí se utiliza la señal R/W y, por tanto, no se puede prescindir de ella.

31
3.3.2.3 Implementación en código ensamblador del programa de
control

El interés de este programa reside en la rapidez de ejecución basada en la comunicación


entre los dos dispositivos.

******************************************************************************

* REGISTROS SIM *

******************************************************************************

SIMCR EQU $FFFA00 * Controla la configuración del sistema ($00CF).

SYNCR EQU $FFFA04 * Fija frecuencia y modo de operación del reloj ($3F08).

RSR EQU $FFFA06 * Guarda la causa de un reset (Ej.-$80, reset hardware).

PORTE EQU $FFFA11 * Registro de lectura y escritura en el puerto E.

PORTE1 EQU $FFFA13 * Tiene exactamente la misma función que el anterior.

DDRE EQU $FFFA15 * Determina el sentido del puerto E pin a pin.

PEPAR EQU $FFFA17 * Asignación del puerto E (Puerto o control de BUS).

PORTF EQU $FFFA19 * Registro de lectura y escritura en el puerto F.

PORTF1 EQU $FFFA1B * Tiene exactamente la misma función que el anterior.

DDRF EQU $FFFA1D * Determina el sentido del puerto F pin a pin.

PFPAR EQU $FFFA1F * Asignación del puerto F (Puerto F o control de BUS).

PICR EQU $FFFA22 * Configuración de interrupciones periódicas ($000F).

PITR EQU $FFFA24 * Contiene la cuenta del timer periódico ($0000).

SYPCR EQU $FFFA21 * Controla las funciones de monitorización del sistema

* como es el caso del Watchdog. ($40 anula watchdog).

SWSR EQU $FFFA27 * Se debe escribir periódicamente si Watchdog activado.

CSPAR0 EQU $FFFA44 * Sirve junto con CSPAR1 para configurar la función de

CSPAR1 EQU $FFFA46 * los pins de Chip Select (CS, Port C, etc.).

PORTC EQU $FFFA41 * Registro de escritura en el puerto C.

******************************************************************************

* REGISTROS GPT-PWM *

******************************************************************************

GPTMCR EQU $FFF900 * Configuración del GPT.

ICR EQU $FFF904 * Configuración de interrupciones del GPT.

DDRGP EQU $FFF906 * Determina el sentido del puerto GP.

PORTGP EQU $FFF907 * Registro de lectura y escritura del puerto GP.

OC1M EQU $FFF908 * Máscara para asignar los pin de captura de OC.

OC1D EQU $FFF909 * Registro de datos a comparar con el puerto OC.

TCNT EQU $FFF90A * Registro del GPT asociado a las capturas IC, OC y PAI.

PACTL EQU $FFF90C * Configuración del acumulador de pulsos PAI.

32
PACNT EQU $FFF90D * Es el contador de registro de eventos del PAI.

TIC1 EQU $FFF90E * Capturan el TCNT cuando se registra un evento en IC1.

TIC2 EQU $FFF910 * Capturan el TCNT cuando se registra un evento en IC2.

TIC3 EQU $FFF912 * Capturan el TCNT cuando se registra un evento en IC3.

TOC1 EQU $FFF914 * Cuando coincide con TCNT causa eventos en los pin OC.

TOC2 EQU $FFF916 * Si el valor coincide con TCNT causa un evento en OC2.

TOC3 EQU $FFF918 * Si el valor coincide con TCNT causa un evento en OC3.

TOC4 EQU $FFF91A * Si el valor coincide con TCNT causa un evento en OC4.

TI4O5 EQU $FFF91C * Pin compartido (Puede realizar una función TIC o TOC).

TCTL1 EQU $FFF91E * Configura el modo de comparación y nivel de salida.

TCTL2 EQU $FFF91F * Configura que flanco provoca la captura en los IC.

TMSK1 EQU $FFF920 * Habilita las interrupciones de IC y OC.

TMSK2 EQU $FFF921 * Habilita las interrupciones del PAI y del TIMER.

TFLG1 EQU $FFF922 * Registro de flags de interrupciones de IC y OC.


TFLG2 EQU $FFF923 * Registro de flags de interrupciones del PAI y TIMER

CFORC EQU $FFF924 * Fuerza una salida en los pin OC y PWM.

PWMC EQU $FFF925 * Configuración del PWM.

PWMA EQU $FFF926 * Determina el ancho de pulso. ($80 es medio ciclo)

PWMB EQU $FFF927 * Determina el ancho de pulso. ($80 es medio ciclo)

PWMCNT EQU $FFF928 * Registro del contador del PWM.

PWMBUFA EQU $FFF92A * Buffer para prevenir glitches cuando modificamos PWMA.

PWMBUFB EQU $FFF92B * Buffer para prevenir glitches cuando modificamos PWMB.

PRESCL EQU $FFF92C * Guarda el valor del multiplicador del GPT.

******************************************************************************

* TIPOS DE RETARDO *

******************************************************************************

CORTO EQU $03FF * Del orden de 100us.

LARGO EQU $BFFF * Del orden de 5ms.

RETARDO EQU $6FFF * Se usa para el avance de caracteres.

******************************************************************************

* CONSTANTES DE INTERÉS *

******************************************************************************

INI_DR EQU $00 * Inicio de línea única de caracteres.

FIN_DR EQU $4F * Fin línea única de caracteres.

L1_INI_DR EQU $00 * Inicio de la primera línea.

L1_FIN_DR EQU $27 * Fin de la primera línea.

L2_INI_DR EQU $40 * Inicio de la segunda línea.

33
L2_FIN_DR EQU $67 * Fin de la segunda línea.

LCD_LONG EQU $0F * Longitud de la pantalla del LCD.

******************************************************************************

* PUERTOS DEL DISPLAY *

******************************************************************************

BYTE_DATA EQU PORTE * Puerto de datos.

BYTE_CONTROL EQU PORTC * Puerto de control.

BIT_ENABLE EQU 4 * Se usa para controlar el proceso de comunicación.

* con el controlador del display.

BIT_RS EQU 5 * Selección del tipo de registro al que se escribe:

* 0 - Registro de Instrucciones (IR).

* 1 - Registro de Datos (DR).

BIT_RW EQU 6 * Cambio entre los modos de lectura y escritura.


FLAG EQU 7 * Posición del flag de datos en el puerto.

******************************************************************************

* VECTORES DEL RESET *

******************************************************************************

ORG $0

PILA_RESET DC.L FIN_PILA

PC_RESET DC.L PRINCIPAL

******************************************************************************

* VECTORES DE INTERRUPCIÓN *

******************************************************************************

ORG $80

VECTOR1 DC.L DRIVER_DISPLAY

******************************************************************************

* PUNTERO DE PILA *

******************************************************************************

ORG $4000

PILA DS.L 200

FIN_PILA:

******************************************************************************

* LISTA DE MENSAJES *

******************************************************************************

ORG $2000

34
MENSAJES DC.L
MENS1,MENS2,MENS3,MENS4,MENS5,MENS6,MENS7,MENS8,MENS9,MENS0,MENSLARGO

MENS1 DC.B 'UNO',$00

MENS2 DC.B 'DOS',$00

MENS3 DC.B 'TRES',$00

MENS4 DC.B 'CUATRO',$00

MENS5 DC.B 'CINCO',$00

MENS6 DC.B 'SEIS',$00

MENS7 DC.B 'SIETE',$00

MENS8 DC.B 'OCHO',$00

MENS9 DC.B 'NUEVE',$00

MENS0 DC.B 'CERO',$00

MENSLARGO DC.B 'ES UNA PRUEBA DE MENSAJE LARGO PARA VER QUE PASA',$00

******************************************************************************
* SUBRUTINAS *

******************************************************************************

ORG $1000

******************************************************************************

* CONFIGURACION DEL HARDWARE DEL MICRO *

******************************************************************************

*************************** INHAB_WDOG ****************************

* Inhabilita el Watchdog que es una función de monitoriración del *

* sistema para detectar la entrada en un bucle infinito. *

*******************************************************************

INHAB_WDOG:

MOVE.B #$40,SYPCR * Inhabilitamos WatchDog

RTS

*----------------------------------------------------------------------------*

************************** PORT_EC_CFG ****************************

* Con esta rutina se configuran los puertos E y C que son los que *

* se usan para controlar el display y el teclado. *

*******************************************************************

PORT_EC_CFG

MOVE.B #$FF,DDRE * PE0..PE7 salidas.

MOVE.B #$00,PEPAR * Configura el registro de control del puerto E.

MOVE.B #$00,CSPAR0 * PC0-PC2 utilizables.

35
MOVE.W #$0000,CSPAR1 * PC3-PC6 utilizables.

MOVE.B #$00,PORTE

MOVE.B #$0F,PORTC

RTS

*----------------------------------------------------------------------------*

******************************************************************************

* RUTINAS DE CONTROL *

******************************************************************************

***************************** DELAY *******************************

* Produce un retardo cuya duración viene determinada por el valor *

* almacenado en el registro D1. *

*******************************************************************

DELAY
SUB.L #1,D1

BNE DELAY

RTS

*----------------------------------------------------------------------------*

************************* FLAG_ESPERAR ****************************

* Espera a que se baje el flag de ocupado. *

*******************************************************************

FLAG_ESPERAR

MOVE.B #$7F,DDRE

BSET.B #BIT_RW,BYTE_CONTROL

BSET.B #BIT_ENABLE,BYTE_CONTROL

OCUPADO

BTST.B #FLAG,BYTE_DATA

BNE OCUPADO

BCLR.B #BIT_ENABLE,BYTE_CONTROL

BCLR.B #BIT_RW,BYTE_CONTROL

MOVE.B #$FF,DDRE

RTS

*----------------------------------------------------------------------------*

*************************** ENABLE_LCD ****************************

* Provoca la ejecución de la instrucción, generando un pulso en *

* la línea Enable del LCD. *

*******************************************************************

36
ENABLE_LCD

BSET.B #BIT_ENABLE,BYTE_CONTROL

BCLR.B #BIT_ENABLE,BYTE_CONTROL

RTS

*----------------------------------------------------------------------------*

******************************************************************************

* INSTRUCCIONES LCD *

******************************************************************************

************************** CFG_DISPLAY ****************************

* Configura el modo de funcionamiento del display. Básicamente se *

* reduce a tres aspectos: *

* 1 - Comunicación con el display con 8 o 4 bits. *

* 2 - 1 o 2 líneas en pantalla. *
* 3 - Dos tipos de fuentes 5x8 o bien 5x10 puntos. *

* Suprimiendo el asterisco correspondiente se puede modificar la *

* opción seleccionada por defecto. *

*******************************************************************

CFG_DISPLAY

BSR FLAG_ESPERAR

MOVE.B #$30,BYTE_DATA * Modo 8 bits, una línea, fuentes 5x8 puntos.

* BCLR.B #4,BYTE_DATA * Modo 4 bits.

* BSET.B #3,BYTE_DATA * Habilita 2 líneas.

* BSET.B #2,BYTE_DATA * Fuentes de 5x10 puntos.

BSR ENABLE_LCD

RTS

*----------------------------------------------------------------------------*

*************************** MODO_AVC ******************************

* El cursor avanza cuando se escribe un carácter en el registro *

* DR. El display permanece estático. *

*******************************************************************

MODO_AVC

BSR FLAG_ESPERAR

MOVE.B #$06,BYTE_DATA * Cursor adelante, display no acompaña.

BSR ENABLE_LCD

RTS

*----------------------------------------------------------------------------*

37
*************************** MODO_AVT ******************************

* El cursor y el display avanzan solidariamente cuando se escribe *

* un carácter en el registro DR. *

*******************************************************************

MODO_AVT

BSR FLAG_ESPERAR

MOVE.B #$07,BYTE_DATA * Cursor adelante, display acompaña.

BSR ENABLE_LCD

RTS

*----------------------------------------------------------------------------*

*************************** MODO_RTC ******************************

* El cursor retrocede cuando se escribe un carácter en el regis- *


* tro DR. El display permanece estático. *

*******************************************************************

MODO_RTC

BSR FLAG_ESPERAR

MOVE.B #$04,BYTE_DATA * Cursor atrás, display no acompaña.

BSR ENABLE_LCD

RTS

*----------------------------------------------------------------------------*

*************************** MODO_RTT ******************************

* El cursor y el display retroceden solidariamente cuando se es- *

* cribe un carácter en el registro DR. *

*******************************************************************

MODO_RTT

BSR FLAG_ESPERAR

MOVE.B #$05,BYTE_DATA * Cursor atrás, display acompaña.

BSR ENABLE_LCD

RTS

*----------------------------------------------------------------------------*

************************** MODO_NORMAL ****************************

* Se configura el modo del display. Por defecto estarán tanto el *

* display como el cursor encendidos y sin parpadear el carácter *

* donde se encuentra el cursor. *

38
*******************************************************************

MODO_NORMAL

BSR FLAG_ESPERAR

MOVE.B #$0E,BYTE_DATA * Display y Cursor ON, blinkin OFF

* BCLR.B #2,BYTE_DATA * Display OFF

* BCLR.B #1,BYTE_DATA * Cursor OFF

* BSET.B #0,BYTE_DATA * Blinking ON

BSR ENABLE_LCD

RTS

*----------------------------------------------------------------------------*

**************************** MODO_OFF *****************************

* Produce el apagado de la pantalla del LCD. Se puede seguir en- *

* viando ordenes al display que ser n ejecutadas. La única dife- *


* rencia es que no aparece reflejado hasta que no se enciende de *

* el LCD. *

*******************************************************************

MODO_OFF

BSR FLAG_ESPERAR

MOVE.B #$08,BYTE_DATA * Display y Cursor ON, blinkin OFF

BSR ENABLE_LCD

RTS

*----------------------------------------------------------------------------*

***************************** CLEAR *******************************

* Borra el contenido del display y situa el cursor a la izquierda *

*******************************************************************

CLEAR

BSR FLAG_ESPERAR

MOVE.B #$01,BYTE_DATA

BSR ENABLE_LCD

RTS

*----------------------------------------------------------------------------*

************************** RETURN_HOME *****************************

* Devuelve el cursor a la primera posición conservando el conteni- *

* de la memoria del display. *

********************************************************************

39
RETURN_HOME

BSR FLAG_ESPERAR

MOVE.B #$02,BYTE_DATA

BSR ENABLE_LCD

RTS

*----------------------------------------------------------------------------*

*************************** CURS_IZQ ******************************

* Mueve el cursor a la izquierda sin modificar el texto. *

*******************************************************************

CURS_IZQ

BSR FLAG_ESPERAR

MOVE.B #$10,BYTE_DATA

BSR ENABLE_LCD
RTS

*----------------------------------------------------------------------------*

*************************** CURS_DCHA *****************************

* Mueve el cursor a la derecha sin modificar el texto. *

*******************************************************************

CURS_DCHA

BSR FLAG_ESPERAR

MOVE.B #$14,BYTE_DATA

BSR ENABLE_LCD

RTS

*----------------------------------------------------------------------------*

*************************** DISP_IZQ ******************************

* Desplaza la ventana del display hacia la izquierda. *

*******************************************************************

DISP_IZQ

BSR FLAG_ESPERAR

MOVE.B #$1C,BYTE_DATA

BSR ENABLE_LCD

RTS

*************************** DISP_DCHA *****************************

* Desplaza la ventana del display hacia la derecha. *

*******************************************************************

DISP_DCHA

40
BSR FLAG_ESPERAR

MOVE.B #$18,BYTE_DATA

BSR ENABLE_LCD

RTS

*----------------------------------------------------------------------------*

************************** CGRAM_ADDR *****************************

* Coloca la dirección indicada en D0 en el contador de la Memoria *

* del Generador de Caracteres (CGRAM). Este generador permite de- *

* finir 8 caracteres de usuario en el modo 5x8 y cuatro en el de *

* 5x10 puntos. Para un correcto uso de la instrucción deberemos *

* escribir una de las 64 direcciones posibles (de $00 a $3F)en D0 *

*******************************************************************

CGRAM_ADDR
BSR FLAG_ESPERAR

ADD.B #$40,D0

MOVE.B D0,BYTE_DATA

BSET.B #BIT_RS,BYTE_CONTROL

BSR ENABLE_LCD

BCLR.B #BIT_RS,BYTE_CONTROL

RTS

*----------------------------------------------------------------------------*

************************** DDRAM_ADDR *****************************

* Coloca la dirección indicada en D0 en el contador de la Memoria *

* de Datos del Display (DDRAM). Existen 80 posiciones disponibles *

* que ser n consecutivas cuando el display trabaje en una única *

* línea o repartidas en dos grupos de 40 cuando trabaje en el *

* modo de dos líneas. *

* V‚ase detalle a continuación: *

* - 80 posiciones x 1 línea - las direcciones van de $0 a $4F. *

* - 40 posiciones x 2 líneas - las direcciones se reparten: *

* Línea primera: de $00 a $27. *

* Línea segunda: de $40 a $67. *

*******************************************************************

DDRAM_ADDR

BSR FLAG_ESPERAR

ADD.B #$80,D0

MOVE.B D0,BYTE_DATA

41
BSET.B #BIT_RS,BYTE_CONTROL

BSR ENABLE_LCD

BCLR.B #BIT_RS,BYTE_CONTROL

RTS

*----------------------------------------------------------------------------*

*************************** ESCRIBIR ******************************

* Esta instrucción permite escribir en el registro de datos (DR) *

* una palabra destinada al generador de caracteres (CGRAM) o al *

* de datos del display (DDRAM) dependiendo de cual fue la última *

* selección. El dato a escribir lo pondremos en el registro D0. *

*******************************************************************

ESCRIBIR

BSR FLAG_ESPERAR
MOVE.B D0,BYTE_DATA

BSET.B #BIT_RS,BYTE_CONTROL

BSR ENABLE_LCD

BCLR.B #BIT_RS,BYTE_CONTROL

RTS

*----------------------------------------------------------------------------*

******************************************************************************

* RUTINAS DE INICIALIZACIÓN DE DISPOSITIVOS *

******************************************************************************

**************************** INI_LCD ******************************

* Esta rutina realiza toda la inicialización del display tras el *

* encendido del mismo. Después de su ejecución el display queda *

* preparado para recibir instrucciones y caracteres. *

*******************************************************************

INI_LCD:

BSR CFG_DISPLAY

BSR MODO_NORMAL

BSR CLEAR

RTS

*----------------------------------------------------------------------------*

******************************************************************************

* SERVICIOS DE DISPOSITIVOS *

******************************************************************************

******************************************************************************

42
* SERVICIOS DEL DISPLAY *

******************************************************************************

************************** ESCR_MENSAJE ***************************

* Esta rutina escribe un mensaje completo en el display cuya di- *

* rección de inicio se indica a través del registro A0, debiendo *

* terminar el mensaje con $00. Si es superior a los 16 caracteres *

* que tiene el LCD, al alcanzar el final de la línea automática- *

* mente se cambia del modo AVC al AVT en el que el display acom- *

* paña al cursor dando la sensación de que el texto se desplaza. *

*******************************************************************

ESCR_MENSAJE

MOVEM.L D0-D1,-(A7)

BSR RETURN_HOME

BSR MODO_AVC
MOVE.B #LCD_LONG,D1 * Cuenta los caracteres escritos en el display.

BUCLE1

TST.B (A0)

BEQ FIN1

MOVE.B (A0)+,D0

BSR ESCRIBIR

SUB.B #1,D1

BEQ FIN_LIN1

BRA BUCLE1

FIN_LIN1

BSR MODO_AVT * Cambia al modo AVT para que el display acompañe al cursor.

BRA BUCLE1

FIN1

MOVEM.L (A7)+,D0-D1

RTS

*----------------------------------------------------------------------------*

*************************** DSP_ADELANTE **************************

* Esta rutina desplaza hacia la derecha la pantalla del display *

* recorriendo las 80 posiciones del registro DDRAM. *

*******************************************************************

DSP_ADELANTE

MOVEM.L D0-D1,-(A7)

MOVE.B #FIN_DR,D0 * Cuenta los caracteres escritos en el display.

BUCLE2

43
BSR DISP_DCHA

MOVE.L #RETARDO,D1

BSR DELAY

SUB.B #1,D0

BNE BUCLE2

MOVEM.L (A7)+,D0-D1

RTS

*----------------------------------------------------------------------------*

**************************** DSP_ATRAS ****************************

* Esta rutina desplaza hacia la izquierda la pantalla del display *

* recorriendo las 80 posiciones del registro DDRAM. *

*******************************************************************

DSP_ATRAS
MOVEM.L D0-D1,-(A7)

MOVE.B #FIN_DR,D0 * Cuenta los caracteres escritos en el display.

BUCLE3

BSR DISP_IZQ

MOVE.L #RETARDO,D1

BSR DELAY

SUB.B #1,D0

BNE BUCLE3

MOVEM.L (A7)+,D0-D1

RTS

*----------------------------------------------------------------------------*

************************** DRIVER_DISPLAY *************************

* Esta rutina realiza el servicio indicado a través del registro *

* D7 con un número ordinal. Para llamar a la rutina de servicio *

* se coloca el número de servicio en el registro D7 y se ejecuta *

* un TRAP #0. *

*******************************************************************

DRIVER_DISPLAY

MOVEM.L D0-D1,-(A7)

CMP.B #1,D7

BEQ SERVICIO1

CMP.B #2,D7

BEQ SERVICIO2

CMP.B #3,D7

44
BEQ SERVICIO3

BRA FIN

SERVICIO1

BSR ESCR_MENSAJE

BRA FIN

SERVICIO2

BSR DSP_ADELANTE

BRA FIN

SERVICIO3

BSR DSP_ATRAS

FIN

MOVEM.L (A7)+,D0-D1

RTE

*----------------------------------------------------------------------------*

******************************** PRINCIPAL ***********************************

* El programa en cuestión muestra en el display de forma secuencial la lista *

* de mensajes definidos. Para la escritura utiliza el servicio de escritura *

* de mensajes del driver a través de TRAP #0. *

******************************************************************************

ORG $400

PRINCIPAL

BSR INHAB_WDOG

BSR PORT_EC_CFG

BSR INI_LCD

INIC_D0

MOVEA.W #MENSAJES,A6

MOVE.L #$B,D0

LOOP1

BSR CLEAR

MOVEA.L (A6)+,A0

MOVE.L #1,D7

TRAP #0

MOVE.L #LARGO,D1

BSR DELAY

SUBI.B #1,D0

BEQ INIC_D0

BRA LOOP1

END

45
3.4 Anexo I

A continuación se adjuntan copias de los juegos de caracteres predefinidos extraídos del


catalogo original del controlador HD44780U de Hitachi.

Esta primera tabla contiene patrones de caracteres de 5 x10 puntos.


Figura 6 – Correspondencia entre códigos y caracteres (Extraído del catálogo de HITACHI).

46
Esta otra contiene los patrones de caracteres de 5 x 8 puntos, que es además la que se
usará en el ejemplo de estas páginas.

 Figura 7 – Correspondencia entre códigos y caracteres (Extraído del catálogo de HITACHI).

47
ÍNDICE DE CONTENIDO

3. CONTROL DE UN DISPLAY LCD DE MODO TEXTO.......................................1

3.1 DESCRIPCIÓN GENERAL.............................................................................................................1

3.2 FUNCIONAMIENTO DEL DISPLAY.............................................................................................2

3.2.1 ALIMENTACIÓN Y CONTROL DE CONTRASTE...............................................................................3


3.2.2 LA PANTALLA Y LOS CARACTERES..............................................................................................3
3.2.3 LA MEMORIA DEL “DISPLAY”.......................................................................................................4
3.2.3.1 Display Data RAM (DDRAM)...............................................................................................4
3.2.3.2 Character Generator RAM (CGRAM)..................................................................................5
3.2.4 SEÑALES DE CONTROL Y REGISTROS INTERNOS..........................................................................7
3.2.4.1 Señales de control..................................................................................................................7
3.2.4.2 Registros internos..................................................................................................................8
3.2.5 CONJUNTO DE INSTRUCCIONES...................................................................................................9
3.2.5.1 Borrar display, “Clear Display”...........................................................................................9
3.2.5.2 Cursor a inicio, “Return Home”...........................................................................................9
3.2.5.3 Establecer modo de trabajo, “Entry Mode Set”.................................................................10
3.2.5.4 Control ON/OFF del display...............................................................................................10
3.2.5.5 Desplazamiento del cursor o display..................................................................................10
3.2.5.6 Establecer modo de interfaz, “Function Set”......................................................................11
3.2.5.7 Fijar dirección de CGRAM..................................................................................................11
3.2.5.8 Fijar dirección de DDRAM.................................................................................................12
3.2.5.9 Escritura de datos en la CGRAM o DDRAM......................................................................12
3.2.5.10 Lectura de datos de la CGRAM o DDRAM....................................................................12
3.2.6 SECUENCIA TÍPICA DE INICIALIZACIÓN DEL LCD.....................................................................12
3.2.7 FORMAS DE CONEXIÓN A UN MICROCONTROLADOR.................................................................13
3.2.7.1 Longitud del bus de datos....................................................................................................13
3.2.7.2 Modos de control del LCD..................................................................................................14

3.3 EJEMPLOS DE CONTROL DEL LCD CON EL MICRO MC68331.......................................15

3.3.1 EJEMPLO DE CONTROL EN BUCLE ABIERTO...............................................................................15


3.3.1.1 Descripción de la aplicación de control..............................................................................15
3.3.1.2 Descripción de la conexión y modo de control...................................................................16
3.3.1.3 Implementación en código ensamblador del programa de control.....................................16
3.3.1.3.1 Observaciones sobre el ajuste de parámetros..........................................................................30
3.3.1.3.1.1 Ajuste de la señal de activación, “Enable”.........................................................................30
3.3.2 EJEMPLO DE CONTROL EN BUCLE CERRADO.............................................................................31
3.3.2.1 Descripción de la aplicación de control..............................................................................31

I
3.3.2.2 Descripción de la conexión y modo de control...................................................................31
3.3.2.3 Implementación en código ensamblador del programa de control.....................................32

3.4 ANEXO I...........................................................................................................................................46

II

También podría gustarte