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

Committer:
Komazawa_sun
Date:
Mon Nov 19 09:44:37 2018 +0000
Revision:
0:4f1c764a42d3
Transplanted lib(https://github.com/adafruit/Adafruit-RGB-LCD-Shield-Library)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Komazawa_sun 0:4f1c764a42d3 1 /***************************************************
Komazawa_sun 0:4f1c764a42d3 2 This is a library for the MCP23017 i2c port expander
Komazawa_sun 0:4f1c764a42d3 3
Komazawa_sun 0:4f1c764a42d3 4 These displays use I2C to communicate, 2 pins are required to
Komazawa_sun 0:4f1c764a42d3 5 interface
Komazawa_sun 0:4f1c764a42d3 6 Adafruit invests time and resources providing this open source code,
Komazawa_sun 0:4f1c764a42d3 7 please support Adafruit and open-source hardware by purchasing
Komazawa_sun 0:4f1c764a42d3 8 products from Adafruit!
Komazawa_sun 0:4f1c764a42d3 9
Komazawa_sun 0:4f1c764a42d3 10 Written by Limor Fried/Ladyada for Adafruit Industries.
Komazawa_sun 0:4f1c764a42d3 11 BSD license, all text above must be included in any redistribution
Komazawa_sun 0:4f1c764a42d3 12 ****************************************************/
Komazawa_sun 0:4f1c764a42d3 13
Komazawa_sun 0:4f1c764a42d3 14 #include "Adafruit_MCP23017.h"
Komazawa_sun 0:4f1c764a42d3 15
Komazawa_sun 0:4f1c764a42d3 16 Adafruit_MCP23017::Adafruit_MCP23017(I2C *master)
Komazawa_sun 0:4f1c764a42d3 17 {
Komazawa_sun 0:4f1c764a42d3 18 _master = master;
Komazawa_sun 0:4f1c764a42d3 19
Komazawa_sun 0:4f1c764a42d3 20
Komazawa_sun 0:4f1c764a42d3 21 // set defaults!
Komazawa_sun 0:4f1c764a42d3 22
Komazawa_sun 0:4f1c764a42d3 23 _buffer = new char[2]();
Komazawa_sun 0:4f1c764a42d3 24 _buffer[0] = MCP23017_IODIRA;
Komazawa_sun 0:4f1c764a42d3 25 _buffer[1] = 0xFF;
Komazawa_sun 0:4f1c764a42d3 26 _master->write(MCP23017_ADDRESS, _buffer, 2); // all inputs on port A
Komazawa_sun 0:4f1c764a42d3 27 _buffer[0] = MCP23017_IODIRB;
Komazawa_sun 0:4f1c764a42d3 28 _buffer[1] = 0xFF;
Komazawa_sun 0:4f1c764a42d3 29 _master->write(MCP23017_ADDRESS, _buffer, 2); // all inputs on port B
Komazawa_sun 0:4f1c764a42d3 30 delete[] _buffer;
Komazawa_sun 0:4f1c764a42d3 31 }
Komazawa_sun 0:4f1c764a42d3 32
Komazawa_sun 0:4f1c764a42d3 33 ////////////////////////////////////////////////////////////////////////////////
Komazawa_sun 0:4f1c764a42d3 34
Komazawa_sun 0:4f1c764a42d3 35 void Adafruit_MCP23017::pinMode(uint8_t p, bool input_mode)
Komazawa_sun 0:4f1c764a42d3 36 {
Komazawa_sun 0:4f1c764a42d3 37 uint8_t iodir;
Komazawa_sun 0:4f1c764a42d3 38 uint8_t iodiraddr;
Komazawa_sun 0:4f1c764a42d3 39
Komazawa_sun 0:4f1c764a42d3 40 // only 16 bits!
Komazawa_sun 0:4f1c764a42d3 41 if (p > 15){
Komazawa_sun 0:4f1c764a42d3 42 error("mcp23017 : it is a pin number which is not defined.\r\n");
Komazawa_sun 0:4f1c764a42d3 43 return;
Komazawa_sun 0:4f1c764a42d3 44 }
Komazawa_sun 0:4f1c764a42d3 45
Komazawa_sun 0:4f1c764a42d3 46 if (p < 8)
Komazawa_sun 0:4f1c764a42d3 47 iodiraddr = MCP23017_IODIRA;
Komazawa_sun 0:4f1c764a42d3 48 else {
Komazawa_sun 0:4f1c764a42d3 49 iodiraddr = MCP23017_IODIRB;
Komazawa_sun 0:4f1c764a42d3 50 p -= 8;
Komazawa_sun 0:4f1c764a42d3 51 }
Komazawa_sun 0:4f1c764a42d3 52
Komazawa_sun 0:4f1c764a42d3 53 // read the current IODIR
Komazawa_sun 0:4f1c764a42d3 54 _buffer = new char[1]();
Komazawa_sun 0:4f1c764a42d3 55 _buffer[0] = iodiraddr;
Komazawa_sun 0:4f1c764a42d3 56 _master->write(MCP23017_ADDRESS, _buffer, 1);
Komazawa_sun 0:4f1c764a42d3 57 _buffer[0] = 0;
Komazawa_sun 0:4f1c764a42d3 58 _master->read(MCP23017_ADDRESS, _buffer, 1);
Komazawa_sun 0:4f1c764a42d3 59 iodir = _buffer[0];
Komazawa_sun 0:4f1c764a42d3 60 delete[] _buffer;
Komazawa_sun 0:4f1c764a42d3 61
Komazawa_sun 0:4f1c764a42d3 62 // set the pin and direction
Komazawa_sun 0:4f1c764a42d3 63 if (input_mode) {
Komazawa_sun 0:4f1c764a42d3 64 iodir |= 1 << p;
Komazawa_sun 0:4f1c764a42d3 65 } else {
Komazawa_sun 0:4f1c764a42d3 66 iodir &= ~(1 << p);
Komazawa_sun 0:4f1c764a42d3 67 }
Komazawa_sun 0:4f1c764a42d3 68
Komazawa_sun 0:4f1c764a42d3 69 // write the new IODIR
Komazawa_sun 0:4f1c764a42d3 70 _buffer = new char[2]();
Komazawa_sun 0:4f1c764a42d3 71 _buffer[0] = iodiraddr;
Komazawa_sun 0:4f1c764a42d3 72 _buffer[1] = iodir;
Komazawa_sun 0:4f1c764a42d3 73 _master->write(MCP23017_ADDRESS, _buffer, 2);
Komazawa_sun 0:4f1c764a42d3 74 delete[] _buffer;
Komazawa_sun 0:4f1c764a42d3 75 }
Komazawa_sun 0:4f1c764a42d3 76
Komazawa_sun 0:4f1c764a42d3 77 uint16_t Adafruit_MCP23017::readGPIOAB()
Komazawa_sun 0:4f1c764a42d3 78 {
Komazawa_sun 0:4f1c764a42d3 79 uint16_t ba = 0;
Komazawa_sun 0:4f1c764a42d3 80 uint8_t a;
Komazawa_sun 0:4f1c764a42d3 81
Komazawa_sun 0:4f1c764a42d3 82 // read the current GPIO output latches
Komazawa_sun 0:4f1c764a42d3 83 _buffer = new char[1]();
Komazawa_sun 0:4f1c764a42d3 84 _buffer[0] = MCP23017_GPIOA;
Komazawa_sun 0:4f1c764a42d3 85 _master->write(MCP23017_ADDRESS, _buffer, 1);
Komazawa_sun 0:4f1c764a42d3 86 delete[] _buffer;
Komazawa_sun 0:4f1c764a42d3 87
Komazawa_sun 0:4f1c764a42d3 88 _buffer = new char[2]();
Komazawa_sun 0:4f1c764a42d3 89 _master->read(MCP23017_ADDRESS, _buffer, 2);
Komazawa_sun 0:4f1c764a42d3 90 a = _buffer[0];
Komazawa_sun 0:4f1c764a42d3 91 ba = _buffer[1];
Komazawa_sun 0:4f1c764a42d3 92 ba <<= 8;
Komazawa_sun 0:4f1c764a42d3 93 ba |= a;
Komazawa_sun 0:4f1c764a42d3 94 delete[] _buffer;
Komazawa_sun 0:4f1c764a42d3 95
Komazawa_sun 0:4f1c764a42d3 96 return ba;
Komazawa_sun 0:4f1c764a42d3 97 }
Komazawa_sun 0:4f1c764a42d3 98
Komazawa_sun 0:4f1c764a42d3 99 void Adafruit_MCP23017::writeGPIOAB(uint16_t ba)
Komazawa_sun 0:4f1c764a42d3 100 {
Komazawa_sun 0:4f1c764a42d3 101 _buffer = new char[3]();
Komazawa_sun 0:4f1c764a42d3 102 _buffer[0] = MCP23017_GPIOA;
Komazawa_sun 0:4f1c764a42d3 103 _buffer[1] = ba & 0xFF;
Komazawa_sun 0:4f1c764a42d3 104 _buffer[2] = ba >> 8;
Komazawa_sun 0:4f1c764a42d3 105 _master->write(MCP23017_ADDRESS, _buffer, 3);
Komazawa_sun 0:4f1c764a42d3 106 delete[] _buffer;
Komazawa_sun 0:4f1c764a42d3 107 }
Komazawa_sun 0:4f1c764a42d3 108
Komazawa_sun 0:4f1c764a42d3 109 void Adafruit_MCP23017::digitalWrite(uint8_t p, bool high)
Komazawa_sun 0:4f1c764a42d3 110 {
Komazawa_sun 0:4f1c764a42d3 111 uint8_t gpio;
Komazawa_sun 0:4f1c764a42d3 112 uint8_t gpioaddr, olataddr;
Komazawa_sun 0:4f1c764a42d3 113
Komazawa_sun 0:4f1c764a42d3 114 if (p > 15){
Komazawa_sun 0:4f1c764a42d3 115 error("mcp23017 : it is a pin number which is not defined.\r\n");
Komazawa_sun 0:4f1c764a42d3 116 return;
Komazawa_sun 0:4f1c764a42d3 117 }
Komazawa_sun 0:4f1c764a42d3 118
Komazawa_sun 0:4f1c764a42d3 119 if (p < 8) {
Komazawa_sun 0:4f1c764a42d3 120 olataddr = MCP23017_OLATA;
Komazawa_sun 0:4f1c764a42d3 121 gpioaddr = MCP23017_GPIOA;
Komazawa_sun 0:4f1c764a42d3 122 } else {
Komazawa_sun 0:4f1c764a42d3 123 olataddr = MCP23017_OLATB;
Komazawa_sun 0:4f1c764a42d3 124 gpioaddr = MCP23017_GPIOB;
Komazawa_sun 0:4f1c764a42d3 125 p -= 8;
Komazawa_sun 0:4f1c764a42d3 126 }
Komazawa_sun 0:4f1c764a42d3 127
Komazawa_sun 0:4f1c764a42d3 128 // read the current GPIO output latches
Komazawa_sun 0:4f1c764a42d3 129 _buffer = new char[1]();
Komazawa_sun 0:4f1c764a42d3 130 _buffer[0] = olataddr;
Komazawa_sun 0:4f1c764a42d3 131 _master->write(MCP23017_ADDRESS,_buffer , 1);
Komazawa_sun 0:4f1c764a42d3 132 delete[] _buffer;
Komazawa_sun 0:4f1c764a42d3 133
Komazawa_sun 0:4f1c764a42d3 134 _buffer = new char[1]();
Komazawa_sun 0:4f1c764a42d3 135 _master->read(MCP23017_ADDRESS, _buffer, 1);
Komazawa_sun 0:4f1c764a42d3 136 gpio = _buffer[0];
Komazawa_sun 0:4f1c764a42d3 137 delete[] _buffer;
Komazawa_sun 0:4f1c764a42d3 138
Komazawa_sun 0:4f1c764a42d3 139 // set the pin and direction
Komazawa_sun 0:4f1c764a42d3 140 if (high) {
Komazawa_sun 0:4f1c764a42d3 141 gpio |= 1 << p;
Komazawa_sun 0:4f1c764a42d3 142 } else {
Komazawa_sun 0:4f1c764a42d3 143 gpio &= ~(1 << p);
Komazawa_sun 0:4f1c764a42d3 144 }
Komazawa_sun 0:4f1c764a42d3 145
Komazawa_sun 0:4f1c764a42d3 146 // write the new GPIO
Komazawa_sun 0:4f1c764a42d3 147 _buffer = new char[2]();
Komazawa_sun 0:4f1c764a42d3 148 _buffer[0] = gpioaddr;
Komazawa_sun 0:4f1c764a42d3 149 _buffer[1] = gpio;
Komazawa_sun 0:4f1c764a42d3 150 _master->write(MCP23017_ADDRESS, _buffer, 2);
Komazawa_sun 0:4f1c764a42d3 151 delete[] _buffer;
Komazawa_sun 0:4f1c764a42d3 152 }
Komazawa_sun 0:4f1c764a42d3 153
Komazawa_sun 0:4f1c764a42d3 154 void Adafruit_MCP23017::pullUp(uint8_t p, bool pullup_anable)
Komazawa_sun 0:4f1c764a42d3 155 {
Komazawa_sun 0:4f1c764a42d3 156 uint8_t gppu;
Komazawa_sun 0:4f1c764a42d3 157 uint8_t gppuaddr;
Komazawa_sun 0:4f1c764a42d3 158
Komazawa_sun 0:4f1c764a42d3 159 // only 16 bits!
Komazawa_sun 0:4f1c764a42d3 160 if (p > 15){
Komazawa_sun 0:4f1c764a42d3 161 error("mcp23017 : it is a pin number which is not defined.\r\n");
Komazawa_sun 0:4f1c764a42d3 162 return;
Komazawa_sun 0:4f1c764a42d3 163 }
Komazawa_sun 0:4f1c764a42d3 164
Komazawa_sun 0:4f1c764a42d3 165 if (p < 8)
Komazawa_sun 0:4f1c764a42d3 166 gppuaddr = MCP23017_GPPUA;
Komazawa_sun 0:4f1c764a42d3 167 else {
Komazawa_sun 0:4f1c764a42d3 168 gppuaddr = MCP23017_GPPUB;
Komazawa_sun 0:4f1c764a42d3 169 p -= 8;
Komazawa_sun 0:4f1c764a42d3 170 }
Komazawa_sun 0:4f1c764a42d3 171
Komazawa_sun 0:4f1c764a42d3 172 // read the current pullup resistor set
Komazawa_sun 0:4f1c764a42d3 173 _buffer = new char[1]();
Komazawa_sun 0:4f1c764a42d3 174 _buffer[0] = gppuaddr;
Komazawa_sun 0:4f1c764a42d3 175 _master->write(MCP23017_ADDRESS, _buffer, 1);
Komazawa_sun 0:4f1c764a42d3 176 delete[] _buffer;
Komazawa_sun 0:4f1c764a42d3 177
Komazawa_sun 0:4f1c764a42d3 178 _buffer = new char[1]();
Komazawa_sun 0:4f1c764a42d3 179 _master->read(MCP23017_ADDRESS, _buffer, 1);
Komazawa_sun 0:4f1c764a42d3 180 gppu = _buffer[0];
Komazawa_sun 0:4f1c764a42d3 181 delete[] _buffer;
Komazawa_sun 0:4f1c764a42d3 182
Komazawa_sun 0:4f1c764a42d3 183 // set the pin and direction
Komazawa_sun 0:4f1c764a42d3 184 if (pullup_anable) {
Komazawa_sun 0:4f1c764a42d3 185 gppu |= 1 << p;
Komazawa_sun 0:4f1c764a42d3 186 } else {
Komazawa_sun 0:4f1c764a42d3 187 gppu &= ~(1 << p);
Komazawa_sun 0:4f1c764a42d3 188 }
Komazawa_sun 0:4f1c764a42d3 189
Komazawa_sun 0:4f1c764a42d3 190 // write the new GPIO
Komazawa_sun 0:4f1c764a42d3 191 _buffer = new char[2]();
Komazawa_sun 0:4f1c764a42d3 192 _buffer[0] = gppuaddr;
Komazawa_sun 0:4f1c764a42d3 193 _buffer[1] = gppu;
Komazawa_sun 0:4f1c764a42d3 194 _master->write(MCP23017_ADDRESS, _buffer, 2);
Komazawa_sun 0:4f1c764a42d3 195 delete[] _buffer;
Komazawa_sun 0:4f1c764a42d3 196
Komazawa_sun 0:4f1c764a42d3 197 }
Komazawa_sun 0:4f1c764a42d3 198
Komazawa_sun 0:4f1c764a42d3 199 uint8_t Adafruit_MCP23017::digitalRead(uint8_t p)
Komazawa_sun 0:4f1c764a42d3 200 {
Komazawa_sun 0:4f1c764a42d3 201 uint8_t gpioaddr;
Komazawa_sun 0:4f1c764a42d3 202
Komazawa_sun 0:4f1c764a42d3 203 // only 16 bits!
Komazawa_sun 0:4f1c764a42d3 204 if (p > 15){
Komazawa_sun 0:4f1c764a42d3 205 error("mcp23017 : it is a pin number which is not defined.\r\n");
Komazawa_sun 0:4f1c764a42d3 206 return 0;
Komazawa_sun 0:4f1c764a42d3 207 }
Komazawa_sun 0:4f1c764a42d3 208
Komazawa_sun 0:4f1c764a42d3 209 if (p < 8)
Komazawa_sun 0:4f1c764a42d3 210 gpioaddr = MCP23017_GPIOA;
Komazawa_sun 0:4f1c764a42d3 211 else {
Komazawa_sun 0:4f1c764a42d3 212 gpioaddr = MCP23017_GPIOB;
Komazawa_sun 0:4f1c764a42d3 213 p -= 8;
Komazawa_sun 0:4f1c764a42d3 214 }
Komazawa_sun 0:4f1c764a42d3 215
Komazawa_sun 0:4f1c764a42d3 216 // read the current GPIO
Komazawa_sun 0:4f1c764a42d3 217
Komazawa_sun 0:4f1c764a42d3 218 _buffer = new char[1]();
Komazawa_sun 0:4f1c764a42d3 219 _buffer[0] = gpioaddr;
Komazawa_sun 0:4f1c764a42d3 220 _master->write(MCP23017_ADDRESS, _buffer, 1);
Komazawa_sun 0:4f1c764a42d3 221
Komazawa_sun 0:4f1c764a42d3 222 _buffer[0] = 0;
Komazawa_sun 0:4f1c764a42d3 223
Komazawa_sun 0:4f1c764a42d3 224 uint8_t gpio;
Komazawa_sun 0:4f1c764a42d3 225 _master->read(MCP23017_ADDRESS, _buffer, 1);
Komazawa_sun 0:4f1c764a42d3 226 gpio = _buffer[0];
Komazawa_sun 0:4f1c764a42d3 227
Komazawa_sun 0:4f1c764a42d3 228 delete[] _buffer;
Komazawa_sun 0:4f1c764a42d3 229 return (gpio >> p) & 0x1;
Komazawa_sun 0:4f1c764a42d3 230 }
Komazawa_sun 0:4f1c764a42d3 231