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.
PORTE1 -> RS
PORTE2 -> RW
PORTE3 -> E
PORTE4 -> DB4
PORTE5 -> DB5
PORTE6 -> DB6
PORTE7 -> DB7
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
Observamos que se carga el valor necesario a los pines de la LCD y posteriormente se lee la información cargada poniendo E en alto y después en bajo, el tiempo que debe de durar en alto será de 100us.
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'00110000' movwf PORTE bsf LCD_EN ;Activa el bit de ENABLE call Retardo100us bcf LCD_EN ;Lee Function set call Retardo4_1ms ;Function set movlw b'00110000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN ;Lee Function set call Retardo100us ;Function set movlw b'00110000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN ;Lee Function set call Retardo4_1ms ;Function set movlw b'00100000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN ;Lee Function set call Retardo4_1ms ;Function set movlw b'00100000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms movlw b'11100000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms ;Display off movlw b'00000000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms movlw b'10000000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms ;Display clear movlw b'00000000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms movlw b'00010000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms ;Entry mode set movlw b'00000000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms movlw b'01100000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms ;DDRAM ACCES movlw b'10000000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms movlw b'00000000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms ;Display on movlw b'00000000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms movlw b'11000000' movwf PORTE 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.
Con esto entonces ya podemos inicializar la LCD y escribir un caracter, para esto se usa el siguiente código:
LIST P = 18F87J50 ;PIC a utilizar INCLUDE <P18F87J50.INC> ;************************************************************ ;Configuración de fusibles CONFIG FOSC = HS CONFIG DEBUG = OFF CONFIG XINST = OFF ;*************************************************** ;Ubicación de los pines de EN y RS en Miuva #define LCD_EN PORTE,3 #define LCD_RS PORTE,1 #define LCD_RW PORTE,2 CBLOCK NIBBLE ;Variable para escribir en la LCD Ret1 ;Variables para crear retardos Ret2 ENDC ORG 0x00 ;Iniciar el programa en el registro 0x00 movlw 0x00 movwf TRISE ;Configurar puerto D como salida bcf LCD_RW LCD_Init bcf LCD_EN ;Enable = LOW call Retardo15ms bcf LCD_RS ;RS = LOW ;Inicia secuencia de inicialización ;Function set movlw b'00110000' movwf PORTE bsf LCD_EN ;Activa el bit de ENABLE call Retardo100us bcf LCD_EN ;Lee Function set call Retardo4_1ms ;Function set movlw b'00110000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN ;Lee Function set call Retardo100us ;Function set movlw b'00110000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN ;Lee Function set call Retardo4_1ms ;Function set movlw b'00100000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN ;Lee Function set call Retardo4_1ms ;Function set movlw b'00100000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms movlw b'11100000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms ;Display off movlw b'00000000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms movlw b'10000000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms ;Display clear movlw b'00000000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms movlw b'00010000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms ;Entry mode set movlw b'00000000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms movlw b'01100000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms ;DDRAM ACCES movlw b'10000000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms movlw b'00000000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms ;Display on movlw b'00000000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms movlw b'11000000' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms ;MANDAR LETRA I bsf LCD_RS ; movlw b'00100100' movlw b'01000010' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms ; movlw b'00101001' movlw b'10010010' movwf PORTE bsf LCD_EN call Retardo100us bcf LCD_EN call Retardo4_1ms BUCLE goto BUCLE Retardo15ms movlw .255 movwf Ret1 movlw .40 movwf Ret2 Ret15ms decfsz Ret1, F bra Ret15ms decfsz Ret2, F bra Ret15ms return Retardo40ms movlw .255 movwf Ret1 movlw .105 movwf Ret2 Ret40ms decfsz Ret1, F bra Ret15ms decfsz Ret2, F bra Ret15ms return Retardo5ms movlw .255 movwf Ret1 movlw .14 movwf Ret2 Ret5ms decfsz Ret1,F bra Ret5ms decfsz Ret2,F bra Ret5ms return Retardo4_1ms movlw .255 movwf Ret1 movlw .11 movwf Ret2 Ret4_1ms decfsz Ret1, F bra Ret15ms decfsz Ret2, F bra Ret15ms return Retardo100us movlw .67 movwf Ret1 Ret100us decfsz Ret1, F return Retardo40us movlw .27 movwf Ret1 Ret40us decfsz Ret1,F return END