PCF8574是一个硅CMOS电路。它通过双线双向总线(I2C)为大多数微控制器系列提供通用远程I/O扩展。
PCF8574和PCF8574A从机地址。
pcf8574.h
#ifndef PCF8574_H__
#define PCF8574_H__
#include <Arduino.h>
#include <Wire.h>
//A0=0
//A1=0
//A2=0
#define PCF8574_ADDR 0X20
#define PCF8574A_ADDR 0X70
#define P0 0X00
#define P1 0X01
#define P2 0X02
#define P3 0X03
#define P4 0X04
#define P5 0X05
#define P6 0X06
#define P7 0X07
class PCF8574
{
public:
PCF8574(uint8_t sda_pin, uint8_t scl_pin, uint8_t addr);
PCF8574(uint8_t sda_pin, uint8_t scl_pin);
void writePins(uint8_t pinsValue);
void setPinHigh(uint8_t pin);
void setPinLow(uint8_t pin);
void setPinInvert(uint8_t pin);
uint8_t readPins(void);
bool readPin(uint8_t pin);
private:
uint8_t _addr; // I2C communication address of PCF8574
};
#endif
pcf8574.cpp
#include "pcf8574.h"
PCF8574::PCF8574(uint8_t sda_pin, uint8_t scl_pin, uint8_t addr)
{
_addr = addr;
Wire.begin(sda_pin, scl_pin);
}
PCF8574::PCF8574(uint8_t sda_pin, uint8_t scl_pin)
{
_addr = PCF8574_ADDR;
Wire.begin(sda_pin, scl_pin);
}
void PCF8574::writePins(uint8_t pinsValue)
{
Wire.beginTransmission(_addr);
Wire.write(pinsValue);
Wire.endTransmission();
}
void PCF8574::setPinHigh(uint8_t pin)
{
uint8_t pinsValue;
pinsValue = this->readPins();
pinsValue |= (1 << pin);
this->writePins(pinsValue);
}
void PCF8574::setPinLow(uint8_t pin)
{
uint8_t pinsValue;
pinsValue = this->readPins();
pinsValue &= ~(1 << pin);
this->writePins(pinsValue);
}
void PCF8574::setPinInvert(uint8_t pin)
{
uint8_t pinsValue;
pinsValue = this->readPins();
if(pinsValue&(1<<pin))this->setPinLow(pin);
else this->setPinHigh(pin);
}
uint8_t PCF8574::readPins(void)
{
uint8_t pinsValue;
Wire.requestFrom(_addr, (uint8_t)1);
pinsValue = Wire.read();
return pinsValue;
}
bool PCF8574::readPin(uint8_t pin)
{
uint8_t pinsValue;
Wire.requestFrom(_addr, (uint8_t)1);
pinsValue = Wire.read();
if(pinsValue&(1<<pin))
{
return HIGH;
}
else
{
return LOW;
}
}
示例
#include "pcf8574.h"
PCF8574 pcf(25, 26);
uint8_t pinsValue;
bool pinValue;
void setup()
{
Serial.begin(115200);
pcf.writePins(0xff);//设置所有引脚电平为高
delay(1000);
pinsValue = pcf.readPins();//读取所有引脚电平状态
Serial.println(pinsValue, BIN);//二进制打印
pcf.setPinLow(P2);//设置P2引脚低
delay(1000);
pinsValue = pcf.readPins();
Serial.println(pinsValue, BIN);
pcf.setPinHigh(P2);//设置P2引脚高
delay(1000);
pinValue = pcf.readPin(P2);//读取P2引脚电平
if(pinValue==HIGH)Serial.println("high");
else Serial.println("low");
pcf.setPinInvert(P2);//反转P2引脚电平
delay(1000);
pinValue = pcf.readPin(P2);
if(pinValue==HIGH)Serial.println("high");
else Serial.println("low");
}
void loop()
{
}