Bare Metal Programming Tool Kit
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Pages
mcp23x17.h
Go to the documentation of this file.
1 //***************************************************************************
2 //
3 // file : bmptk/chips/mcp23x17.h
4 //
5 // LICENSE (MIT expat license, copy of license.txt)
6 //
7 // Copyright (c) 2013 Wouter van Ooijen (wouter@voti.nl)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be included
18 // in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
24 // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE..
27 //
28 //***************************************************************************
29 
30 // document everything in this file
33 namespace bmptk {
34 namespace chips {
35 
36 
37 
39 //
42 template < typename interface
43 class mcp27x16 {
44 private:
45 
46  static unsigned char port_buffer_a, port_buffer_b;
47 
48  static void port_flush_a(){
49  channel::transaction_out_n( &port_buffer, 1 );
50  }
51 
52  template< int p >
53  class single_pin : public bmptk::hardware::pin_out {
54  public:
55 
56  static void init(){
57  channel::init();
58  }
59 
60  static void set( bool x ){
61  if( x ){
62  port_buffer |= ( 0x01 << p );
63  } else {
64  port_buffer &= ~ ( 0x01 << p );
65  }
66  port_flush();
67  }
68 
69  };
70 
71 public:
72 
74  static void init(){
75  channel::init();
76  }
77 
79  static int n_pins(){
80  return 8;
81  }
82 
84  static void set( unsigned char x ){
85  port_buffer = x;
86  port_flush();
87  }
88 
90  typedef single_pin< 0 > pin_0;
91 
93  typedef single_pin< 1 > pin_1;
94 
96  typedef single_pin< 2 > pin_2;
97 
99  typedef single_pin< 3 > pin_3;
100 
102  typedef single_pin< 4 > pin_4;
103 
105  typedef single_pin< 5 > pin_5;
106 
108  typedef single_pin< 6 > pin_6;
109 
111  typedef single_pin< 7 > pin_7;
112 
113 };
114 
115 template < typename channel >
116 unsigned char hc595< channel >::port_buffer;
117 
118 }; // namespace chips
119 }; // namespace bmptk