Envío Gratis en compras mínimas de $1200 mxn Enviamos a toda la Republica Mexicana
Buscar

Ensamblador 2: LCD en modo 4 bits (Miuva Pro)

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.

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:

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