Hola, tengo un pequeño gran problema, estoy intentando hacer funcionar un LCD de 16x2 con un pcf8574 y un pic 16f628, el cual he creado correctamente la rutina de comunicacion, a traves del bus i2c.
Os cuento, si monto un expansor en una placa de pruebas con sus correspondientes led en cada bit, funcionan de maravilla, el problema es que la rutina que tengo que crear para el lcd, me esta resultando imposible, no consigo que me funcione nada, las conexiones al lcd son las siguientes:
PIN PCF8574 >> LCD
P0 RS
P1 RW
P2 E
P3 RETROILUMINACION
P4 D4
P5 D5
P6 D6
P7 D7
Todo ello esta correcto y funcionando, como base he cogido la libreria del libro microcontralor 16f84 y la he modificado con el fin de hacerla funcionar con el bus i2c
os pego el trozo principal de la libreria, ya que el resto son rutinas que llaman a la rutina LCD_EscribeLCD.
Las direcciones del Expansor se encuentran el el programa principal, y como digo lo que es el expansor funciona correctamente
CBLOCK
LCD_Dato
LCD_GuardaDato
LCD_GuardaTRISB
LCD_Auxiliar1
LCD_Auxiliar2
LCD_BusDatos
ENDC
LCD_CaracteresPorLinea EQU .16 ; Número de caracteres por línea de la pantalla.
#DEFINE LCD_PinRS LCD_BusDatos,0
#DEFINE LCD_PinRW LCD_BusDatos,1
#DEFINE LCD_PinEnable LCD_BusDatos,2
#DEFINE LCD_ILUMINA LCD_BusDatos,3
; Subrutina "LCD_Inicializa" ------------------------------------------------------------
;
; Inicialización del módulo LCD: Configura funciones del LCD, produce reset por software,
; borra memoria y enciende pantalla. El fabricante especifica que para garantizar la
; configuración inicial hay que hacerla como sigue:
;
LCD_Inicializa
BCF LCD_PinRW
BCF LCD_PinEnable
BCF LCD_PinRS
call Retardo_20ms
call Retardo_1s
movlw b'00110000'
CALL PCF8574_Escribe
; call LCD_EscribeLCD ; Escribe el dato en el LCD.
call Retardo_5ms
movlw b'00110000'
; call LCD_EscribeLCD
CALL PCF8574_Escribe
call Retardo_200micros
movlw b'00110000'
; call LCD_EscribeLCD
CALL PCF8574_Escribe
call Retardo_20micros ; Este retardo es necesario para simular en PROTEUS.
movlw b'00100000' ; Interface de 4 bits.
; call LCD_EscribeLCD
CALL PCF8574_Escribe
call Retardo_20micros ; Este retardo es necesario para simular en PROTEUS.
; Ahora configura el resto de los parámetros:
call LCD_2Lineas4Bits5x7 ; LCD de 2 líneas y caracteres de 5x7 puntos.
call LCD_Borra ; Pantalla encendida y limpia. Cursor al principio
call LCD_CursorOFF ; de la línea 1. Cursor apagado.
call LCD_CursorIncr ; Cursor en modo incrementar.
return
; Subrutina "LCD_EscribeLCD" -----------------------------------------------------------
;
; Envía el dato del registro de trabajo W al bus de dato y produce un pequeño pulso en el pin
; Enable del LCD. Para no alterar el contenido de las líneas de la parte baja del Puerto B que
; no son utilizadas para el LCD (pines RB3:RB0), primero se lee estas líneas y después se
; vuelve a enviar este dato sin cambiarlo.
LCD_EscribeLCD
andlw b'11110000' ; Se queda con el nibble alto del dato que es el
movwf LCD_Dato ; que hay que enviar y lo guarda.
movf LCD_BusDatos,W ; Lee la información actual de la parte baja
andlw b'00001111' ; del Puerto B, que no se debe alterar.
iorwf LCD_Dato,F ; Enviará la parte alta del dato de entrada
; y en la parte baja lo que había antes.
movf LCD_Dato,W ; Recupera el dato a enviar.
movwf LCD_BusDatos ; Envía el dato al módulo LCD.
bsf LCD_PinEnable ; Permite funcionamiento del LCD mediante un pequeño
MOVF LCD_BusDatos,W
CALL PCF8574_Escribe
MOVF LCD_BusDatos,W
CALL PCF8574_Escribe
bcf LCD_PinEnable ; pulso y termina impidiendo el funcionamiento del LCD.
MOVF LCD_BusDatos,W
CALL PCF8574_Escribe
return
solo me queda enviar bien los comandos y datos hacia el lcd, manejando a tiempo sus pines.
por favor es importante, si alguien sabe del tema o conoce alguna rutina contacten conmigo.
muchas gracias