Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Control de Un Display LCD
Control de Un Display LCD
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.
1
Figura 1 - Aspecto general de un “display”.
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.
2
controla con las tres líneas de control (RS, R/W y E) conforme al cronograma del
dispositivo.
2. Regular el contraste.
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
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.
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.
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 4 – Display virtual y pantalla LCD.
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).
7
Figura 5 – Ejemplo de cronograma de las señales de control. (Extraído del catálogo de Hitachi).
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.
CÓDIGO: $01
CÓDIGO: $02
9
3.2.5.3 Establecer modo de trabajo, “Entry Mode Set”
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.
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.
CÓDIGO: 0 0 1 DL N F 0 0
CÓDIGO: 0 1 A5 A4 A3 A2 A1 A0
11
3.2.5.8 Fijar dirección de DDRAM
CÓDIGO: 1 A6 A5 A4 A3 A2 A1 A0
CÓDIGO: 1 0 D D D D D D D D
CÓDIGO: 1 1 D D D D D D D D
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).
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
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. 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.
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.
******************************************************************************
* REGISTROS SIM *
******************************************************************************
SYNCR EQU $FFFA04 * Fija frecuencia y modo de operación del reloj ($3F08).
16
PEPAR EQU $FFFA17 * Asignación del puerto E (Puerto o control de BUS).
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.).
******************************************************************************
* REGISTROS GPT-PWM *
******************************************************************************
OC1M EQU $FFF908 * Máscara para asignar los pin de captura de 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.
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).
TCTL2 EQU $FFF91F * Configura que flanco provoca la captura en los IC.
TMSK2 EQU $FFF921 * Habilita las interrupciones del PAI y del TIMER.
17
TFLG2 EQU $FFF923 * Registro de flags de interrupciones del PAI y TIMER
PWMBUFA EQU $FFF92A * Buffer para prevenir glitches cuando modificamos PWMA.
PWMBUFB EQU $FFF92B * Buffer para prevenir glitches cuando modificamos PWMB.
******************************************************************************
* TIPOS DE RETARDO *
******************************************************************************
******************************************************************************
* CONSTANTES DE INTERÉS *
******************************************************************************
******************************************************************************
******************************************************************************
18
******************************************************************************
******************************************************************************
ORG $0
******************************************************************************
* VECTORES DE INTERRUPCIÓN *
******************************************************************************
ORG $80
******************************************************************************
* PUNTERO DE PILA *
******************************************************************************
ORG $4000
FIN_PILA:
******************************************************************************
* LISTA DE MENSAJES *
******************************************************************************
ORG $2000
MENSAJES DC.L MENS1,MENS2,MENS3
******************************************************************************
* SUBRUTINAS *
******************************************************************************
ORG $1000
******************************************************************************
******************************************************************************
19
*************************** INHAB_WDOG ****************************
*******************************************************************
INHAB_WDOG:
RTS
*----------------------------------------------------------------------------*
* Con esta rutina se configuran los puertos E y C que son los que *
*******************************************************************
PORT_EC_CFG
MOVE.B #$00,PORTE
MOVE.B #$0F,PORTC
RTS
*----------------------------------------------------------------------------*
******************************************************************************
* RUTINAS DE CONTROL *
******************************************************************************
*******************************************************************
DELAY
SUB.L #1,D1
BNE DELAY
RTS
*----------------------------------------------------------------------------*
*******************************************************************
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 *
******************************************************************************
* 2 - 1 o 2 líneas en pantalla. *
CFG_DISPLAY
BSR TOGGLE
RTS
*----------------------------------------------------------------------------*
*******************************************************************
21
MODO_AVC
BSR TOGGLE
RTS
*----------------------------------------------------------------------------*
*******************************************************************
MODO_AVT
BSR TOGGLE
RTS
*----------------------------------------------------------------------------*
*******************************************************************
MODO_RTC
RTS
*----------------------------------------------------------------------------*
*******************************************************************
MODO_RTT
BSR TOGGLE
RTS
*----------------------------------------------------------------------------*
22
************************** MODO_NORMAL ****************************
*******************************************************************
MODO_NORMAL
BSR TOGGLE
RTS
*----------------------------------------------------------------------------*
* el LCD. *
*******************************************************************
MODO_OFF
RTS
*----------------------------------------------------------------------------*
*******************************************************************
CLEAR
MOVE.B #$01,BYTE_DATA
BSR TOGGLE
RTS
*----------------------------------------------------------------------------*
23
************************** RETURN_HOME *****************************
********************************************************************
RETURN_HOME
MOVE.B #$02,BYTE_DATA
BSR TOGGLE
RTS
*----------------------------------------------------------------------------*
*******************************************************************
CURS_IZQ
MOVE.B #$10,BYTE_DATA
BSR TOGGLE
RTS
*----------------------------------------------------------------------------*
CURS_DCHA
MOVE.B #$14,BYTE_DATA
BSR TOGGLE
RTS
*----------------------------------------------------------------------------*
*******************************************************************
DISP_IZQ
MOVE.B #$1C,BYTE_DATA
BSR TOGGLE
RTS
24
*************************** DISP_DCHA *****************************
*******************************************************************
DISP_DCHA
MOVE.B #$18,BYTE_DATA
BSR TOGGLE
RTS
*----------------------------------------------------------------------------*
* BYTE_DATA. *
*******************************************************************
CGRAM_ADDR
ADD.B #$40,BYTE_DATA
BSET.B #BIT_RS,BYTE_CONTROL
BSR TOGGLE
BCLR.B #BIT_RS,BYTE_CONTROL
RTS
*----------------------------------------------------------------------------*
*******************************************************************
25
DDRAM_ADDR
ADD.B #$80,BYTE_DATA
BSET.B #BIT_RS,BYTE_CONTROL
BSR TOGGLE
BCLR.B #BIT_RS,BYTE_CONTROL
RTS
*----------------------------------------------------------------------------*
*******************************************************************
ESCRIBIR
BSET.B #BIT_RS,BYTE_CONTROL
BSR TOGGLE
BCLR.B #BIT_RS,BYTE_CONTROL
RTS
*----------------------------------------------------------------------------*
******************************************************************************
* RUTINAS DE INICIALIZACIÓN DE DISPOSITIVOS *
******************************************************************************
*******************************************************************
INI_LCD
BSR CFG_DISPLAY
BSR MODO_NORMAL
BSR CLEAR
RTS
*----------------------------------------------------------------------------*
26
******************************************************************************
* SERVICIOS DE DISPOSITIVOS *
******************************************************************************
******************************************************************************
******************************************************************************
* samos a través del registro A0. El símbolo con que deber ter- *
* desplaza. *
*******************************************************************
ESCR_MENSAJE
MOVEM.L D0-D2,-(A7)
MOVE.L #LARGO,D2
BSR RETURN_HOME
MOVE.L #CORTO,D2
BSR MODO_AVC
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 **************************
*******************************************************************
DSP_ADELANTE
MOVEM.L D0-D1,-(A7)
BUCLE2
BSR DISP_DCHA
MOVE.L #RETARDO,D1
BSR DELAY
SUB.B #1,D0
BNE BUCLE2
MOVEM.L (A7)+,D0-D1
RTS
*----------------------------------------------------------------------------*
*******************************************************************
DSP_ATRAS
MOVEM.L D0-D1,-(A7)
BSR DISP_IZQ
MOVE.L #RETARDO,D1
BSR DELAY
SUB.B #1,D0
BNE BUCLE3
MOVEM.L (A7)+,D0-D1
RTS
*----------------------------------------------------------------------------*
* 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
Existen ciertos parámetros que ha sido necesario someterlos a un ajuste, como son los
retardos.
*******************************************************************
DELAY
SUB.L #1,D1
BNE DELAY
RTS
30
*----------------------------------------------------------------------------*
*******************************************************************
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.
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
******************************************************************************
* REGISTROS SIM *
******************************************************************************
SYNCR EQU $FFFA04 * Fija frecuencia y modo de operación del reloj ($3F08).
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.).
******************************************************************************
* REGISTROS GPT-PWM *
******************************************************************************
OC1M EQU $FFF908 * Máscara para asignar los pin de captura de OC.
TCNT EQU $FFF90A * Registro del GPT asociado a las capturas IC, OC y PAI.
32
PACNT EQU $FFF90D * Es el contador de registro de eventos del PAI.
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).
TCTL2 EQU $FFF91F * Configura que flanco provoca la captura en los IC.
TMSK2 EQU $FFF921 * Habilita las interrupciones del PAI y del TIMER.
PWMBUFA EQU $FFF92A * Buffer para prevenir glitches cuando modificamos PWMA.
PWMBUFB EQU $FFF92B * Buffer para prevenir glitches cuando modificamos PWMB.
******************************************************************************
* TIPOS DE RETARDO *
******************************************************************************
******************************************************************************
* CONSTANTES DE INTERÉS *
******************************************************************************
33
L2_FIN_DR EQU $67 * Fin de la segunda línea.
******************************************************************************
******************************************************************************
******************************************************************************
******************************************************************************
ORG $0
******************************************************************************
* VECTORES DE INTERRUPCIÓN *
******************************************************************************
ORG $80
******************************************************************************
* PUNTERO DE PILA *
******************************************************************************
ORG $4000
FIN_PILA:
******************************************************************************
* LISTA DE MENSAJES *
******************************************************************************
ORG $2000
34
MENSAJES DC.L
MENS1,MENS2,MENS3,MENS4,MENS5,MENS6,MENS7,MENS8,MENS9,MENS0,MENSLARGO
MENSLARGO DC.B 'ES UNA PRUEBA DE MENSAJE LARGO PARA VER QUE PASA',$00
******************************************************************************
* SUBRUTINAS *
******************************************************************************
ORG $1000
******************************************************************************
******************************************************************************
INHAB_WDOG:
RTS
*----------------------------------------------------------------------------*
* Con esta rutina se configuran los puertos E y C que son los que *
*******************************************************************
PORT_EC_CFG
35
MOVE.W #$0000,CSPAR1 * PC3-PC6 utilizables.
MOVE.B #$00,PORTE
MOVE.B #$0F,PORTC
RTS
*----------------------------------------------------------------------------*
******************************************************************************
* RUTINAS DE CONTROL *
******************************************************************************
*******************************************************************
DELAY
SUB.L #1,D1
BNE DELAY
RTS
*----------------------------------------------------------------------------*
*******************************************************************
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
*----------------------------------------------------------------------------*
*******************************************************************
36
ENABLE_LCD
BSET.B #BIT_ENABLE,BYTE_CONTROL
BCLR.B #BIT_ENABLE,BYTE_CONTROL
RTS
*----------------------------------------------------------------------------*
******************************************************************************
* INSTRUCCIONES LCD *
******************************************************************************
* 2 - 1 o 2 líneas en pantalla. *
*******************************************************************
CFG_DISPLAY
BSR FLAG_ESPERAR
RTS
*----------------------------------------------------------------------------*
*******************************************************************
MODO_AVC
BSR FLAG_ESPERAR
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
37
*************************** MODO_AVT ******************************
*******************************************************************
MODO_AVT
BSR FLAG_ESPERAR
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
*******************************************************************
MODO_RTC
BSR FLAG_ESPERAR
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
*******************************************************************
MODO_RTT
BSR FLAG_ESPERAR
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
38
*******************************************************************
MODO_NORMAL
BSR FLAG_ESPERAR
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
* el LCD. *
*******************************************************************
MODO_OFF
BSR FLAG_ESPERAR
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
*******************************************************************
CLEAR
BSR FLAG_ESPERAR
MOVE.B #$01,BYTE_DATA
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
********************************************************************
39
RETURN_HOME
BSR FLAG_ESPERAR
MOVE.B #$02,BYTE_DATA
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
*******************************************************************
CURS_IZQ
BSR FLAG_ESPERAR
MOVE.B #$10,BYTE_DATA
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
*******************************************************************
CURS_DCHA
BSR FLAG_ESPERAR
MOVE.B #$14,BYTE_DATA
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
*******************************************************************
DISP_IZQ
BSR FLAG_ESPERAR
MOVE.B #$1C,BYTE_DATA
BSR ENABLE_LCD
RTS
*******************************************************************
DISP_DCHA
40
BSR FLAG_ESPERAR
MOVE.B #$18,BYTE_DATA
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
*******************************************************************
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
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
BSR FLAG_ESPERAR
MOVE.B D0,BYTE_DATA
BSET.B #BIT_RS,BYTE_CONTROL
BSR ENABLE_LCD
BCLR.B #BIT_RS,BYTE_CONTROL
RTS
*----------------------------------------------------------------------------*
******************************************************************************
******************************************************************************
**************************** INI_LCD ******************************
*******************************************************************
INI_LCD:
BSR CFG_DISPLAY
BSR MODO_NORMAL
BSR CLEAR
RTS
*----------------------------------------------------------------------------*
******************************************************************************
* SERVICIOS DE DISPOSITIVOS *
******************************************************************************
******************************************************************************
42
* SERVICIOS DEL DISPLAY *
******************************************************************************
*******************************************************************
ESCR_MENSAJE
MOVEM.L D0-D1,-(A7)
BSR RETURN_HOME
BSR MODO_AVC
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
MOVEM.L D0-D1,-(A7)
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
MOVEM.L D0-D1,-(A7)
BUCLE3
BSR DISP_IZQ
MOVE.L #RETARDO,D1
BSR DELAY
SUB.B #1,D0
BNE BUCLE3
MOVEM.L (A7)+,D0-D1
RTS
*----------------------------------------------------------------------------*
* 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
*----------------------------------------------------------------------------*
******************************************************************************
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
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.
47
ÍNDICE DE CONTENIDO
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
II