TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: cereal2 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!!!
-
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 ;