Arduino Libraries
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
PCF8574.hpp
Go to the documentation of this file.
1 // Author: Mario S. Könz <mskoenz@gmx.net>
2 // Date: 19.08.2013 22:29:52 CEST
3 // File: PCF8574.hpp
4 
5 /* This program is free software. It comes without any warranty, to
6  * the extent permitted by applicable law. You can redistribute it
7  * and/or modify it under the terms of the Do What The Fuck You Want
8  * To Public License, Version 2, as published by Sam Hocevar. See
9  * http://www.wtfpl.net/ or COPYING for more details. */
10 
11 #ifndef __PCF8574_HEADER
12 #define __PCF8574_HEADER
13 
14 #include "../com/i2c.hpp"
15 #include "../util/byte_operation.hpp"
16 
17 namespace device {
18  class PCF8574_class {
19  public:
20  PCF8574_class(uint8_t const & add): dev_ard_(0x20 + add), input_mask_(0) { //the addres is 0x20 + (A2 << 2 | A1 << 1 | A0)
21  }
22  void write(uint8_t const & data) { //if a write happens put input bits high
23  com::i2cout(dev_ard_) << uint8_t(data | input_mask_) << ustd::endl;
24  }
25  //use low to drive high (25mA per port) currents. Continuouse high works with 300uA per port...
26  uint8_t read() const {
27  uint8_t res;
28  com::i2cin(dev_ard_) >> res;
29  return res;
30  }
31  uint8_t & mask() {
32  return input_mask_;
33  }
34  private:
35  uint8_t dev_ard_;
36  uint8_t input_mask_; //the imputs should always be written HIGH
37  };
38 }//end namespace device
39 
40 namespace tool {
41  template<uint8_t pin>
42  class PCF8574 {
43  public:
44  PCF8574(device::PCF8574_class & ioexp): ioexp_(&ioexp), pm_set_(false) {
45  }
46  void mode(uint8_t const & pm) {
47  pm_set_ = false; //since i2c isn't online yet...
48  if(pm == INPUT_PULLUP or pm == INPUT) {
49  util::set_bit(ioexp_->mask(), pin);
50  }
51  else
52  util::clear_bit(ioexp_->mask(), pin);
53  }
54  void write(bool const & state) {
55  uint8_t read = ioexp_->read();
56  util::write_bit(read, pin, state);
57  ioexp_->write(read);
58  }
59  bool read() {
60  if(pm_set_ == false) { //not nice, but the only way...
61  pm_set_ = true;
62  ioexp_->write(ioexp_->mask());
63  }
64  uint8_t read = ioexp_->read();
65  return util::read_bit(read, pin);
66  }
67  private:
68  device::PCF8574_class * ioexp_;
69  bool pm_set_;
70  };
71 
72 }//end namespace
73 
74 #endif //__PCF8574_HEADER
uint8_t & mask()
Definition: PCF8574.hpp:31
bool read()
Definition: PCF8574.hpp:59
Definition: PCF8574.hpp:18
class com::i2cout_class i2cout
PCF8574_class(uint8_t const &add)
Definition: PCF8574.hpp:20
void write(uint8_t const &data)
Definition: PCF8574.hpp:22
void mode(uint8_t const &pm)
Definition: PCF8574.hpp:46
void clear_bit(T &unit, uint8_t const &pos)
Definition: byte_operation.hpp:44
void write_bit(T &unit, uint8_t const &pos, bool state=true)
Definition: byte_operation.hpp:48
struct ustd::endl_class endl
PCF8574(device::PCF8574_class &ioexp)
Definition: PCF8574.hpp:44
uint8_t read() const
Definition: PCF8574.hpp:26
Definition: PCF8574.hpp:42
void set_bit(T &unit, uint8_t const &pos)
Definition: byte_operation.hpp:40
void write(bool const &state)
Definition: PCF8574.hpp:54
bool read_bit(T const &unit, uint8_t const &pos)
Definition: byte_operation.hpp:36
class com::i2cin_class i2cin