/* http://www.bristolwatch.com/arduino/arduino6b.htm PCA9555 32-Bit GPIO Expander with Arduino and a 4X4 Keypad Lewis Loflin lewis@bvu.net */ #include // specify use of Wire.h library. int i, j; byte temp1; void setup() { Wire.begin(); Wire.beginTransmission(0x20); // setup out direction registers Wire.write(0x06); // pointer Wire.write(0x0F); // DDR Port0 bits 0-3 input 4-7 output Wire.write(0x00); // DDR Port1 all output Wire.endTransmission(); Wire.beginTransmission(0x20); // Wire.write(0x02); // pointer Wire.write(0x00); // clear bits 4-7 PORT0 Wire.endTransmission(); Wire.beginTransmission(0x20); // invert bit Wire.write(0x04); // pointer Wire.write(0xFF); // invert bits PORT0 on read Wire.endTransmission(); // clear LEDs PORT1 Wire.beginTransmission(0x20); Wire.write(0x03); // begin here Wire.write(temp1); Wire.endTransmission(); } void loop() { // this routine using polling to scan switches. temp1 = getKey(); // get BCD code from keypad if ky pressed if ((temp1 != 0x00) && (temp1 <= 0x16)) { Wire.beginTransmission(0x20); Wire.write(0x03); // begin here Wire.write(temp1); Wire.endTransmission(); temp1 = 0x00; // clear temp1 } // enf if } // end loop byte getKey() { Wire.beginTransmission(0x20); Wire.write(0); // set data pointer Wire.endTransmission(); Wire.requestFrom(0x20, 1); byte c = Wire.read(); if ((c & 0x0F) == 0) return 0x00; // no key pressed Wire.beginTransmission(0x20); Wire.write(0x02); Wire.write(B11100000); // check row L1 Wire.endTransmission(); Wire.beginTransmission(0x20); Wire.write(0); // set data pointer Wire.endTransmission(); Wire.requestFrom(0x20, 1); c = Wire.read(); if ((c & 0x1F) > 0x10) { if (c==B00010001) c = 0x01; if (c==B00010010) c = 0x02; if (c==B00010100) c = 0x03; if (c==B00011000) c = 0x04; delay(100); resetPort0(); return c; } Wire.beginTransmission(0x20); Wire.write(0x02); Wire.write(B11010000); // check row L2 Wire.endTransmission(); Wire.beginTransmission(0x20); Wire.write(0); // set data pointer Wire.endTransmission(); Wire.requestFrom(0x20, 1); c = Wire.read(); if ((c & 0x2F) > 0x20) { if (c==B00100001) c = 0x05; if (c==B00100010) c = 0x06; if (c==B00100100) c = 0x07; if (c==B00101000) c = 0x08; delay(100); resetPort0(); return c; } Wire.beginTransmission(0x20); Wire.write(0x02); Wire.write(B10110000); // check row L3 Wire.endTransmission(); Wire.beginTransmission(0x20); Wire.write(0); // set data pointer Wire.endTransmission(); Wire.requestFrom(0x20, 1); c = Wire.read(); if ((c & 0x4F) > 0x40) { if (c==B01000001) c = 0x09; if (c==B01000010) c = 0x10; if (c==B01000100) c = 0x11; if (c==B01001000) c = 0x12; delay(100); resetPort0(); return c; } Wire.beginTransmission(0x20); Wire.write(0x02); Wire.write(B01110000); // check row L4 Wire.endTransmission(); Wire.beginTransmission(0x20); Wire.write(0); // set data pointer Wire.endTransmission(); Wire.requestFrom(0x20, 1); c = Wire.read(); if ((c & 0x8F) > 0x80) { if (c==B10000001) c = 0x13; if (c==B10000010) c = 0x14; if (c==B10000100) c = 0x15; if (c==B10001000) c = 0x16; delay(100); resetPort0(); return c; } } // reset port 0 void resetPort0() { Wire.beginTransmission(0x20); // Wire.write(0x02); // pointer Wire.write(0x00); // clear bits 4-7 PORT0 Wire.endTransmission(); }