Autor Tema: Inicialización LCD de 4 bits  (Leído 2406 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cereal2

  • PIC10
  • *
  • Mensajes: 26
Inicialización LCD de 4 bits
« en: 03 de Marzo de 2005, 10:01:00 »
Buenas, soy un novato y me gustaria empezar a usar el microcontrolador con un LCD. Dispongo de un LCD de 4 bits y la mayoria de codigos que veo por aqui y por internet son de 8 bits. Entonces hice yo mi propio código. Pero no me imprime el texto que quiero imprimir, o puede ser que ni lo inicializo bien. Aqui os pongo un sencillo código, para ver qué tengo de mal. Gracias!

include   "P16F877.inc"       ;se incluye la definicion de los
                                     ;registros internos


status       EQU        0x03
DATO_A       EQU        0x00
DATO_B       EQU        0x00


         org 0x00
         nop
         goto   MAIN

LCD_E
           bsf PORTA,2                   ;Activa señal E
           nop                           ;Espera
           nop
           nop
           nop
           bcf PORTA,2                   ;Desactiva señal E

           return
       
LCD_BUSY
           bsf PORTA,1                   ;Pone el LCD en modo lectura
           banksel TRISB                ;Selecciona el banco 1
           movlw 0xff
           movwf TRISB                ;Port B activo de entrada
           banksel PORTA               ;Selecciona el banco 0
           bsf PORTA,2        
L_BUSY     btfsc PORTB,7                 ;Chequea el bit busy
           goto L_BUSY                ;Está “1 " (ocupado)
           bcf PORTA,2                   ;Desactiva el LCD (señal E)
           banksel TRISB                ;Selecciona el banco 1
           clrf TRISB                 ;Port B activo de salida
           banksel PORTA          ;Selecciona el banco 0
           bcf PORTA,1                   ;Pone el LCD en modo escrita

           return
         
LCD_REG
           bcf PORTA,0                   ;Desactiva RS (modo instrucción)
           bcf PORTA,1                ; opcion escritura
           movwf PORTB                   ;Saca el código de instrucción
           call LCD_BUSY              ;Espera que se libere el LCD
           goto LCD_E                 ;Genera pulso en la señal E

           return
         
LCD_DATOS
           bsf PORTA,0                   ;Activa RS (modo instrucción)
           movwf PORTB        
           call LCD_BUSY               ;Espera que se libere el LCD
           bsf PORTA,0                   ;Activa RS (modo dato)
           goto LCD_E                 ;Genera pulso en la señal E

           return
         
LCD_PORT
          nop
          banksel TRISB          
          clrf TRISB                ;TRISB:=0
          movlw 0x38                ;RA0,RA1,RA2=salida RA3,RA4,RA5=entrada
          movwf TRISA
          banksel PORTA
          bcf PORTA,0               ;RS=0
          bcf PORTA,2       ;E=0
 
          return

LCD_INI
            movlw b"00101000"       ;function set=2 lineas, 5*7 dots y 4 bits
           call LCD_REG
           call DELAY_5MS
           movlw b"00001111"       ;display on, cursor on, cursor blinking
           call LCD_REG
           call DELAY_5MS
           movlw b"00000110"       ;incremento posicion y sin desplazamiento de display
           call LCD_REG
           call DELAY_5MS

           return
       
DELAY_5MS
           movlw 0x1A
           movwf DATO_B                ;Carga la variable DATO-B
           clrf DATO_A                 ;Carga la variable DATO-A
DELAY_1    decfsz DATO_A,1             ;Decrementa la variable DATO-A
           goto DELAY_1
           decfsz DATO_B,1             ;Decrementa la variable DATO-B
           goto DELAY_1

           return
       
MAIN
 
                                call LCD_PORT
      call LCD_INI
      movlw 0x04                ;parte alta de la letra H (como son 4 bits, he de enviar 2 veces)
      call LCD_DATOS
      movlw 0x08            
      call LCD_DATOS          ;parte baja de la letra H
pozo      nop
      goto pozo      

       END

De momento solo me interesa imprimir algo en la pantalla, mas adelante me gustaria que me imprimiera una frase que vaya corriendo el display.

Gracias!!!

Desconectado fer_zone

  • PIC12
  • **
  • Mensajes: 74
RE: Inicialización LCD de 4 bits
« Respuesta #1 en: 14 de Marzo de 2005, 20:10:00 »
Hola, realmente pusiste mucho esfuerzo en ese codigo, pero como suele pasar al principio, no funciona. Realmente explicarte porqué seria un poco largo, en resumen: hasta que conoscas bien al LCD no utilices el bit de busy (creeme me ha dejado colgado varias veces: los LCD con los chips soldados me funcionan bien, pero los que tienen los chips montados sobre la placa cuebiertos por "la gota" negra, van para atras con ese bit).
Ademas no es necesario partir la información en dos, la rutina debería encargarce sola de partirla y enviarla.
Te dejo aqui el codigo que utilizo:

;************** Comandos para manejo del LCD *************
CTRL    MOVWF   RDATO
   CLRF   PORTB
   bcf     PORTB,2         ;señal r/s
                goto    dato2           ;para escribir en el modulo lcd y
DATO       MOVWF   RDATO
   CLRF   PORTB
   bsf     PORTB,2
dato2      bsf     PORTB,3         ;señal r/w
               movlw   0fh            
        andwf   PORTB,1
        movf    RDATO,w          
        andlw   0f0h
        iorwf   PORTB,1
        call    RETMIC
        bcf     PORTB,3
        call    RETMIC
        bsf     PORTB,3
        movlw   0fh
        andwf   PORTB,1
        swapf   RDATO,w
        andlw   0f0h
        iorwf   PORTB,1
        call    RETMIC
        bcf     PORTB,3
        call    RETMIC
       CLRF   PORTB
        retlw   0

La funcion RETMIC debe ser un retardo de al menos 0.5 milisegundos (para algunos puede parecer mucho, pero te da la seguridad de que funcione con cualquier modelo y/o conectores)

Para usarla:
si quieres enviar un comando: lo cargas en W y haces un CALL a CTRL y lo mismo para llamar a DATO, por ejemplo:
movlw   "H"
call        DATO   ;y si esta bien configurado el LCD deberia aparecer la H


Para configurarlo:

                MOVLW   02H      ;
   CALL   CTRL      ;
   MOVLW   028H      ;
   CALL   CTRL      ; Inicializa LCD: 4 bits, 2 lineas, Invisible   MOVLW   0CH      ;
   CALL   CTRL      ;
   MOVLW   06H      ;
   CALL   CTRL      ;


 

anything