Added PCF8574 driver lib
This commit is contained in:
parent
eab84f4152
commit
e3f6f41fdb
@ -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;
|
||||||
|
}
|
||||||
|
@ -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
|
||||||
|
27
src/libs/PCF8574/keywords.txt
Normal file
27
src/libs/PCF8574/keywords.txt
Normal 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
|
Loading…
Reference in New Issue
Block a user