Arduino-TWI
Two-Wire Interface (TWI) library for Arduino
PCF8574.h
Go to the documentation of this file.
1 
19 #ifndef PCF8574_H
20 #define PCF8574_H
21 
22 #include "TWI.h"
23 
46 class PCF8574 : protected TWI::Device {
47 public:
54  PCF8574(TWI& twi, uint8_t subaddr = 7) :
55  TWI::Device(twi, 0x20 | (subaddr & 0x7)),
56  m_ddr(0xff),
57  m_port(0)
58  {}
59 
64  uint8_t ddr()
65  {
66  return (m_ddr);
67  }
68 
73  void ddr(uint8_t ddr)
74  {
75  m_ddr = ddr;
76  m_port |= m_ddr;
77  acquire();
78  Device::write(&m_port, sizeof(m_port));
79  release();
80  }
81 
86  uint8_t read()
87  {
88  uint8_t res;
89  acquire();
90  Device::read(&res, sizeof(res));
91  release();
92  return ((res & m_ddr) | m_port);
93  }
94 
99  uint8_t port()
100  {
101  return (m_port);
102  }
103 
108  void write(uint8_t value)
109  {
110  acquire();
111  m_port = value | m_ddr;
112  Device::write(&m_port, sizeof(m_port));
113  release();
114  }
115 
121  void write(void* buf, size_t size)
122  {
123  acquire();
124  uint8_t* bp = (uint8_t*) buf;
125  size_t n = size;
126  while (n--) *bp++ |= m_ddr;
127  Device::write(buf, size);
128  release();
129  }
130 
135  template<uint8_t PIN>
136  class GPIO {
137  public:
139  static const uint8_t MASK = (1 << (PIN & 0x7));
140 
144  GPIO(PCF8574& dev) : m_dev(dev) {}
145 
149  void input()
150  __attribute__((always_inline))
151  {
152  m_dev.ddr(m_dev.ddr() | MASK);
153  }
154 
158  void output()
159  __attribute__((always_inline))
160  {
161  m_dev.ddr(m_dev.ddr() & ~MASK);
162  }
163 
168  bool read()
169  {
170  if (m_dev.ddr() & MASK)
171  return ((m_dev.read() & MASK) != 0);
172  return ((m_dev.port() & MASK) != 0);
173  }
174 
180  operator bool()
181  __attribute__((always_inline))
182  {
183  return (read());
184  }
185 
191  void write(int value)
192  {
193  uint8_t data = m_dev.port();
194  if (value)
195  data |= MASK;
196  else
197  data &= ~MASK;
198  m_dev.write(data);
199  }
200 
205  void operator=(int value)
206  __attribute__((always_inline))
207  {
208  write(value);
209  }
210 
211  protected:
213  };
214 
215 protected:
217  uint8_t m_ddr;
218 
220  uint8_t m_port;
221 
229  PCF8574(TWI& twi, uint8_t addr, uint8_t subaddr) :
230  TWI::Device(twi, addr | (subaddr & 0x7)),
231  m_ddr(0xff),
232  m_port(0)
233  {}
234 };
235 
236 class PCF8574A : public PCF8574 {
237 public:
244  PCF8574A(TWI& twi, uint8_t subaddr = 7) : PCF8574(twi, 0x38, subaddr) {}
245 };
246 #endif
bool read()
Definition: PCF8574.h:168
Definition: TWI.h:28
PCF8574(TWI &twi, uint8_t subaddr=7)
Definition: PCF8574.h:54
uint8_t m_ddr
Definition: PCF8574.h:217
bool release()
Definition: TWI.h:62
void output()
Definition: PCF8574.h:158
void ddr(uint8_t ddr)
Definition: PCF8574.h:73
uint8_t m_port
Definition: PCF8574.h:220
PCF8574(TWI &twi, uint8_t addr, uint8_t subaddr)
Definition: PCF8574.h:229
Hardware::TWI twi(100000UL)
void write(uint8_t value)
Definition: PCF8574.h:108
GPIO(PCF8574 &dev)
Definition: PCF8574.h:144
void write(void *buf, size_t size)
Definition: PCF8574.h:121
void operator=(int value)
Definition: PCF8574.h:205
PCF8574A(TWI &twi, uint8_t subaddr=7)
Definition: PCF8574.h:244
void input()
Definition: PCF8574.h:149
PCF8574 & m_dev
Definition: PCF8574.h:212
void write(int value)
Definition: PCF8574.h:191
static const uint8_t MASK
Definition: PCF8574.h:139
Device(TWI &twi, uint8_t addr)
Definition: TWI.h:41
bool acquire()
Definition: TWI.h:52
uint8_t port()
Definition: PCF8574.h:99
uint8_t ddr()
Definition: PCF8574.h:64
uint8_t read()
Definition: PCF8574.h:86