Hola a todos.
POR FIN!!!!!!!!
Bien, el tema estaba en lo cabezudo que soy. Estaba colapsado y cerrado. Como que no funcionaba por lo del pin E, llegué a invertir los bits a enviar, y seguí colapsandome más aún. Luego tambien tuve algunas dificultades al dar pulsos al pin E, y al activar el pin RS para el modo carácter, pero al final, lo he conseguido simplificar y aclarar bastante.
Por si alguien algun dia se colapsa como yo, os dejo la libreria original modificada para funcionar a 4 bits.
mmmm... Bueno, veo que no puede. Os pongo las modificaciones. Si alguien la necesita entera que me lo pida por email en:
dgoma108@yahoo.esLCD_EscribeLCD ;Aquí escribe en modo COMANDO, por pin RS=0 movwf LCD_Dato
movlw b"11110000" ; Se queda con el nibble alto del dato a enviar
andwf LCD_Dato,f
call I2C_EnviaStart
movlw b"01001000" ;************DIRECCION BUS DEL LCD***************
call I2C_EnviaByte
movf LCD_Dato,W
call I2C_EnviaByte
call I2C_EnviaStop
call ActivaE ;Da el pulso al pin E para indicar que capture dato
call DesactivaE
return
LCD_EscribeLCDCaracter ;Aquí escribe en modo texto por que activaremos el pin RS movwf LCD_Dato
movlw b"11110000"
andwf LCD_Dato,f
call ActivaRS
call ActivaE
call DesactivaE
return
ActivaE call I2C_EnviaStart
movlw b"01001000" ;************DIRECCION BUS DE MI LCD***************
call I2C_EnviaByte
bsf LCD_Dato,2 ;Pin donde govierno en pin E en mi PCB*********
movf LCD_Dato,W
call I2C_EnviaByte
call I2C_EnviaStop
return
DesactivaE call I2C_EnviaStart
movlw b"01001000"
call I2C_EnviaByte
bcf LCD_Dato,2
movf LCD_Dato,W
call I2C_EnviaByte
call I2C_EnviaStop
return
ActivaRS call I2C_EnviaStart
movlw b"01001000"
call I2C_EnviaByte
bsf LCD_Dato,3 ;Pin donde govierno en pin RS en mi PCB*********
movf LCD_Dato,W
call I2C_EnviaByte
call I2C_EnviaStop
return
y,
LCD_EnviaComando movwf LCD_GuardaDato ; Guarda el dato a enviar.
call LCD_EscribeLCD ; Primero envía el nibble alto.
swapf LCD_GuardaDato,W ; Ahora envía el nibble bajo. Para ello pasa el
; nibble bajo del dato a enviar a parte alta del byte.
call LCD_EscribeLCD ; Se envía al visualizador LCD.
; Debe garantizar una correcta escritura manteniendo
call Retardo_2ms ; 2 ms en modo comando y 50 µs en modo cáracter.
; call Retardo_50micros
return
LCD_Caracter; bsf LCD_PinRS ; Activa el "Modo Dato", poniendo RS=1.
call LCD_CodigoCGROM ; Obtiene el código para correcta visualización.
movwf LCD_GuardaDato ; Guarda el dato a enviar.
call LCD_EscribeLCDCaracter ; Primero envía el nibble alto.
swapf LCD_GuardaDato,W ; Ahora envía el nibble bajo. Para ello pasa el
; nibble bajo del dato a enviar a parte alta del byte.
call LCD_EscribeLCDCaracter ; Se envía al visualizador LCD.
; btfss LCD_PinRS ; Debe garantizar una correcta escritura manteniendo
; call Retardo_2ms ; 2 ms en modo comando y 50 µs en modo cáracter.
call Retardo_50micros
return
Os agradezco el interes y colaboración:
Saludos desde Sabadell, Barcelona.