Hola, me estoy iniciando en lo de los PIC"s, y conforme avanzo en su estudio y aplicación
me surgen nuevas dudas que hasta ahora había podido resolver. Sin embargo lo que les voy a
plantear no he podido encontar la razón por lo que sucede, espero que alguno de ustedes me
pueda decir que es lo que pasa, y darme una solución al respecto.
Tengo un LCD de 2 líneas con 16 caracteres por línea lo he inicializado de la siguiente forma:
(estoy usando un PIC16F873, con un reloj de 4 MHz.)
*****************************************************************************************
inicDSP call pausa
call pausa
call pausa
movlw 0x38
movwf PORTC
call HabilitaLCD
call pausa
movlw 0x38
movwf PORTC
call HabilitaLCD
call pausa
movlw 0x38
movwf PORTC
call HabilitaLCD
call pausa
movlw 0x0E
call comdoLCD
movlw 0x06
call comdoLCD
return
*********************************************************
pausa clrf DELAY1
movlw 0X07
movwf DELAY2
bucle decfsz DELAY1,1
goto bucle
decfsz DELAY2,1
goto bucle
return
***********************************************************
comdoLCD
bcf PORTA,0 ; LCD MODO COMANDOS
movwf BUFFER
movwf PORTC
call HabilitaLCD
return
;*******************************************************
HabilitaLCD
bsf PORTA,1
nop
call pausa
bcf PORTA,1
return
;*******************************************************
datoLCD
bsf PORTA,0
movwf PORTC
call HabilitaLCD
return
********************************************************
Y pretendo que aparezca el siguiente mensaje
(así es como lo tengo)
mensaje1
movlw 0x01 ;limpia el LCD y regresa el cursor a la primera posición
call comdoLCD
movlw 0x80 ;es la primera dirección de la línea superior
call comdoLCD
movlw 0x7F
call datoLCD
movlw "P"
call datoLCD
movlw "R"
call datoLCD
movlw "O"
call datoLCD
movlw "G"
call datoLCD
movlw "."
call datoLCD
movlw " "
call datoLCD
movlw " "
call datoLCD
movlw "A"
call datoLCD
movlw "R"
call datoLCD
movlw "R"
call datoLCD
movlw "A"
call datoLCD
movlw "N"
call datoLCD
movlw "C"
call datoLCD
movlw "A"
call datoLCD
movlw 0x7E
call datoLCD
movlw 0xC0 ;aquí inicia la línea inferior, es la primera dirección
call comdoLCD
movlw " "
call datoLCD
movlw "M"
call datoLCD
movlw "E"
call datoLCD
movlw "D"
call datoLCD
movlw "I"
call datoLCD
movlw "D"
call datoLCD
movlw "A"
call datoLCD
movlw "="
call datoLCD
movf Dato3,W
addlw 0x30
andlw 0x3F
call datoLCD
movf Dato2,W
addlw 0x30
andlw 0x3F
call datoLCD
movf Dato1,W
addlw 0x30
andlw 0x3F
call datoLCD
movlw " "
call datoLCD
movlw "C"
call datoLCD
movlw "m"
call datoLCD
movlw "."
call datoLCD
return
*************************************************************
La llamo con un call (call mensaje1) inmediatamente después de que
se inicializa el LCD.
Sin embargo aparece el mensaje pero cortado del lado izquierdo.
O sea que debería verse:
<-PROG. ARRANCA->
MEDIDA=136 Cm.
y aparece así
G. ARRANCA->
IDA=136 Cm.
Es decir no aparecen las primeras 4 direcciónes de las dos líneas
o el "display real" está desplazado hacia la derecha con respecto
al "display Virtual" 4 posiciónes.
Una forma de resolver este problema sería colocando en la dirección
de inicio de la primera línea en lugar de 0x80 poner 0x84 y en lugar
de 0xC0 poner 0xC4 para la línea inferior. Pero creo que no es la mejor
manera de hacerlo, creo que algo me falta para configurar adecuadamente
el LCD.
Mucho agradeceré cualquier comentario y ayuda al respecto
Saludos a todos y de antemano ¡Gracias!