From 1cdc07778ecd1614902df95a6719e38e8964e6ee Mon Sep 17 00:00:00 2001 From: unlockable Date: Thu, 24 Aug 2023 17:14:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=90=E5=8A=9F=E7=82=B9=E4=BA=AE=EF=BC=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 8By8/8By8.ino | 78 ++++++++++++++++++++++++++++++++++++ Test/Test.ino | 107 +++++++++++++++++--------------------------------- 2 files changed, 114 insertions(+), 71 deletions(-) create mode 100644 8By8/8By8.ino diff --git a/8By8/8By8.ino b/8By8/8By8.ino new file mode 100644 index 0000000..09df817 --- /dev/null +++ b/8By8/8By8.ino @@ -0,0 +1,78 @@ +#include "TimerOne.h" + +#define TIME_PER_LAYER_IN_US 700 +#define BUS_START_PIN 22 +#define CLOCK_START_PIN 30 +#define SW_START_PIN 38 + +class Cube { +private: + static int layer_count; + static int brightness_count; + +public: + // Every int represents a row of 8 LED status. + static int LED_status[8][8]; + + static void display() { + // Serial.println("Here"); + if (brightness_count >= 2) { + digitalWrite(SW_START_PIN + layer_count, LOW); + layer_count = (layer_count + 1) % 8; + } + + brightness_count = (brightness_count + 1) % 3; + + for (int i = 0; i < 8; i++) { + for (int j = 0; j < 8; j++) { + // In LED_status: + // 0 = off + // 4 = brightest + digitalWrite(BUS_START_PIN + j, ((LED_status[layer_count][i] >> (j * 2)) & 3) >= (3 - brightness_count)); + } + digitalWrite(CLOCK_START_PIN + i, HIGH); + digitalWrite(CLOCK_START_PIN + i, LOW); + } + + digitalWrite(SW_START_PIN + layer_count, HIGH); + } + + static void set_status(int x, int y, int z, int brightness) { + x %= 8; + y %= 8; + z %= 8; + brightness %= 4; + LED_status[z][x] = (LED_status[z][x] & (~(3 << (y * 2)))) | (brightness << (y * 2)); + } +}; + +int Cube::layer_count = 0; +int Cube::brightness_count = 0; +int Cube::LED_status[8][8] = {0}; +int bright = 3; + +void setup() { + for (int i = 22; i < 46; i++) { + pinMode(i, OUTPUT); + } + + Timer1.initialize(); + Timer1.setPeriod(TIME_PER_LAYER_IN_US); + Timer1.attachInterrupt(Cube::display); + + Serial.begin(115200); + +} + +void loop() { + + for (int i = 7; i >= 0; i--) { + for (int j = 0; j < 8; j++) { + for (int k = 0; k < 8; k++) { + Cube::set_status(i, j, k, bright); + delay(5); + } + } + } + bright = (bright + 1) % 4; +} \ No newline at end of file diff --git a/Test/Test.ino b/Test/Test.ino index 05b2bbb..d1e46d0 100644 --- a/Test/Test.ino +++ b/Test/Test.ino @@ -1,85 +1,50 @@ -#include "TimerOne.h" - -const byte cath_low = 3, cath_high = 2; -const byte anode_start = 4; +byte status = 0; +byte layer = 0; void setup() { - pinMode(cath_low, OUTPUT); - pinMode(cath_high, OUTPUT); - for (int i = 0; i < 4; i++) { - pinMode(anode_start + i, OUTPUT); + Serial.begin(115200); + for (int i = 0; i < 8; i++) { + pinMode(22 + i, OUTPUT); + } + // pinMode(30, OUTPUT); + // pinMode(31, OUTPUT); + + for (int i = 0; i < 8; i++) { + pinMode(30 + i, OUTPUT); } - Serial.begin(115200); - - Timer1.initialize(); - Timer1.setPeriod(1000); - Timer1.attachInterrupt(displayOneLayer); + for (int i = 0; i < 8; i++) { + pinMode(38 + i, OUTPUT); + } } -byte LED_status = 0; -byte currentDisplayLayer = 0; +int column = 0; void loop() { - // if (Serial.available()) { - // char input = Serial.read(); - // if (input >= '0' && input < '9') { - // int LED_num = input - '0'; - // LED_status ^= 1 << LED_num; - // } - // } - // for (int i = 0; i < 8; i++) { - // LED_status ^= 1 << i; - // delay(75); - // } + if (Serial.available()) { + int num = Serial.read(); + if (num >= '0' && num <= '7') { + num = num - '0'; + status ^= 1 << num; - int count = 0; - while (true) { - randomSeed(analogRead(0)); - int num = random(0, 8); - if (!(LED_status & (1 << num))) { - count++; - LED_status ^= 1 << num; - delay(100); - } - if (count >= 8) { - break; - } - } + for (int i = 0; i < 8; i++) { + digitalWrite(22 + i, status >> i & 1); + } - delay(500); - - while (true) { - randomSeed(analogRead(0)); - int num = random(0, 8); - if (LED_status & (1 << num)) { - count--; - LED_status ^= 1 << num; - delay(100); + Serial.println(status, BIN); + } else if (num >= 'a' && num <= 'h') { + num = num - 'a'; + column = num; + Serial.print("LOAD"); + Serial.print(num); + Serial.println(status, BIN); + digitalWrite(30 + column, HIGH); + digitalWrite(30 + column, LOW); } - - if (count <= 0) { - break; + else if (num == 'z') { + digitalWrite(38 + layer, LOW); + layer = (layer + 1) % 8; + digitalWrite(38 + layer, HIGH); } } - - delay(500); -} - -void displayOneLayer() { - // Serial.println(LED_status, BIN); - currentDisplayLayer = (currentDisplayLayer + 1) % 2; - if (currentDisplayLayer == 0) { - digitalWrite(cath_high, LOW); - for (int i = 0; i < 4; i++) { - digitalWrite(anode_start + i, (LED_status >> i) & 1); - } - digitalWrite(cath_low, HIGH); - } else { - digitalWrite(cath_low, LOW); - for (int i = 0; i < 4; i++) { - digitalWrite(anode_start + i, (LED_status >> (i + 4)) & 1); - } - digitalWrite(cath_high, HIGH); - } } \ No newline at end of file