#include #define RX_ADDR 0x20 //The LED Matrix I2C address for receiving images int ROW_LT = 8; //PB0 int ROW_CLK = 9; //PB1 int ROW_IN = 10; //PB2 int COL_LT = 7; //PD7 int COL_CLK = 6; //PD6 int COL_IN = 5; //PD5 byte img[32]; bool updated; void rowSelect(short input) { byte firstHalf = (byte) ((input >> 8) & 255); byte secondHalf = (byte) (input & 255); shiftOut(COL_IN, COL_CLK, MSBFIRST, secondHalf); shiftOut(COL_IN, COL_CLK, MSBFIRST, firstHalf); } void colSelect(short input) { byte firstHalf = (byte) ((input >> 8) & 255); byte secondHalf = (byte) (input & 255); shiftOut(ROW_IN, ROW_CLK, MSBFIRST, secondHalf); shiftOut(ROW_IN, ROW_CLK, MSBFIRST, firstHalf); } void dispOff() { digitalWrite(ROW_LT, 0); digitalWrite(COL_LT, 0); } void dispOn() { digitalWrite(ROW_LT, 1); digitalWrite(COL_LT, 1); } void setup() { pinMode(ROW_LT, OUTPUT); pinMode(ROW_CLK, OUTPUT); pinMode(ROW_IN, OUTPUT); pinMode(COL_LT, OUTPUT); pinMode(COL_CLK, OUTPUT); pinMode(COL_IN, OUTPUT); dispOff(); rowSelect(0); colSelect(0); Wire.begin(RX_ADDR); Wire.onReceive(updateImage); memset(img, 0, 32); updated = false; } void loop() { dispOff(); rowSelect(0); colSelect(0); dispOn(); updated = false; for (int i = 0; i <= 15; i++) { if (updated) { break; } dispOff(); short firstByte = (short) img[i * 2]; short secondByte = (short) img[(i * 2) + 1]; short total = (firstByte << 8) | secondByte; colSelect(total); rowSelect(1 << i); dispOn(); } } void updateImage(int howMany) { int index = 0; while (Wire.available()) { byte c = Wire.read(); img[index] = c; index++; if (index == 32) { break; } } updated = true; }