En esta ocasión vamos a inicializar una LCD de 2×16 en modo de 4 bits, y vamos a escribir un caracter en ella, para esto es importante entender como utilizamos los retardos en la práctica anterior, ya que necesitaremos diferentes tiempos para poder utilizar la LCD. Necesitaremos declarar retardos de los siguientes tiempos:
- 15 ms
- 40 ms
- 5 ms
- 4.1 ms
- 100 us
- 40 us
Podemos observar las conexiones de la tarjeta con el puerto designado para conectar la LCD.
PORTD4 -> EN
PORTD5 -> RS
PORTD0 -> D4
PORTD1 -> D5
PORTD2 -> D6
PORTD3 -> D7
Los forma de enviar información en modo de 4 bits la podemos ver en el siguiente diagrama:
Imagen 1. Ejemplo de envío de información en 4 bits
La secuencia de inicialización es:
- Funcion set x4
- Función set
- Función display
- Función clear
- Función mode set
- DDRAM Access
- Función display ON
Estas funciones se pueden encontrar más detalladas en las especificaciones de la LCD:
;Function set movlw b'00000011' movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms ;Función set movlw b'00000011' movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo100us ;Función set movlw b'00000011' movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms ;Función set movlw b'00000010' movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms ;Función set en configuración de 4 bits movlw b'00000010' movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms movlw b'00001110' movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms ;Función DISPLAY OFF movlw b'00000000' ;MSB Funcion display movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms movlw b'00001000' ;LSB Funcion display movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms ;Funcion DISPLAY CLEAR movlw b'00000000' ;MSB Funcion clear movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms movlw b'00000001' ;LSB Funcion clear movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms ;Funcion ENTRY MODE SET movlw b'00000000' ;MSB Funcion mode set movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms movlw b'00000110' ;LSB Funcion mode set movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms ;Función DDRAM ACCESS movlw b'00001000' ;MSB Funcion mode set movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms movlw b'00000000' ;LSB Funcion mode set movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms ;Función DISPLAY ON movlw b'00000000' ;MSB Display ON movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms movlw b'00001100' ;LSB Display ON movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms
Para enviar los caracteres aprovechamos que la localización en la memoria de la LCD es similar a los valores ASCII de los caracteres, por ejemplo, para enviar la letra “I”, su equivalente en ASCII es 0x49 = 0b 0010 1001, entonces primero enviaremos la parte más significativa y después la menos significativa:
Recordando las conexiones de Miuva, tenemos que enviar:
PD0 -> D4 -> 0
PD1 -> D5 -> 0
PD2 -> D6 -> 1
PD3 -> D7 -> 0
Y posteriormente
PD0 -> D4 -> 1
PD1 -> D5 -> 0
PD2 -> D6 -> 0
PD3 -> D7 -> 1
;MANDAR LETRA I bsf LCD_RS movlw b'00100100' movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms movlw b'00101001' movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms
CÓDIGO FINAL
Con esto entonces ya podemos inicializar la LCD y escribir un caracter, para esto se usa el siguiente código:
LIST P = 18F4550 ;PIC a utilizar INCLUDE <P18F4550.INC> ;************************************************************ ;Configuración de fusibles CONFIG FOSC = HS CONFIG PWRT = ON CONFIG BOR = OFF CONFIG WDT = OFF CONFIG MCLRE = ON CONFIG PBADEN = OFF CONFIG LVP = OFF CONFIG DEBUG = OFF CONFIG XINST = OFF ;*********************************************************** ;Código #define LCD_EN PORTD,4 ;Ubicación de pin EN en Miuva #define LCD_RS PORTD,5 ;Ubicación de pin RS en Miuva CBLOCK 0x000 Ret1 ;Variables para los retardos Ret2 ENDC ;Código ORG 0x0000 ;Vector de reset GOTO START START movlw 0x00 ;Puerto D como salida movwf TRISD ;INICIALIZACIÓN bcf LCD_EN call retardo15ms bcf LCD_RS ;Inicia secuencia de inicialización ;Función set movlw b'00000011' movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms ;Función set movlw b'00000011' movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo100us ;Función set movlw b'00000011' movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms ;Función set movlw b'00000010' movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms ;Función set en configuración de 4 bits movlw b'00000010' movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms movlw b'00001110' movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms ;Función DISPLAY OFF movlw b'00000000' ;MSB Funcion display movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms movlw b'00001000' ;LSB Funcion display movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms ;Funcion DISPLAY CLEAR movlw b'00000000' ;MSB Funcion clear movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms movlw b'00000001' ;LSB Funcion clear movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms ;Funcion ENTRY MODE SET movlw b'00000000' ;MSB Funcion mode set movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms movlw b'00000110' ;LSB Funcion mode set movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms ;Función DDRAM ACCESS movlw b'00001000' ;MSB Funcion mode set movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms movlw b'00000000' ;LSB Funcion mode set movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms ;Función DISPLAY ON movlw b'00000000' ;MSB Display ON movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms movlw b'00001100' ;LSB Display ON movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms ;MANDAR LETRA I bsf LCD_RS movlw b'00100100' movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms movlw b'00101001' movwf PORTD bsf LCD_EN call retardo100us bcf LCD_EN call retardo4_1ms BUCLE goto BUCLE ;FUNCIONES PARA LOS RETARDOS A DIFERENTES TIEMPOS retardo15ms movlw D'255' movwf Ret1 movlw D'40' movwf Ret2 retardo15msINICIO decfsz Ret1, F goto retardo15msINICIO decfsz Ret2, F goto retardo15msINICIO return retardo40ms movlw D'255' movwf Ret1 movlw D'105' movwf Ret2 retardo40msINICIO decfsz Ret1, F goto retardo40msINICIO decfsz Ret2, F goto retardo40msINICIO return retardo5ms movlw D'255' movwf Ret1 movlw D'14' movwf Ret2 retardo5msINICIO decfsz Ret1, F goto retardo5msINICIO decfsz Ret2, F goto retardo5msINICIO return retardo4_1ms movlw D'255' movwf Ret1 movlw D'11' movwf Ret2 retardo4_1msINICIO decfsz Ret1, F goto retardo4_1msINICIO decfsz Ret2, F goto retardo4_1msINICIO return retardo100us movlw D'67' movwf Ret1 retardo100usINICIO decfsz Ret1, F goto retardo100usINICIO return retardo40us movlw D'27' movwf Ret1 retardo40usINICIO decfsz Ret1, F goto retardo40usINICIO return END