Interfaz LCD HD44780 con el Z80

Anuncio
25/11/2011
Interfaz PIO con LCD
Interfaz LCD HD44780 con el Z80
Interfaz con uso de Busy Flag
2
Configuración de Terminales
1.
2.
3.
4.
Ground
VCC (+3.3 to +5V)
Contrast adjustment (VO)
Register Select (RS). RS=0:
Command, RS=1: Data
5. Read/Write (R/W). R/W=0:
Write, R/W=1: Read
6. Clock (Enable). Falling edge
triggered
7. Bit 0 (Not used in 4-bit operation)
8. Bit 1 (Not used in 4-bit operation)
9. Bit 2 (Not used in 4-bit operation)
10.Bit 3 (Not used in 4-bit operation)
11.Bit 4
12.Bit 5
13.Bit 6
14.Bit 7
15.Backlight Anode (+)
16.Backlight Cathode (-)
Rutina de Inicialización
Encender
LCD
Esperar 1.5 ms
después de que
Vdd llega a 4.5V
Enviar
código de
INICIO
0011XXXX
Repetir
código de
INICIO
Esperar por mas
de 4.1 ms
Repetir
código de
INICIO
El código de
inicio indica que
la interfaz se
establece a 8 bits
Esperar 100s
Inicializar
LCD
Apagar y prender
el display
Limpiar pantalla
BF no puede
probarse en este
punto
Establecer modo
de Escritura
3
4
Comunicándose con LCD
• LCD tiene un bus de
datos de 8 bits (pin 714) por el cual se
transfiere el código
ASCII a escribirse
• Se utilizan 3 señales de
control:
1.
2.
3.
– Selección de Registro
(RS)
– Escritura/Lectura (R/W)
– Habilitación de Reloj (CE)
5
LCD HD44780
RS=0: Instrucción, RS=1: Dato
R/W=0: Escritura, R/W=1: Lectura
CE = 1 habilita, CE = 0, deshabilitado
Selección
de Registro
RS = 0,
setup
Escritura
RW = 1
Habilita
intercambio
CE = 1
Envió de
datos
Envió de
código ASCII
Deshabilita
Intercambio
CE = 0
RS = 1, dato
• Rutina de inicialización
– Escribir el código 0011XXXX
– Checar BF, cuando este en bajo enviar nuevamente el
código 0011XXXX
– Checar BF, cuando este en bajo enviar nuevamente el
código 0011XXXX
– Establecer el tipo de funcionalidad del LCD
– Apagar el cursor y la pantalla
– Limpiar la pantalla
– Establecer el modo de entrada
– Encender el cursor y pantalla
6
1
25/11/2011
Function Set
Apagar Pantalla
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
0
0
0
0
1
DL
N
F
X
X
0
0
0
0
0
0
1
D
C
B
DL
= 1, Los datos son enviados en 8 bits
= 0; Los datos son enviados en 4 bits, dos lecturas por cada carácter
N
Establece el numero de líneas de la pantalla
F
Establece el tamaño del carácter.
N
F
Numero de
Lineas
Tamaño del
Carácter
Duty
Factor
0
0
1
5×7 puntos
1/8
0
1
1
5×10 puntos
1/11
1
X
2
5×7 puntos
1/8
0
0
0
0
1
1
1
0
0
0
38H
D
= 1, Pantalla Encendida
= 0; Pantalla Apagada, los datos permanecen en la RAM interna para
desplegarse en cuanto la pantalla se encienda
C
=1, despliega el cursor, = 0, apaga el cursor
B
=1, el cursos destella, = 0, el cursor permanece encendido todo el tiempo
RS
R/
W
D7
D6
D5
D4
D3
D2
D1
D0
0
0
0
0
0
0
1
0
0
0
pantalla y cursor
apagados
0
0
0
0
0
0
1
1
1
1
Pantalla y cursor
encendido y
cursor destellando
7
8
SETUP:
RS
; Escribe al registro de control A
LD A,0FH
; Configurar el puerto B como salida
D3
OUT (CTRLB),A
; Escribe al registro de control B
LD A,00110000B
; código para establecer comunicación con LCD
0
0
0
0
0
0
0
0
0
1
Limpiar pantalla
LD B,A
0
0
0
0
0
0
0
0
1
X
Regresar el cursor a la primer
columna de la pantalla
CALL OUTPUT
; envía el código a LCD
CALL CMDOUT
; reenvía el código a LCD
1/D=1 incrementa la posición del
cursor hacia la derecha
1/D = 0 decrementa la posición del
cursor hacia la izquierda
S = 1 mueve todo el display hacia la
derecha si I/D = 1 o hacia la
izquierda si I/D = 0.
CALL CMDOUT
; reenvía el código a LCD
LD A, 00111000B
; establece 8 bits, 2 líneas y 5X7 caracteres
0
0
0
D4
Comandos
D7
0
D5
; Configurar el puerto A como SALIDA
OUT (CTRLA),A
R/
W
0
D6
LD A,0FH
0
0
D2
1
D1
1/D
D0
S
CALL CMDOUT
LD A,00001000B
; apaga pantalla y cursor
CALL CMDOUT
LD A,00000001B
;limpia pantalla
CALL CMDOUT
LD A,00000110B
; modo de entrada, corre e incrementa cursor
CALL CMDOUT
LD A,00001100B
; enciende pantalla y cursor
CALL CMDOUT
RET
9
Checa la bandera (BF)
CHKDB7:
Escritura de comando en la LCD
LD A, 4FH
CMDOUT:
OUT (CNTRLA),A
LD A, 00000000B
OUTPUT:
LD A, 00000101B
LD A, 00000000B
; RS = 0
OUT (PORTB),A
RS = 0, R/W = 1
LD A, 00000000B
OUT (PORTB),A
READ:
LD B, A
CALL CHKDB7
RS = 0
OUT (PORTB),A
LD A, 00000100B
10
; R/W = 0
OUT (PORTB),A
RS = 0, R/W = 1, CE = 1
OUT (PORTB),A
LD A, 00000001B
IN A,(PORTA)
OUT (PORTB),A
RLCA
LD A,B
LD A, 00000000B
OUT (PORTA),A
OUT (PORTB),A
LD A, 00000000B
JP C, READ
OUT (PORTB),A
LD A, 0FH
RET
; EN = 1
OUT (CNTRLA),A
RET
11
12
2
25/11/2011
Escritura de DATOS en la LCD
DTAOUT:
Programa para controlar LCD
LD B, A
PORTA
EQU
CALL CHKDB7
PORTB
EQU
81H
CTRLA
EQU
82H
CTRLB
EQU
83H
STACK
EQU
1EFEH
LD A, 00000010B
; RS = 1
OUT (PORTB),A
LD A, 00000010B
; R/W = 0
MESSAGE
OUT (PORTB),A
LD A, 00000011B
80H
.DEFB 48H,45H,4CH,4CH,4FH,00
; EN = 1
.ORG 1850H
OUT (PORTB),A
START:
LD A,B
LD SP, STACK
OUT (PORTA),A
CALL SETUP
LD A, 00000000B
LD A,87H
OUT (PORTB),A
CALL CMDOUT
RET
LD HL, MESSAGE
13
14
Programa para controlar LCD
NEXT:
LD A,(HL)
CP 00
JP Z,END
CALL DTAOUT
INC HL
JP NEXT
END
HALT
Microprocesadores 2011
INTERFAZ CON USO DE RETARDOS
15
Subrutina Retardo
DELAY:
; Esta subrutina realiza un retardo de 10 ms. El retardo es repetido el
; numero de veces indicado en B.
; Entrada: Numero de veces a repetir el retardo especificado en B
; Salida: Ninguna
; Registros Modificados: B
PUSH DE
11 ; guarda el contenido de DE y AF
PUSH AF
11
WAIT:
LD
DE, COUNT
10 ; Carga DE =01F2 para obtener el retardo
LOOP:
DEC
DE
6
;de 10ms
LD
A,D
9
; Coloca D en A para checar banderas
OR
E
4
; Prende bandera del cero si D=E=0
JP
NZ,LOOP
10 ; Repite hasta si DE >0
DEC
B
4
; Decrementa B
JR
NZ,WAIT
7
; Si el retardo es suficiente termina
POP
AF
10 ; Restablece el valor de DE y AF
POP
DE
10
RET
10
18
3
25/11/2011
Retardo
•
•
•
•
•
SETUP:
Total de estados-t
LT = 40
TC = 0.5s
Ttotal = 10ms
L0 = 68
LOOP:
LD A,0FH
; Configurar el puerto A como SALIDA
OUT (CTRLA),A
; Escribe al registro de control A
LD A,0FH
; Configurar el puerto B como salida
OUT (CTRLB),A
; Escribe al registro de control B
LD B,10
; Espera por 0.1 segundos
CALL DELAY
; Retardo de 10 ms
DJNZ LOOP
3
T
L
10 10
68
N10  total  0 
  498.3  1F 2
