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