pcf8574 arduino 程序

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()
{
  
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值