Demon, This is the code I assumed would work:
UNIT0 CON %01110000 'U5's CONTROL BYTE (PCF8574A) I/O EXPANDER
************************************************** ********
R_WI2CSW:'READ DIGITAL INPUTS FROM or WRITE DIGITAL OUTPUTS TO PCF8574'S
************************************************** ********
SWCNTR = 0
WHILE SWCNTR < 6
CONTROL = UNIT0 | (SWCNTR << 1)
IF READ_WRITE = 0 THEN 'READ INPUT STATUS FROM PCF8574'S
I2CREAD SDA,SCL,CONTROL,[SWITCHES(SWCNTR)]
ELSE 'WRITE OUTPUT STATE TO PCF8574'S
I2CWRITE SDA,SCL,CONTROL,[OUTPUTS(SWCNTR)]
ENDIF
SWCNTR = SWCNTR + 1
WEND
RETURN
But it didn't work as explained in my earlyer post. This is what I had to do instead:
UNIT0 CON %01110000 'U5's CONTROL BYTE (PCF8574A) I/O EXPANDER
UNIT1 CON %01110010 'U6's CONTROL BYTE (PCF8574A) I/O EXPANDER
UNIT2 CON %01110100 'U7's CONTROL BYTE (PCF8574A) I/O EXPANDER
UNIT3 CON %01110110 'U11's CONTROL BYTE (PCF8574A) I/O EXPANDER
UNIT4 CON %01111000 'U12's CONTROL BYTE (PCF8574A) I/O EXPANDER
UNIT5 CON %01111010 'U13's CONTROL BYTE (PCF8574A) I/O EXPANDER
************************************************** ********
R_WI2CS:'READ DIGITAL INPUTS FROM or WRITE DIGITAL OUTPUTS TO PCF8574'S
************************************************** ********
IF READ_WRITE = 0 THEN 'READ INPUT STATUS FROM PCF8574'S
I2CREAD SDA,SCL,UNIT0,[SWITCHES(0)]
I2CREAD SDA,SCL,UNIT1,[SWITCHES(1)]
I2CREAD SDA,SCL,UNIT2,[SWITCHES(2)]
I2CREAD SDA,SCL,UNIT3,[SWITCHES(3)]
I2CREAD SDA,SCL,UNIT4,[SWITCHES(4)]
I2CREAD SDA,SCL,UNIT5,[SWITCHES(5)]
ELSE
I2CWRITE SDA,SCL,UNIT0,[OUTPUTS(0)]
I2CWRITE SDA,SCL,UNIT1,[OUTPUTS(1)]
I2CWRITE SDA,SCL,UNIT2,[OUTPUTS(2)]
I2CWRITE SDA,SCL,UNIT3,[OUTPUTS(3)]
I2CWRITE SDA,SCL,UNIT4,[OUTPUTS(4)]
I2CWRITE SDA,SCL,UNIT5,[OUTPUTS(5)]
ENDIF
RETURN
Now very elegant......
Dave Purola,
N8NTA
Bookmarks