Port of the Adafruit_IS31FL3731 library for Arduino. Enables control of the feather Charliewing LED Matrix peripheral board. Makes use of the I2Cdev library for I2C.
Dependencies: I2Cdev_MAX32630FTHR
Defaulty uses pinmap for the Maxim 32630FTHR Pegasus board. For a different board, change pin definitions in I2Cdev.h
Adafruit_IS31FL3731.cpp
- Committer:
- DVLevine
- Date:
- 2018-03-13
- Revision:
- 0:9a73d45a17de
- Child:
- 3:0da61b470b86
File content as of revision 0:9a73d45a17de:
#include "Adafruit_IS31FL3731.h" #include "Adafruit_GFX.h" #ifndef _swap_int16_t #define _swap_int16_t(a, b) { int16_t t = a; a = b; b = t; } #endif /* Constructor */ /*Adafruit_IS31FL3731::Adafruit_IS31FL3731(uint8_t x, uint8_t y) : Adafruit_GFX(x, y) { //myI2C = theI2C; I2Cdev* myDevI2C = new I2Cdev(); myI2C = myDevI2C; } Adafruit_IS31FL3731_Wing::Adafruit_IS31FL3731_Wing() : Adafruit_IS31FL3731(15, 7) { //myI2C = theI2C; //myDevI2C I2Cdev* myDevI2C = new I2Cdev(); myI2C = myDevI2C; }*/ bool Adafruit_IS31FL3731::begin(uint8_t addr) { //Wire.begin(); _i2caddr = addr; _frame = 0; // shutdown writeRegister8(ISSI_BANK_FUNCTIONREG, ISSI_REG_SHUTDOWN, 0x00); //delay(10); wait(0.01); // out of shutdown writeRegister8(ISSI_BANK_FUNCTIONREG, ISSI_REG_SHUTDOWN, 0x01); // picture mode writeRegister8(ISSI_BANK_FUNCTIONREG, ISSI_REG_CONFIG, ISSI_REG_CONFIG_PICTUREMODE); displayFrame(_frame); // all LEDs on & 0 PWM clear(); // set each led to 0 PWM for (uint8_t f=0; f<8; f++) { for (uint8_t i=0; i<=0x11; i++) writeRegister8(f, i, 0xff); // each 8 LEDs on } audioSync(false); return true; } void Adafruit_IS31FL3731::clear(void) { // all LEDs on & 0 PWM selectBank(_frame); uint8_t nemo[24] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; for (uint8_t i=0; i<6; i++) { // Wire.beginTransmission(_i2caddr); // Wire.write((byte) 0x24+i*24); // write 24 bytes at once myI2C->writeBytes(_i2caddr, 0x24+i*24, 24, nemo); /* for (uint8_t j=0; j<24; j++) { // Wire.write((byte) 0); myI2C->writeByte(_i2caddr, (unsigned char)0x24+i*24, (unsigned char)0); }*/ // Wire.endTransmission(); } } void Adafruit_IS31FL3731::setLEDPWM(uint8_t lednum, uint8_t pwm, uint8_t bank) { if (lednum >= 144) return; writeRegister8(bank, 0x24+lednum, pwm); } void Adafruit_IS31FL3731_Wing::drawPixel(int16_t x, int16_t y, uint16_t color) { // check rotation, move pixel around if necessary //myboss->printf("WING %i x %i y %i color\n",x,y,color); switch (getRotation()) { case 1: _swap_int16_t(x, y); x = 15 - x - 1; break; case 2: x = 15 - x - 1; y = 7 - y - 1; break; case 3: _swap_int16_t(x, y); y = 9 - y - 1; break; } // charlie wing is smaller: if ((x < 0) || (x >= 16) || (y < 0) || (y >= 7)) return; if (x > 7) { x=15-x; y += 8; } else { y = 7-y; } _swap_int16_t(x, y); if (color > 255) color = 255; // PWM 8bit max setLEDPWM(x + y*16, color, _frame); return; } void Adafruit_IS31FL3731::drawPixel(int16_t x, int16_t y, uint16_t color) { // check rotation, move pixel around if necessary // myboss->printf("%i x %i y %i color\n",x,y,color); switch (getRotation()) { case 1: _swap_int16_t(x, y); x = 16 - x - 1; break; case 2: x = 16 - x - 1; y = 9 - y - 1; break; case 3: _swap_int16_t(x, y); y = 9 - y - 1; break; } if ((x < 0) || (x >= 16)) return; if ((y < 0) || (y >= 9)) return; if (color > 255) color = 255; // PWM 8bit max setLEDPWM(x + y*16, color, _frame); return; } void Adafruit_IS31FL3731::setFrame(uint8_t f) { _frame = f; } void Adafruit_IS31FL3731::displayFrame(uint8_t f) { if (f > 7) f = 0; writeRegister8(ISSI_BANK_FUNCTIONREG, ISSI_REG_PICTUREFRAME, f); } void Adafruit_IS31FL3731::selectBank(uint8_t b) { myI2C->writeByte(_i2caddr, ISSI_COMMANDREGISTER, b); /*Wire.beginTransmission(_i2caddr); Wire.write((byte)ISSI_COMMANDREGISTER); Wire.write(b); Wire.endTransmission();*/ } void Adafruit_IS31FL3731::audioSync(bool sync) { if (sync) { writeRegister8(ISSI_BANK_FUNCTIONREG, ISSI_REG_AUDIOSYNC, 0x1); } else { writeRegister8(ISSI_BANK_FUNCTIONREG, ISSI_REG_AUDIOSYNC, 0x0); } } /*************/ void Adafruit_IS31FL3731::writeRegister8(uint8_t b, uint8_t reg, uint8_t data) { selectBank(b); myI2C->writeByte(_i2caddr, reg, data); /*Wire.beginTransmission(_i2caddr); Wire.write((byte)reg); Wire.write((byte)data); Wire.endTransmission();*/ //Serial.print("$"); Serial.print(reg, HEX); //Serial.print(" = 0x"); Serial.println(data, HEX); } uint8_t Adafruit_IS31FL3731::readRegister8(uint8_t bank, uint8_t reg) { uint8_t x; uint8_t status; selectBank(bank); /* Wire.beginTransmission(_i2caddr); Wire.write((byte)reg); Wire.endTransmission(); Wire.beginTransmission(_i2caddr); Wire.requestFrom(_i2caddr, (byte)1); x = Wire.read();*/ status = myI2C->readByte(_i2caddr, reg, &x); //Wire.endTransmission(); // Serial.print("$"); Serial.print(reg, HEX); // Serial.print(": 0x"); Serial.println(x, HEX); return x; }