Hola!
Respecto al PCF8574, al menos en la versión de PROTEUS que tengo yo está el modelo completo funcionando perfectamente.
Y sobre el archivo que no está bien del todo me confundí, no lo tenía delante y me equivoqué de nombre, me refería a BusyI2cXLCD.c
Por lo que he visto si flag es 1 o 0 siempre va hacer lo mismo entonces mejor seria ponerlo dentro de una funcion, y al retornar que retorne el mismo flag, haber que te parece esta modificacion:
// Written by Raúl Quesada Navarro on 13/07/2013
// Visit:
www.Raquena.com# include<p18cxxx.h>
# include<i2c.h>
# include<delays.h>
# include"I2CXLCD.h"
// La función BusyI2cXLCD se encarga de averiguar si el LCD se encuentra
// ocupado realizando operaciones internas, para evitar interrumpirlo.
void Proceso(void);//Prototipo.
unsigned char BusyI2cXLCD()
{
char flag = 0;
char i2cData = 0;
// Creamos una variable donde irá el flag de ocupado del XLCD
i2cData = i2cData | 0b00100000; // activamos el pin R/W
i2cData = i2cData & 0b10111111; // desactivamos el bit de RS
WritePCF8574(i2cData);
DelayFor18TCY();
i2cData = i2cData | 0b00010000; // activamos el pin E
WritePCF8574(i2cData);
DelayFor18TCY();
flag = ReadPCF8574();
flag = flag & 0x08; // Nos quedamos sólo con el valor del busy flag.
// ESTO SE PUEDE ARREGLAR !!!
// PARA QUE OCUPE MENOS !!!
// LA ÚNICA PARTE DIFERENTE ES EL RETURN, SE DEBERÍA UNIFICAR.
Proceso();
Delay100TCYx(2);
return flag;
}
void Proceso(void)
{
i2cData = i2cData & 0b11101111; // Desactivamos el pin E
WritePCF8574(i2cData);
DelayFor18TCY(); // Esperamos
i2cData = i2cData | 0b00010000; // Activamos el pin E
WritePCF8574(i2cData);
DelayFor18TCY(); // Esperamos
i2cData = i2cData & 0b11101111; // Desactivamos el pin E
WritePCF8574(i2cData);
i2cData = i2cData & 0b11011111; // Desactivamos el pin R/W
WritePCF8574(i2cData);
}