transplanted from the original URL : https://github.com/adafruit/Adafruit-RGB-LCD-Shield-Library
Embed:
(wiki syntax)
Show/hide line numbers
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
Generated on Mon Jul 18 2022 20:57:22 by
![doxygen](doxygen.png)