Added PCF8574 driver lib

This commit is contained in:
anschrammh 2019-04-23 07:59:05 +02:00
parent eab84f4152
commit e3f6f41fdb
4 changed files with 83 additions and 9 deletions

View File

@ -1,26 +1,32 @@
#include "PCF8574.h" #include "PCF8574.h"
PCF8574::PCF8574(uint8_t address, TwoWire &twc) : _twc(twc),_address(address),_pinConfig(0b11111111) PCF8574::PCF8574(uint8_t address, TwoWire &twc) : _twc(twc), _address(address), _pinConfig(0b11111111), _pddr(0b00000000) //Inputs by default
{ {
} }
void PCF8574::begin() boolean PCF8574::begin()
{ {
_twc.begin(); _twc.begin();
_twc.beginTransmission(_address); _twc.beginTransmission(_address);
_twc.write(_pinConfig); _twc.write(_pinConfig);
_twc.endTransmission(); return _twc.endTransmission() == 0;
} }
void PCF8574::pinMode(Pin pin, boolean mode) void PCF8574::pinMode(Pin pin, boolean mode)
{ {
uint8_t mask = mode ? ~pin : pin; //0 INPUT - 1 OUTPUT uint8_t mask = mode ? pin : pin; //0 INPUT - 1 OUTPUT
if(mode) if(mode)//OUTPUT
_pinConfig = _pinConfig & mask; {
else
_pinConfig = _pinConfig | mask; _pinConfig = _pinConfig | mask;
_pddr = _pddr | pin;
}
else
{
_pinConfig = _pinConfig | mask;
_pddr = _pddr & ~pin;
}
_pinConfig = _pinConfig | mask; _pinConfig = _pinConfig | mask;
_twc.beginTransmission(_address); _twc.beginTransmission(_address);
@ -30,6 +36,10 @@ void PCF8574::pinMode(Pin pin, boolean mode)
void PCF8574::digitalWrite(Pin pin, boolean mode) void PCF8574::digitalWrite(Pin pin, boolean mode)
{ {
//We first check that the pin is an output
if((_pddr & pin) == 0)
return;
uint8_t mask = mode ? pin : ~pin; //0 LOW, 1 HIGH uint8_t mask = mode ? pin : ~pin; //0 LOW, 1 HIGH
if(mode) if(mode)
_pinConfig = _pinConfig | mask; _pinConfig = _pinConfig | mask;
@ -48,3 +58,36 @@ boolean PCF8574::digitalRead(Pin pin)
while(_twc.available())reg = _twc.read(); while(_twc.available())reg = _twc.read();
return (reg & pin) == 0 ? 0 : 1; return (reg & pin) == 0 ? 0 : 1;
} }
void PCF8574::digitalReadAll(boolean array[])
{
uint8_t reg = 0b00000000;
_twc.requestFrom((uint8_t)_address,(uint8_t)1,(uint8_t)true);
while(_twc.available())reg = _twc.read();
array[0] = (reg & P0) == 0 ? 0 : 1;
array[1] = (reg & P1) == 0 ? 0 : 1;
array[2] = (reg & P2) == 0 ? 0 : 1;
array[3] = (reg & P3) == 0 ? 0 : 1;
array[4] = (reg & P4) == 0 ? 0 : 1;
array[5] = (reg & P5) == 0 ? 0 : 1;
array[6] = (reg & P6) == 0 ? 0 : 1;
array[7] = (reg & P7) == 0 ? 0 : 1;
}
boolean PCF8574::getPinMode(Pin pin)
{
return _pddr & pin == 0 ? INPUT : OUTPUT;
}
void PCF8574::getPinModeAll(boolean array[])
{
array[0] = (_pddr & P0) == 0 ? INPUT : OUTPUT;
array[1] = (_pddr & P1) == 0 ? INPUT : OUTPUT;
array[2] = (_pddr & P2) == 0 ? INPUT : OUTPUT;
array[3] = (_pddr & P3) == 0 ? INPUT : OUTPUT;
array[4] = (_pddr & P4) == 0 ? INPUT : OUTPUT;
array[5] = (_pddr & P5) == 0 ? INPUT : OUTPUT;
array[6] = (_pddr & P6) == 0 ? INPUT : OUTPUT;
array[7] = (_pddr & P7) == 0 ? INPUT : OUTPUT;
}

View File

@ -15,15 +15,19 @@ class PCF8574
enum Pin{P0 = 1, P1 = 2, P2 = 4, P3 = 8, P4 = 16, P5 = 32, P6 = 64, P7 = 128}; enum Pin{P0 = 1, P1 = 2, P2 = 4, P3 = 8, P4 = 16, P5 = 32, P6 = 64, P7 = 128};
PCF8574(uint8_t address, TwoWire &twc = Wire); PCF8574(uint8_t address, TwoWire &twc = Wire);
void begin(); boolean begin();
void pinMode(Pin pin, boolean mode = INPUT); void pinMode(Pin pin, boolean mode = INPUT);
void digitalWrite(Pin pin, boolean mode); void digitalWrite(Pin pin, boolean mode);
boolean digitalRead(Pin pin); boolean digitalRead(Pin pin);
void digitalReadAll(boolean array[]);
boolean getPinMode(Pin pin);
void getPinModeAll(boolean array[]);
private: private:
TwoWire &_twc; TwoWire &_twc;
uint8_t _address; uint8_t _address;
uint8_t _pinConfig; uint8_t _pinConfig;
uint8_t _pddr;
protected: protected:
}; };
#endif #endif //PCF8574_H

View File

@ -0,0 +1,27 @@
#######################################
# Syntax Coloring Map For RTC
#######################################
#######################################
# Datatypes (KEYWORD1)
#######################################
PCF8574 KEYWORD1
#######################################
# Methods and Functions (KEYWORD2)
#######################################
#######################################
# Constants (LITERAL1)
#######################################
P0 LITERAL1
P1 LITERAL1
P2 LITERAL1
P3 LITERAL1
P4 LITERAL1
P5 LITERAL1
P6 LITERAL1
P7 LITERAL1