ralfmayr, Here is what I have been using for years. It uses the base address for the first of 3 PCF8574's. I then calculate the address depending on the one I need to gather or send data to.
UNIT0 CON %01000000 'U5's CONTROL BYTE (PCF8574) I/O EXPANDER
'**************** I2C I/O ROUTINE (PCF8574A) I/O EXPANDER ************
READ_WRITE VAR BIT 'READ DATA or WRITE DATA FLAG
EXPAND_UNIT VAR BYTE 'CONTROL BYTE FOR I2C
DEVICE VAR BYTE 'SELECTED I/O EXPANDER DEVICE
OUTPUTS VAR BYTE[3] 'RELAY OUTPUT BYTES
SWITCHES VAR BYTE[3] 'SWITCH INPUTS BYTES
'************************************************* *******************
R_WI2CS:'READ DIGITAL INPUTS FROM or WRITE DIGITAL OUTPUTS TO PCF8574'S
'************************************************* *******************
EXPAND_UNIT = UNIT0 'COPY BASE ADDRESS OF PCF8574'S
EXPAND_UNIT = (EXPAND_UNIT | (DEVICE << 1)) 'SELECT WHICH DEVICE
IF READ_WRITE = 0 THEN 'READ INPUT STATUS FROM PCF8574'S
I2CREAD SDA,SCL,EXPAND_UNIT,[SWITCHES(DEVICE)]
ELSE 'SET OUTPUT STATES TO PCF8574'S
I2CWRITE SDA,SCL,EXPAND_UNIT,[OUTPUTS(DEVICE)]
ENDIF
RETURN
Then to use it first set the device index.
Next set the read_write flag.
Then finally call the routine.....
Dave Purola,
N8NTA




Bookmarks