// https://docs.arduino.cc/built-in-examples/display/RowColumnScanning/
// https://forum.arduino.cc/t/form-a-digit-on-a-led-matrix/1231824
// https://forum.arduino.cc/t/led-matrix-not-working-properly/1244654
// https://forum.arduino.cc/t/connect-many-leds-to-the-board/1301617
byte aPin[] = {18, 17, 16, 15, 14, 12, 11, 10}; // anode pins
byte cPin[] = { 9, 8, 7, 6, 5, 4, 3, 2}; // cathode pins
bool once;
int x, y, xdir, ydir;
void setup() {
randomSeed(analogRead(A0));
for (int i = 0; i < sizeof(aPin); i++) {
pinMode(aPin[i], OUTPUT);
digitalWrite(aPin[i], LOW);
}
for (int i = 0; i < sizeof(cPin); i++) {
pinMode(cPin[i], OUTPUT);
digitalWrite(cPin[i], HIGH);
}
clearMatrix();
}
void loop() {
// dvd();
randomLED();
// firstLast();
}
void clearMatrix() { // reverse bias LEDs
for (int i = 0; i < sizeof(aPin); i++) {
digitalWrite(aPin[i], LOW); // Anodes off
}
for (int i = 0; i < sizeof(cPin); i++) {
digitalWrite(cPin[i], HIGH); // Cathodes off
}
}
void randomLED() {
clearMatrix();
digitalWrite(aPin[random(sizeof(aPin))], HIGH); // random column
digitalWrite(cPin[random(sizeof(cPin))], LOW); // random row
delay(250); // if they match, stay lit briefly
}
void firstLast() { // causes opposite corner LEDs to turn ON unless cycled off/on
clearMatrix();
digitalWrite(aPin[0], HIGH);
digitalWrite(cPin[0], LOW);
clearMatrix();
digitalWrite(aPin[sizeof(aPin) - 1], HIGH);
digitalWrite(cPin[sizeof(cPin) - 1], LOW);
}
void dvd() {
if (!once) {
once = 1;
x = random(8), y = random(8), xdir = 1, ydir = 1;
}
x = x + xdir;
y = y + ydir;
if (x == 7 || x == 0) xdir = -xdir;
if (y == 6 || y == 1) ydir = -ydir;
digitalWrite(aPin[x], HIGH);
digitalWrite(cPin[y], LOW);
delay(250);
clearMatrix();
}