transplanted from the original URL : https://github.com/adafruit/Adafruit-RGB-LCD-Shield-Library

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Adafruit_MCP23017.cpp Source File

Adafruit_MCP23017.cpp

00001 /***************************************************
00002   This is a library for the MCP23017 i2c port expander
00003 
00004   These displays use I2C to communicate, 2 pins are required to
00005   interface
00006   Adafruit invests time and resources providing this open source code,
00007   please support Adafruit and open-source hardware by purchasing
00008   products from Adafruit!
00009 
00010   Written by Limor Fried/Ladyada for Adafruit Industries.
00011   BSD license, all text above must be included in any redistribution
00012  ****************************************************/
00013 
00014 #include "Adafruit_MCP23017.h"
00015 
00016 Adafruit_MCP23017::Adafruit_MCP23017(I2C *master)
00017 {
00018     _master = master;
00019 
00020 
00021     // set defaults!
00022     
00023     _buffer = new char[2]();
00024     _buffer[0] = MCP23017_IODIRA;
00025     _buffer[1] = 0xFF;
00026     _master->write(MCP23017_ADDRESS, _buffer, 2);  // all inputs on port A
00027     _buffer[0] = MCP23017_IODIRB;
00028     _buffer[1] = 0xFF;
00029     _master->write(MCP23017_ADDRESS, _buffer, 2);  // all inputs on port B
00030     delete[] _buffer;
00031 }
00032 
00033 ////////////////////////////////////////////////////////////////////////////////
00034 
00035 void Adafruit_MCP23017::pinMode(uint8_t p, bool input_mode)
00036 {
00037     uint8_t iodir;
00038     uint8_t iodiraddr;
00039 
00040     // only 16 bits!
00041     if (p > 15){
00042         error("mcp23017 : it is a pin number which is not defined.\r\n");
00043         return;
00044     }
00045     
00046     if (p < 8)
00047         iodiraddr = MCP23017_IODIRA;
00048     else {
00049         iodiraddr = MCP23017_IODIRB;
00050         p -= 8;
00051     }
00052 
00053     // read the current IODIR
00054     _buffer = new char[1]();
00055     _buffer[0] = iodiraddr;
00056     _master->write(MCP23017_ADDRESS, _buffer, 1);
00057     _buffer[0] = 0;
00058     _master->read(MCP23017_ADDRESS, _buffer, 1);
00059     iodir = _buffer[0];
00060     delete[] _buffer;
00061 
00062     // set the pin and direction
00063     if (input_mode) {
00064         iodir |= 1 << p;
00065     } else {
00066         iodir &= ~(1 << p);
00067     }
00068 
00069     // write the new IODIR
00070     _buffer = new char[2]();
00071     _buffer[0] = iodiraddr;
00072     _buffer[1] = iodir;
00073     _master->write(MCP23017_ADDRESS, _buffer, 2);
00074     delete[] _buffer;
00075 }
00076 
00077 uint16_t Adafruit_MCP23017::readGPIOAB()
00078 {
00079     uint16_t ba = 0;
00080     uint8_t a;
00081 
00082     // read the current GPIO output latches
00083     _buffer = new char[1]();
00084     _buffer[0] = MCP23017_GPIOA;
00085     _master->write(MCP23017_ADDRESS, _buffer, 1);
00086     delete[] _buffer;
00087     
00088     _buffer = new char[2]();
00089     _master->read(MCP23017_ADDRESS, _buffer, 2);
00090     a = _buffer[0];
00091     ba = _buffer[1];
00092     ba <<= 8;
00093     ba |= a;
00094     delete[] _buffer;
00095 
00096     return ba;
00097 }
00098 
00099 void Adafruit_MCP23017::writeGPIOAB(uint16_t ba)
00100 {
00101     _buffer = new char[3]();
00102     _buffer[0] = MCP23017_GPIOA;
00103     _buffer[1] = ba & 0xFF;
00104     _buffer[2] = ba >> 8;
00105     _master->write(MCP23017_ADDRESS, _buffer, 3);
00106     delete[] _buffer;
00107 }
00108 
00109 void Adafruit_MCP23017::digitalWrite(uint8_t p, bool high)
00110 {
00111     uint8_t gpio;
00112     uint8_t gpioaddr, olataddr;
00113 
00114     if (p > 15){
00115         error("mcp23017 : it is a pin number which is not defined.\r\n");
00116         return;
00117     }
00118 
00119     if (p < 8) {
00120         olataddr = MCP23017_OLATA;
00121         gpioaddr = MCP23017_GPIOA;
00122     } else {
00123         olataddr = MCP23017_OLATB;
00124         gpioaddr = MCP23017_GPIOB;
00125         p -= 8;
00126     }
00127 
00128     // read the current GPIO output latches
00129     _buffer = new char[1]();
00130     _buffer[0] = olataddr;
00131     _master->write(MCP23017_ADDRESS,_buffer , 1);
00132     delete[] _buffer;
00133     
00134     _buffer = new char[1]();
00135     _master->read(MCP23017_ADDRESS, _buffer, 1);
00136     gpio = _buffer[0];
00137     delete[] _buffer;
00138 
00139     // set the pin and direction
00140     if (high) {
00141         gpio |= 1 << p;
00142     } else {
00143         gpio &= ~(1 << p);
00144     }
00145 
00146     // write the new GPIO
00147     _buffer = new char[2]();
00148     _buffer[0] = gpioaddr;
00149     _buffer[1] = gpio;
00150     _master->write(MCP23017_ADDRESS, _buffer, 2);
00151     delete[] _buffer;
00152 }
00153 
00154 void Adafruit_MCP23017::pullUp(uint8_t p, bool pullup_anable)
00155 {
00156     uint8_t gppu;
00157     uint8_t gppuaddr;
00158 
00159     // only 16 bits!
00160     if (p > 15){
00161         error("mcp23017 : it is a pin number which is not defined.\r\n");
00162         return;
00163     }
00164 
00165     if (p < 8)
00166         gppuaddr = MCP23017_GPPUA;
00167     else {
00168         gppuaddr = MCP23017_GPPUB;
00169         p -= 8;
00170     }
00171 
00172     // read the current pullup resistor set
00173     _buffer = new char[1]();
00174     _buffer[0] = gppuaddr;
00175     _master->write(MCP23017_ADDRESS, _buffer, 1);
00176     delete[] _buffer;
00177     
00178     _buffer = new char[1]();
00179     _master->read(MCP23017_ADDRESS, _buffer, 1);
00180     gppu = _buffer[0];
00181     delete[] _buffer;
00182 
00183     // set the pin and direction
00184     if (pullup_anable) {
00185         gppu |= 1 << p;
00186     } else {
00187         gppu &= ~(1 << p);
00188     }
00189 
00190     // write the new GPIO
00191     _buffer = new char[2]();
00192     _buffer[0] = gppuaddr;
00193     _buffer[1] = gppu;
00194     _master->write(MCP23017_ADDRESS, _buffer, 2);
00195     delete[] _buffer;
00196     
00197 }
00198 
00199 uint8_t Adafruit_MCP23017::digitalRead(uint8_t p)
00200 {
00201     uint8_t gpioaddr;
00202 
00203     // only 16 bits!
00204     if (p > 15){
00205         error("mcp23017 : it is a pin number which is not defined.\r\n");
00206         return 0;
00207     }
00208     
00209     if (p < 8)
00210         gpioaddr = MCP23017_GPIOA;
00211     else {
00212         gpioaddr = MCP23017_GPIOB;
00213         p -= 8;
00214     }
00215 
00216     // read the current GPIO
00217     
00218     _buffer = new char[1]();
00219     _buffer[0] = gpioaddr;
00220     _master->write(MCP23017_ADDRESS, _buffer, 1);
00221     
00222     _buffer[0] = 0;
00223     
00224     uint8_t gpio;
00225     _master->read(MCP23017_ADDRESS, _buffer, 1);
00226     gpio = _buffer[0];
00227     
00228     delete[] _buffer;
00229     return (gpio >> p) & 0x1;
00230 }
00231