TC  LT LT 0.5 106  40 40
LD A,00110000B
; código para establecer comunicación con LCD
CALL CMDOUT
; envía el código a LCD
CALL DELAY
; espera por 10ms
CALL CMDOUT
; reenvía el código a LCD
CALL DELAY
;espera por 10ms
CALL CMDOUT
; reenvía el código a LCD
CALL DELAY
;espera por 10ms
20
LD A, 00111000B
; establece 8 bits, 2 líneas y 5X7 caracteres
Escritura de comando en la LCD
CALL CMDOUT
CALL DELAY
;espera por 10ms
LD A,00001000B
; apaga pantalla y cursor
CMDOUT:
CALL CMDOUT
CALL DELAY
;espera por 10ms
LD A,00000001B
;limpia pantalla
LD A, 00000000B
LD A, 00000000B
;espera por 10ms
LD A,00000110B
; modo de entrada, corre e incrementa cursor
LD A, 00000001B
; enciende pantalla y cursor
LD A,B
; Enviar comando a escribir
OUT (PORTA),A
LD A, 00000000B
CALL CMDOUT
CALL DELAY
; EN = 1 habilitar LCD
OUT (PORTB),A
CALL CMDOUT
;espera por 10ms
; R/W = 0 escribir
OUT (PORTB),A
CALL DELAY
LD A,00001100B
; RS = 0 comando
OUT (PORTB),A
CALL CMDOUT
CALL DELAY
LD B, A
; Deshabilitar LCD
OUT (PORTB),A
;espera por 10ms
RET
RET
21
22
Escritura de DATOS en la LCD
DTAOUT:
Programa para controlar LCD
LD B, A
LD A, 00000010B
; RS = 1 Datos
OUT (PORTB),A
LD A, 00000010B
; R/W = 0 Escribir
MESSAGE
OUT (PORTB),A
LD A, 00000011B
EQU
80H
81H
CTRLA
EQU
82H
CTRLB
EQU
83H
STACK
EQU
1EFEH
.DEFB 48H,45H,4CH,4CH,4FH,00
.ORG 1850H
START:
; Enviar dato
OUT (PORTA),A
LD A, 00000000B
EQU
PORTB
; EN = 1 Habilitar LCD
OUT (PORTB),A
LD A,B
PORTA
; Deshabilitar LCD
LD SP, STACK
; Definir pila
CALL SETUP
; Inicializar LCD
LD A,87H
; Iniciar escritura en la posición 8
OUT (PORTB),A
CALL CMDOUT
RET
CALL DELAY
LD HL, MESSAGE
23
24
4
25/11/2011
Programa para controlar LCD
NEXT:
LD A,(HL)
; Tomar el siguiente carácter
CP 00
; Verificar si es el fin de la cadena
JP Z,END
CALL DTAOUT
; Enviar carácter a la LCD
CALL DELAY
; Esperar 10 ms
INC HL
; Apuntar al siguiente carcter
JP NEXT
END
HALT
25
5
Descargar