Ensamblador 2: LCD en modo 4 bits

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:

  1. 15 ms
  2. 40 ms
  3. 5 ms
  4. 4.1 ms
  5. 100 us
  6. 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:

Imagen2. 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:

  1. Funcion set x4
  2. Función set
  3. Función display
  4. Función clear
  5. Función mode set
  6. DDRAM Access
  7. 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

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
Menú