' ========================================================================= ' ' File....... MCP23016.BSP ' Purpose.... Microchip MCP23016 Demo ' Author..... Parallax ' E-mail..... support@parallax.com ' Started.... ' Updated.... 05 SEP 2003 ' ' {$STAMP BS2p} ' {$PBASIC 2.5} ' ' ========================================================================= ' -----[ Program Description ]--------------------------------------------- ' ' This program demonstrates simple interfacing to the Microchip MCP23016 ' I/O expander. The advantage of this device over the PCF8574 series is ' its sink/source ability of 25 mA per pin. ' ' Note: The MCP23016 uses the same device type as the PCF8574P -- do not ' connect on the same buss (okay to use PCF8574AP on same buss). ' ' Connections: ' ' GP0.0 -> GP0.7 LED (via 470) ' GP1.4 -> GP1.7 LED (via 470) ' GP1.0 -> GP1.3 active-low pushbutton ' Clock 3.3K to Vdd; 30 pF to Vss ' -----[ Revision History ]------------------------------------------------ ' -----[ I/O Definitions ]------------------------------------------------- SDA PIN 0 ' I2C data pin SCL PIN 1 ' I2C clock pin ' -----[ Constants ]------------------------------------------------------- DevType CON %0100 << 4 ' Device type DevAddr CON %000 << 1 ' address = %000 -> %111 Wr23016 CON DevType | DevAddr ' write to MCP23016 Rd23016 CON Wr23016 | 1 ' read from MCP23016 GP0 CON $00 ' register addresses GP1 CON $01 OLAT0 CON $02 OLAT1 CON $03 IPOL0 CON $04 IPOL1 CON $05 IODIR0 CON $06 IODIR1 CON $07 INTCAP0 CON $08 INTCAP1 CON $09 IOCON0 CON $0A IOCON1 CON $0B #DEFINE _P40 = 0 ' 0 for BS2p24/pe24 ' -----[ Variables ]------------------------------------------------------- dataGP0 VAR Byte ' device I/O bank 0 dataGP1 VAR Byte ' -- bank 1 idx VAR Nib ' loop counter ' -----[ EEPROM Data ]----------------------------------------------------- ' -----[ Initialization ]-------------------------------------------------- Setup: PAUSE 100 ' allow device POR #IF _P40 #THEN AUXIO #ENDIF ' use aux pins on BS2p40 I2COUT SDA, Wr23016, IODIR0, [%00000000] ' GP0 pins are outputs I2COUT SDA, Wr23016, IODIR1, [%00001111] ' GP1.0 - GP1.3 are inputs I2COUT SDA, Wr23016, IPOL1, [%00001111] ' invert inputs ' -----[ Program Code ]---------------------------------------------------- Main: DO I2COUT SDA, Wr23016, GP0, [dataGP0] ' output counter FOR idx = 1 TO 10 I2CIN SDA, Rd23016, GP1, [dataGP1] ' read buttons dataGP1 = dataGP1 << 4 ' move inputs to outputs I2COUT SDA, Wr23016, GP1, [dataGP1] ' display button scan DEBUG HOME, ' report "LEDs ", BIN8 dataGP0, CR, "Buttons ", BIN4 dataGP1.NIB1 NEXT dataGP0 = dataGP0 + 1 ' increment count LOOP END ' -----[ Subroutines ]-----------------------------------------------------