Interfaz LCD HD44780 con el Z80 Interfaz con uso de Busy Flag Interfaz PIO con LCD 2 Interfaz 8255 conLCD 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 (-) 4 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 5 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) 6 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 LCD HD44780 • 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 7 Function Set RS R/W D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 0 1 DL N F X X 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 8 Apagar Pantalla RS R/W D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 0 0 0 1 D C B 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 1 Pantalla y cursor encendido y cursor destellando 0 0 0 0 0 0 1 1 1 9 Comandos RS R/ W D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 0 0 0 0 0 0 1 Limpiar pantalla 0 0 0 0 0 0 0 0 1 X Regresar el cursor a la primer columna de la pantalla 0 0 0 0 0 0 0 1 1/D S 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. 10 SETUP: 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 A,00110000B ; código para establecer comunicación con LCD LD B,A CALL OUTPUT ; envía el código a LCD CALL CMDOUT ; reenvía el código a LCD CALL CMDOUT ; reenvía el código a LCD LD A, 00111000B ; establece 8 bits, 2 líneas y 5X7 caracteres 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 11 Checa la bandera (BF) CHKDB7: LD A, 4FH OUT (CNTRLA),A LD A, 00000000B RS = 0 OUT (PORTB),A LD A, 00000100B RS = 0, R/W = 1 OUT (PORTB),A READ: LD A, 00000101B RS = 0, R/W = 1, CE = 1 OUT (PORTB),A IN A,(PORTA) RLCA LD A, 00000000B OUT (PORTB),A JP C, READ LD A, 0FH OUT (CNTRLA),A RET 12 Escritura de comando en la LCD CMDOUT: LD B, A CALL CHKDB7 OUTPUT: LD A, 00000000B ; RS = 0 OUT (PORTB),A LD A, 00000000B ; R/W = 0 OUT (PORTB),A LD A, 00000001B ; EN = 1 OUT (PORTB),A LD A,B OUT (PORTA),A LD A, 00000000B OUT (PORTB),A RET 13 Escritura de DATOS en la LCD DTAOUT: LD B, A CALL CHKDB7 LD A, 00000010B ; RS = 1 OUT (PORTB),A LD A, 00000010B ; R/W = 0 OUT (PORTB),A LD A, 00000011B ; EN = 1 OUT (PORTB),A LD A,B OUT (PORTA),A LD A, 00000000B OUT (PORTB),A RET 14 Programa para controlar LCD MESSAGE PORTA EQU 80H PORTB EQU 81H CTRLA EQU 82H CTRLB EQU 83H STACK EQU 1EFEH .DEFB 48H,45H,4CH,4CH,4FH,00 .ORG 1850H START: LD SP, STACK CALL SETUP LD A,87H CALL CMDOUT LD HL, MESSAGE 15 Programa para controlar LCD NEXT: LD A,(HL) CP 00 JP Z,END CALL DTAOUT INC HL JP NEXT END HALT 16 Microprocesadores 2011 INTERFAZ CON USO DE RETARDOS 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 19 Retardo • • • • • Total de estados-t LT = 40 TC = 0.5s Ttotal = 10ms L0 = 68 3 Ttotal L0 10 10 68 N10 498.3 1F 2 6 TC LT LT 0.5 10 40 40 SETUP: 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 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 21 LD A, 00111000B ; establece 8 bits, 2 líneas y 5X7 caracteres CALL CMDOUT CALL DELAY ;espera por 10ms LD A,00001000B ; apaga pantalla y cursor CALL CMDOUT CALL DELAY ;espera por 10ms LD A,00000001B ;limpia pantalla CALL CMDOUT CALL DELAY ;espera por 10ms LD A,00000110B ; modo de entrada, corre e incrementa cursor CALL CMDOUT CALL DELAY ;espera por 10ms LD A,00001100B ; enciende pantalla y cursor CALL CMDOUT CALL DELAY ;espera por 10ms RET 22 Escritura de comando en la LCD CMDOUT: LD B, A LD A, 00000000B ; RS = 0 comando OUT (PORTB),A LD A, 00000000B ; R/W = 0 escribir OUT (PORTB),A LD A, 00000001B ; EN = 1 habilitar LCD OUT (PORTB),A LD A,B ; Enviar comando a escribir OUT (PORTA),A LD A, 00000000B ; Deshabilitar LCD OUT (PORTB),A RET 23 Escritura de DATOS en la LCD DTAOUT: LD B, A LD A, 00000010B ; RS = 1 Datos OUT (PORTB),A LD A, 00000010B ; R/W = 0 Escribir OUT (PORTB),A LD A, 00000011B ; EN = 1 Habilitar LCD OUT (PORTB),A LD A,B ; Enviar dato OUT (PORTA),A LD A, 00000000B ; Deshabilitar LCD OUT (PORTB),A RET 24 Programa para controlar LCD MESSAGE PORTA EQU 80H PORTB EQU 81H CTRLA EQU 82H CTRLB EQU 83H STACK EQU 1EFEH .DEFB 48H,45H,4CH,4CH,4FH,00 .ORG 1850H START: LD SP, STACK ; Definir pila CALL SETUP ; Inicializar LCD LD A,87H ; Iniciar escritura en la posición 8 CALL CMDOUT CALL DELAY LD HL, MESSAGE 25 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 26