/*
  Animation data in PROGMEM
  Arduino has limited amount of RAM. For example my UNO based on ATmega328P has only 2KB of RAM.
  Not very much. But it has 32KB of Flash memory. Why not to use it for storing animations?
  No problem. Just push this data into the PROGMEM and then read them.

  翻譯:
  PROGMEM 中的動畫數據
  Arduino 的 RAM 數量有限。 例如我的基於 ATmega328P 的 UNO 只有 2KB 的 RAM。
  不是很多。 但它有 32KB 的閃存。 為什麼不使用它來儲存動畫呢?
  沒問題。 只需將這些資料推入 PROGMEM,然後讀取它們即可。

  網址:https://xantorohara.github.io/led-matrix-editor/#
*/

#include <LedControl.h>

const int DIN_PIN = 7;
const int CS_PIN = 6;
const int CLK_PIN = 5;

const byte IMAGES[][8] = {
  {
    0b11111111,
    0b00000000,
    0b00000000,
    0b10000000,
    0b10000000,
    0b00000000,
    0b00000000,
    0b11111111
  }, {
    0b11111111,
    0b00000000,
    0b00000000,
    0b11000000,
    0b11000000,
    0b00000000,
    0b00000000,
    0b11111111
  }, {
    0b11111111,
    0b00000000,
    0b00000000,
    0b01100000,
    0b01100000,
    0b00000000,
    0b00000000,
    0b11111111
  }, {
    0b11111111,
    0b00000000,
    0b00000000,
    0b00110000,
    0b00110000,
    0b00000000,
    0b00000000,
    0b11111111
  }, {
    0b11111111,
    0b00000000,
    0b00000000,
    0b00011000,
    0b00011000,
    0b00000000,
    0b00000000,
    0b11111111
  }, {
    0b11111111,
    0b00000000,
    0b00000000,
    0b00001100,
    0b00001100,
    0b00000000,
    0b00000000,
    0b11111111
  }, {
    0b11111111,
    0b00000000,
    0b00000000,
    0b00000110,
    0b00000110,
    0b00000000,
    0b00000000,
    0b11111111
  }, {
    0b11111111,
    0b00000000,
    0b00000000,
    0b00000011,
    0b00000011,
    0b00000000,
    0b00000000,
    0b11111111
  }, {
    0b11111111,
    0b00000000,
    0b00000000,
    0b00000001,
    0b00000001,
    0b00000000,
    0b00000000,
    0b11111111
  }, {
    0b11111111,
    0b00000000,
    0b00000000,
    0b00000011,
    0b00000011,
    0b00000000,
    0b00000000,
    0b11111111
  }, {
    0b11111111,
    0b00000000,
    0b00000000,
    0b00000110,
    0b00000110,
    0b00000000,
    0b00000000,
    0b11111111
  }, {
    0b11111111,
    0b00000000,
    0b00000000,
    0b00011000,
    0b00011000,
    0b00000000,
    0b00000000,
    0b11111111
  }, {
    0b11111111,
    0b00000000,
    0b00000000,
    0b00110000,
    0b00110000,
    0b00000000,
    0b00000000,
    0b11111111
  }, {
    0b11111111,
    0b00000000,
    0b00000000,
    0b01100000,
    0b01100000,
    0b00000000,
    0b00000000,
    0b11111111
  }, {
    0b11111111,
    0b00000000,
    0b00000000,
    0b11000000,
    0b11000000,
    0b00000000,
    0b00000000,
    0b11111111
  }, {
    0b11111111,
    0b00000000,
    0b00000000,
    0b10000000,
    0b10000000,
    0b00000000,
    0b00000000,
    0b11111111
  }
};
const int IMAGES_LEN = sizeof(IMAGES) / 8;

LedControl display = LedControl(DIN_PIN, CLK_PIN, CS_PIN);

void setup() {
  display.clearDisplay(0);
  display.shutdown(0, false);
  display.setIntensity(0, 5);
}

void displayImage(const byte* image) {
  for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 8; j++) {
      display.setLed(0, i, j, bitRead(image[i], 7 - j));
    }
  }
}

int i = 0;

void loop() {
  displayImage(IMAGES[i]);
  if (++i >= IMAGES_LEN ) {
    i = 0;
  }
  delay(333);
}
nano:12
nano:11
nano:10
nano:9
nano:8
nano:7
nano:6
nano:5
nano:4
nano:3
nano:2
nano:GND.2
nano:RESET.2
nano:0
nano:1
nano:13
nano:3.3V
nano:AREF
nano:A0
nano:A1
nano:A2
nano:A3
nano:A4
nano:A5
nano:A6
nano:A7
nano:5V
nano:RESET
nano:GND.1
nano:VIN
nano:12.2
nano:5V.2
nano:13.2
nano:11.2
nano:RESET.3
nano:GND.3
matrix1:V+
matrix1:GND
matrix1:DIN
matrix1:CS
matrix1:CLK
matrix1:V+.2
matrix1:GND.2
matrix1:DOUT
matrix1:CS.2
matrix1:CLK.2