188 lines
3.7 KiB
C++
188 lines
3.7 KiB
C++
/***************************************************
|
|
This is a library for the MCP23008 i2c port expander
|
|
|
|
These displays use I2C to communicate, 2 pins are required to
|
|
interface
|
|
Adafruit invests time and resources providing this open source code,
|
|
please support Adafruit and open-source hardware by purchasing
|
|
products from Adafruit!
|
|
|
|
Written by Limor Fried/Ladyada for Adafruit Industries.
|
|
BSD license, all text above must be included in any redistribution
|
|
****************************************************/
|
|
|
|
#if ARDUINO >= 100
|
|
#include "Arduino.h"
|
|
#else
|
|
#include "WProgram.h"
|
|
#endif
|
|
#ifdef __AVR_ATtiny85__
|
|
#include <TinyWireM.h>
|
|
#define Wire TinyWireM
|
|
#else
|
|
#include <Wire.h>
|
|
#endif
|
|
|
|
#ifdef __AVR
|
|
#include <avr/pgmspace.h>
|
|
#elif defined(ESP8266)
|
|
#include <pgmspace.h>
|
|
#endif
|
|
#include "Adafruit_MCP23008.h"
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// RTC_DS1307 implementation
|
|
|
|
void Adafruit_MCP23008::begin(uint8_t addr) {
|
|
if (addr > 7) {
|
|
addr = 7;
|
|
}
|
|
i2caddr = addr;
|
|
|
|
Wire.begin();
|
|
|
|
// set defaults!
|
|
Wire.beginTransmission(MCP23008_ADDRESS | i2caddr);
|
|
#if ARDUINO >= 100
|
|
Wire.write((byte)MCP23008_IODIR);
|
|
Wire.write((byte)0xFF); // all inputs
|
|
Wire.write((byte)0x00);
|
|
Wire.write((byte)0x00);
|
|
Wire.write((byte)0x00);
|
|
Wire.write((byte)0x00);
|
|
Wire.write((byte)0x00);
|
|
Wire.write((byte)0x00);
|
|
Wire.write((byte)0x00);
|
|
Wire.write((byte)0x00);
|
|
Wire.write((byte)0x00);
|
|
#else
|
|
Wire.send(MCP23008_IODIR);
|
|
Wire.send(0xFF); // all inputs
|
|
Wire.send(0x00);
|
|
Wire.send(0x00);
|
|
Wire.send(0x00);
|
|
Wire.send(0x00);
|
|
Wire.send(0x00);
|
|
Wire.send(0x00);
|
|
Wire.send(0x00);
|
|
Wire.send(0x00);
|
|
Wire.send(0x00);
|
|
#endif
|
|
Wire.endTransmission();
|
|
|
|
}
|
|
|
|
void Adafruit_MCP23008::begin(void) {
|
|
begin(0);
|
|
}
|
|
|
|
void Adafruit_MCP23008::pinMode(uint8_t p, uint8_t d) {
|
|
uint8_t iodir;
|
|
|
|
|
|
// only 8 bits!
|
|
if (p > 7)
|
|
return;
|
|
|
|
iodir = read8(MCP23008_IODIR);
|
|
|
|
// set the pin and direction
|
|
if (d == INPUT) {
|
|
iodir |= 1 << p;
|
|
} else {
|
|
iodir &= ~(1 << p);
|
|
}
|
|
|
|
// write the new IODIR
|
|
write8(MCP23008_IODIR, iodir);
|
|
}
|
|
|
|
uint8_t Adafruit_MCP23008::readGPIO(void) {
|
|
// read the current GPIO input
|
|
return read8(MCP23008_GPIO);
|
|
}
|
|
|
|
void Adafruit_MCP23008::writeGPIO(uint8_t gpio) {
|
|
write8(MCP23008_GPIO, gpio);
|
|
}
|
|
|
|
|
|
void Adafruit_MCP23008::digitalWrite(uint8_t p, uint8_t d) {
|
|
uint8_t gpio;
|
|
|
|
// only 8 bits!
|
|
if (p > 7)
|
|
return;
|
|
|
|
// read the current GPIO output latches
|
|
gpio = readGPIO();
|
|
|
|
// set the pin and direction
|
|
if (d == HIGH) {
|
|
gpio |= 1 << p;
|
|
} else {
|
|
gpio &= ~(1 << p);
|
|
}
|
|
|
|
// write the new GPIO
|
|
writeGPIO(gpio);
|
|
}
|
|
|
|
void Adafruit_MCP23008::pullUp(uint8_t p, uint8_t d) {
|
|
uint8_t gppu;
|
|
|
|
// only 8 bits!
|
|
if (p > 7)
|
|
return;
|
|
|
|
gppu = read8(MCP23008_GPPU);
|
|
// set the pin and direction
|
|
if (d == HIGH) {
|
|
gppu |= 1 << p;
|
|
} else {
|
|
gppu &= ~(1 << p);
|
|
}
|
|
// write the new GPIO
|
|
write8(MCP23008_GPPU, gppu);
|
|
}
|
|
|
|
uint8_t Adafruit_MCP23008::digitalRead(uint8_t p) {
|
|
// only 8 bits!
|
|
if (p > 7)
|
|
return 0;
|
|
|
|
// read the current GPIO
|
|
return (readGPIO() >> p) & 0x1;
|
|
}
|
|
|
|
uint8_t Adafruit_MCP23008::read8(uint8_t addr) {
|
|
Wire.beginTransmission(MCP23008_ADDRESS | i2caddr);
|
|
#if ARDUINO >= 100
|
|
Wire.write((byte)addr);
|
|
#else
|
|
Wire.send(addr);
|
|
#endif
|
|
Wire.endTransmission();
|
|
Wire.requestFrom(MCP23008_ADDRESS | i2caddr, 1);
|
|
|
|
#if ARDUINO >= 100
|
|
return Wire.read();
|
|
#else
|
|
return Wire.receive();
|
|
#endif
|
|
}
|
|
|
|
|
|
void Adafruit_MCP23008::write8(uint8_t addr, uint8_t data) {
|
|
Wire.beginTransmission(MCP23008_ADDRESS | i2caddr);
|
|
#if ARDUINO >= 100
|
|
Wire.write((byte)addr);
|
|
Wire.write((byte)data);
|
|
#else
|
|
Wire.send(addr);
|
|
Wire.send(data);
|
|
#endif
|
|
Wire.endTransmission();
|
|
}
|