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
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'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
FUNCIONAMIENTO
