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 100s 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.5s 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 106 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