diff --git a/4By4/4By4.ino b/4By4/4By4.ino new file mode 100644 index 0000000..1ca12c3 --- /dev/null +++ b/4By4/4By4.ino @@ -0,0 +1,67 @@ +#include "TimerOne.h" +#define TIME_PER_LAYER_IN_US 750 +#define ANODE_START_PIN 22 +#define CATHODE_START_PIN 8 + +int LED_status[4] = {0}; // 16 bit * 4 +byte current_layer = 0; + +void setup() { + Serial.begin(115200); + Timer1.initialize(); + Timer1.setPeriod(TIME_PER_LAYER_IN_US); + Timer1.attachInterrupt(drawOneLayer); + for (int i = 0; i < 16; i++) { + pinMode(ANODE_START_PIN + i, OUTPUT); + } + + for (int i = 0; i < 4; i++) { + pinMode(CATHODE_START_PIN + i, OUTPUT); + } + + randomSeed(analogRead(0)); +} + +void loop() { + // for (int i = 0; i < 4; i++) { + // for (int j = 0; j < 16; j++) { + // LED_status[i] ^= 1 << j; + // delay(500); + // } + // } + + int count = 0; + while (count < 64) { + int num = random(64); + if ((LED_status[num / 16] >> (num % 16) ) & 1) { + continue; + } + LED_status[num / 16] ^= 1 << (num % 16); + delay(50); + count++; + } + + delay(1000); + + while (count > 0) { + int num = random(64); + if ((LED_status[num / 16] >> (num % 16) ) & 1) { + LED_status[num / 16] ^= 1 << (num % 16); + delay(50); + count--; + } + } + + delay(1000); +} + +void drawOneLayer() { + digitalWrite(CATHODE_START_PIN + current_layer, LOW); + + current_layer = (current_layer + 1) % 4; + for (int j = 0; j < 16; j++) { + digitalWrite(ANODE_START_PIN + j, (LED_status[current_layer] >> j) & 1); + } + + digitalWrite(CATHODE_START_PIN + current_layer, HIGH); +} \ No newline at end of file