From 96e144d3499e9d4b40ffbf3b0432e5a36606cd3e Mon Sep 17 00:00:00 2001 From: Shawn McClintock Date: Sat, 23 Sep 2017 19:03:46 -0500 Subject: [PATCH] Add files via upload --- PCA9554-master/Examples/pca9554/pca9554.ino | 152 +++++++++++++++ PCA9554-master/PCA9554.cpp | 197 ++++++++++++++++++++ PCA9554-master/PCA9554.h | 48 +++++ 3 files changed, 397 insertions(+) create mode 100644 PCA9554-master/Examples/pca9554/pca9554.ino create mode 100644 PCA9554-master/PCA9554.cpp create mode 100644 PCA9554-master/PCA9554.h diff --git a/PCA9554-master/Examples/pca9554/pca9554.ino b/PCA9554-master/Examples/pca9554/pca9554.ino new file mode 100644 index 0000000..05128f8 --- /dev/null +++ b/PCA9554-master/Examples/pca9554/pca9554.ino @@ -0,0 +1,152 @@ +/*************************************************************************** +Title: PCA9554 sketch (PCA9554) - Output Example +Created by: Mach-1 Electronics - AD0ND +For: Arduino Users Everywhere! + +This file is free software; you can redistribute it and/or modify +it under the terms of either the GNU General Public License version 2 +or the GNU Lesser General Public License version 2.1, both as +published by the Free Software Foundation. +***************************************************************************/ + +#include // Load the PCA9554 Library +#include // Load the Wire Library + +PCA9554 ioCon1(0x20); // Create an object at this address +//PCA9554 ioCon1(0x21); // Additional object at next address, etc + + +void setup() +{ + Serial.begin(9600); + Wire.begin(); + ioCon1.portMode0(ALLOUTPUT); //Set the port as all output +} + + + +void loop() +{ + ioCon1.digitalWrite0(0, LOW); + ioCon1.digitalWrite0(1, LOW); + ioCon1.digitalWrite0(2, LOW); + ioCon1.digitalWrite0(3, LOW); + ioCon1.digitalWrite0(4, LOW); + ioCon1.digitalWrite0(5, LOW); + ioCon1.digitalWrite0(6, LOW); + ioCon1.digitalWrite0(7, HIGH); + delay(25); + ioCon1.digitalWrite0(0, LOW); + ioCon1.digitalWrite0(1, LOW); + ioCon1.digitalWrite0(2, LOW); + ioCon1.digitalWrite0(3, LOW); + ioCon1.digitalWrite0(4, LOW); + ioCon1.digitalWrite0(5, LOW); + ioCon1.digitalWrite0(6, HIGH); + ioCon1.digitalWrite0(7, HIGH); + delay(25); + ioCon1.digitalWrite0(0, LOW); + ioCon1.digitalWrite0(1, LOW); + ioCon1.digitalWrite0(2, LOW); + ioCon1.digitalWrite0(3, LOW); + ioCon1.digitalWrite0(4, LOW); + ioCon1.digitalWrite0(5, HIGH); + ioCon1.digitalWrite0(6, HIGH); + ioCon1.digitalWrite0(7, HIGH); + delay(25); + ioCon1.digitalWrite0(0, LOW); + ioCon1.digitalWrite0(1, LOW); + ioCon1.digitalWrite0(2, LOW); + ioCon1.digitalWrite0(3, LOW); + ioCon1.digitalWrite0(4, HIGH); + ioCon1.digitalWrite0(5, HIGH); + ioCon1.digitalWrite0(6, HIGH); + ioCon1.digitalWrite0(7, HIGH); + delay(25); + ioCon1.digitalWrite0(0, LOW); + ioCon1.digitalWrite0(1, LOW); + ioCon1.digitalWrite0(2, LOW); + ioCon1.digitalWrite0(3, HIGH); + ioCon1.digitalWrite0(4, HIGH); + ioCon1.digitalWrite0(5, HIGH); + ioCon1.digitalWrite0(6, HIGH); + ioCon1.digitalWrite0(7, HIGH); + delay(25); + ioCon1.digitalWrite0(0, LOW); + ioCon1.digitalWrite0(1, LOW); + ioCon1.digitalWrite0(2, HIGH); + ioCon1.digitalWrite0(3, HIGH); + ioCon1.digitalWrite0(4, HIGH); + ioCon1.digitalWrite0(5, HIGH); + ioCon1.digitalWrite0(6, HIGH); + ioCon1.digitalWrite0(7, LOW); + delay(25); + ioCon1.digitalWrite0(0, LOW); + ioCon1.digitalWrite0(1, HIGH); + ioCon1.digitalWrite0(2, HIGH); + ioCon1.digitalWrite0(3, HIGH); + ioCon1.digitalWrite0(4, HIGH); + ioCon1.digitalWrite0(5, HIGH); + ioCon1.digitalWrite0(6, LOW); + ioCon1.digitalWrite0(7, LOW); + delay(25); + ioCon1.digitalWrite0(0, HIGH); + ioCon1.digitalWrite0(1, HIGH); + ioCon1.digitalWrite0(2, HIGH); + ioCon1.digitalWrite0(3, HIGH); + ioCon1.digitalWrite0(4, HIGH); + ioCon1.digitalWrite0(5, LOW); + ioCon1.digitalWrite0(6, LOW); + ioCon1.digitalWrite0(7, LOW); + delay(25); + ioCon1.digitalWrite0(0, HIGH); + ioCon1.digitalWrite0(1, HIGH); + ioCon1.digitalWrite0(2, HIGH); + ioCon1.digitalWrite0(3, HIGH); + ioCon1.digitalWrite0(4, LOW); + ioCon1.digitalWrite0(5, LOW); + ioCon1.digitalWrite0(6, LOW); + ioCon1.digitalWrite0(7, LOW); + delay(25); + ioCon1.digitalWrite0(0, HIGH); + ioCon1.digitalWrite0(1, HIGH); + ioCon1.digitalWrite0(2, HIGH); + ioCon1.digitalWrite0(3, LOW); + ioCon1.digitalWrite0(4, LOW); + ioCon1.digitalWrite0(5, LOW); + ioCon1.digitalWrite0(6, LOW); + ioCon1.digitalWrite0(7, LOW); + delay(25); + ioCon1.digitalWrite0(0, HIGH); + ioCon1.digitalWrite0(1, HIGH); + ioCon1.digitalWrite0(2, LOW); + ioCon1.digitalWrite0(3, LOW); + ioCon1.digitalWrite0(4, LOW); + ioCon1.digitalWrite0(5, LOW); + ioCon1.digitalWrite0(6, LOW); + ioCon1.digitalWrite0(7, LOW); + delay(25); + ioCon1.digitalWrite0(0, HIGH); + ioCon1.digitalWrite0(1, LOW); + ioCon1.digitalWrite0(2, LOW); + ioCon1.digitalWrite0(3, LOW); + ioCon1.digitalWrite0(4, LOW); + ioCon1.digitalWrite0(5, LOW); + ioCon1.digitalWrite0(6, LOW); + ioCon1.digitalWrite0(7, LOW); + delay(25); + ioCon1.digitalWrite0(0, LOW); + ioCon1.digitalWrite0(1, LOW); + ioCon1.digitalWrite0(2, LOW); + ioCon1.digitalWrite0(3, LOW); + ioCon1.digitalWrite0(4, LOW); + ioCon1.digitalWrite0(5, LOW); + ioCon1.digitalWrite0(6, LOW); + ioCon1.digitalWrite0(7, LOW); + delay(25); + for(byte i = 0; i < 16; i++) + { + ioCon1.digitalWritePort0(~(1 << i)); + delay(75); + } +} diff --git a/PCA9554-master/PCA9554.cpp b/PCA9554-master/PCA9554.cpp new file mode 100644 index 0000000..10fc853 --- /dev/null +++ b/PCA9554-master/PCA9554.cpp @@ -0,0 +1,197 @@ +#include + +PCA9554::PCA9554(byte SlaveAddress) +{ + _SlaveAddress = SlaveAddress; +} + + +bool PCA9554::twiRead(byte ®isterAddress) +{ + Wire.beginTransmission(_SlaveAddress); + Wire.write(registerAddress); + + if(Wire.endTransmission() == 0) + { + delay(15); + Wire.requestFrom(_SlaveAddress, 1, true); + while(Wire.available() < 1); + registerAddress = Wire.read(); + return true; + } + return false; +} + +bool PCA9554::twiWrite(byte registerAddress, byte dataWrite) +{ + Wire.beginTransmission(_SlaveAddress); + Wire.write(registerAddress); + Wire.write(dataWrite); + + if(Wire.endTransmission() == 0) + return true; + return false; +} + +bool PCA9554::pinMode0(byte pinNumber, bool state) +{ + byte oldValue = CONFIGPORT0; + if(this->twiRead(oldValue) && (pinNumber <= 7)) + { + if(!state) + { + oldValue |= (1 << pinNumber); + if(this->portMode0(oldValue)) + return true; + return false; + } + else if(state) + { + oldValue &= ~(1 << pinNumber); + if(this->portMode0(oldValue)) + return true; + return false; + } + } + return false; +} + +/* bool PCA9554::pinMode1(byte pinNumber, bool state) +{ + byte oldValue = CONFIGPORT1; + if(this->twiRead(oldValue) && (pinNumber <= 7)) + { + if(!state) + { + oldValue |= (1 << pinNumber); + if(this->portMode1(oldValue)) + return true; + return false; + } + else if(state) + { + oldValue &= ~(1 << pinNumber); + if(this->portMode1(oldValue)) + return true; + return false; + } + } + return false; +} */ + +bool PCA9554::portMode0(byte value) +{ + if(this->twiWrite(CONFIGPORT0, value)) + return true; + return false; +} + +/* bool PCA9554::portMode1(byte value) +{ + if(this->twiWrite(CONFIGPORT1, value)) + return true; + return false; +} */ + +bool PCA9554::digitalWrite0(byte pinNumber, bool state) +{ + byte oldValue = OUTPUTPORT0; + if(this->twiRead(oldValue) && pinNumber <= 7) + { + if(state) + { + oldValue |= (1 << pinNumber); + if(this->digitalWritePort0(oldValue)) + return true; + return false; + } + else if(!state) + { + oldValue &= ~(1 << pinNumber); + if(this->digitalWritePort0(oldValue)) + return true; + return false; + } + } + return false; +} + +/* bool PCA9554::digitalWrite1(byte pinNumber, bool state) +{ + byte oldValue = OUTPUTPORT1; + if(this->twiRead(oldValue) && pinNumber <= 7) + { + if(state) + { + oldValue |= (1 << pinNumber); + if(this->digitalWritePort1(oldValue)) + return true; + return false; + } + else if(!state) + { + oldValue &= ~(1 << pinNumber); + if(this->digitalWritePort1(oldValue)) + return true; + return false; + } + } + return false; +} */ + +bool PCA9554::digitalWritePort0(byte value) +{ + if(this->twiWrite(OUTPUTPORT0, value)) + return true; + return false; +} + +/* bool PCA9554::digitalWritePort1(byte value) +{ + if(this->twiWrite(OUTPUTPORT1, value)) + return true; + return false; +} */ + +bool PCA9554::digitalRead0(byte &pinNumber) +{ + byte oldValue = INPUTPORT0; + if(this->twiRead(oldValue) && (pinNumber <= 7)) + { + oldValue &= (1 << pinNumber); + if(oldValue > 0) pinNumber = 1; + else pinNumber = 0; + return true; + } + return false; +} + +/* bool PCA9554::digitalRead1(byte &pinNumber) +{ + byte oldValue = INPUTPORT1; + if(this->twiRead(oldValue) && (pinNumber <= 7)) + { + oldValue &= (1 << pinNumber); + if(oldValue > 0) pinNumber = 1; + else pinNumber = 0; + return true; + } + return false; +} + */ +bool PCA9554::digitalReadPort0(byte &value) +{ + value = INPUTPORT0; + if(this->twiRead(value)) + return true; + return false; +} + +/* bool PCA9554::digitalReadPort1(byte &value) +{ + value = INPUTPORT1; + if(this->twiRead(value)) + return true; + return false; +} + */ \ No newline at end of file diff --git a/PCA9554-master/PCA9554.h b/PCA9554-master/PCA9554.h new file mode 100644 index 0000000..0023d1d --- /dev/null +++ b/PCA9554-master/PCA9554.h @@ -0,0 +1,48 @@ +/*************************************************************************** +Title: PCA9554 +by: AD0ND + +This file is free software; you can redistribute it and/or modify +it under the terms of either the GNU General Public License version 2 +or the GNU Lesser General Public License version 2.1, both as +published by the Free Software Foundation. +***************************************************************************/ + +#ifndef PCA9554_h +#define PCA9554_h + +#include +#include + +//PCA9554 Command Byte +#define INPUTPORT0 0x00 +#define OUTPUTPORT0 0x01 +#define POLINVPORT0 0x02 +#define CONFIGPORT0 0x03 + + +#define ALLOUTPUT 0x00 +#define ALLINPUT 0xFF + +class PCA9554 +{ + public : + PCA9554(byte SlaveAddress); + + bool twiRead(byte ®isterAddress); + bool twiWrite(byte registerAddress, byte dataWrite); + + bool pinMode0(byte pinNumber, bool state); + bool portMode0(byte value); + + bool digitalWrite0(byte pinNumber, bool state); + bool digitalWritePort0(byte value); + + bool digitalRead0(byte &pinNumber); + bool digitalReadPort0(byte &value); + + private : + int _SlaveAddress; +}; + +#endif