Autor Tema: Inicialización LCD de 4 bits  (Leído 2070 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:00: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


 

anything