#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#define TFT_DC 9
#define TFT_CS 10
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
#define BUTTON1_PIN 12
#define BUTTON2_PIN 8
#define BUTTON3_PIN 7
#define BUTTON4_PIN 6
#define BUTTON5_PIN 5
#define BUTTON6_PIN 4
#define BUTTON7_PIN 3
#define BUTTON8_PIN 2
int buttonPins[] = {BUTTON1_PIN, BUTTON2_PIN, BUTTON3_PIN, BUTTON4_PIN, BUTTON5_PIN, BUTTON6_PIN, BUTTON7_PIN, BUTTON8_PIN};
bool buttonStates[8] = {false, false, false, false, false, false, false, false};
const int16_t SCROLL_SPEED = 3; // 定义滚动速度
// Pattern 1 configuration
const uint16_t pattern1_palette[4] PROGMEM = {0xe738, 0xf7be, 0x4885, 0x34bc};
const uint8_t pattern1_image[776] PROGMEM = {
0x55, 0x50, 0x50, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50, 0x50, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x5A, 0x5A,
0x5A, 0x5A, 0x5A, 0x50, 0x05, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5,
0xA5, 0xA5, 0x00, 0x5A, 0x55, 0x50, 0x50, 0x55, 0x50, 0x55,
0x55, 0xA5, 0xA5, 0x00, 0x00, 0x05, 0xA5, 0xA5, 0x55, 0x50,
0x0A, 0xA0, 0x00, 0xAA, 0x00, 0xAF, 0xA0, 0x0A, 0xFF, 0xF0,
0x00, 0xFF, 0xFA, 0x00, 0xAF, 0xA0, 0x0A, 0xA0, 0x00, 0xAA,
0x0A, 0xFF, 0x00, 0xAF, 0xFA, 0xFA, 0x0A, 0xFA, 0xFF, 0xA0,
0x0F, 0xFA, 0x0A, 0xA0, 0x00, 0xAA, 0x0A, 0xFA, 0x00, 0xAF,
0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xA0, 0x0A, 0xFA, 0x0A, 0xAA,
0x0A, 0xAA, 0x00, 0xAF, 0xA0, 0x0F, 0xFA, 0x00, 0x00, 0x0A,
0xFF, 0x00, 0xAF, 0xA0, 0x00, 0x0A, 0xFA, 0x00, 0x00, 0x00,
0xFF, 0x00, 0xAA, 0x0A, 0xFA, 0x0A, 0xA0, 0x0F, 0xF0, 0x00,
0x00, 0x00, 0xF0, 0x00, 0x0A, 0x00, 0x0F, 0xF0, 0x00, 0x0F,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0x0A, 0x00, 0x0A, 0xFA, 0x00,
0x00, 0x00, 0xFF, 0x00, 0xAA, 0x0A, 0xFA, 0x0A, 0xA0, 0x0F,
0xF0, 0x00, 0x0A, 0xAA, 0x0A, 0xAA, 0x00, 0xAF, 0xA0, 0x0F,
0xFA, 0x00, 0x00, 0x0A, 0xFF, 0x00, 0xAF, 0xA0, 0x0A, 0xA0,
0x00, 0xAA, 0x0A, 0xFA, 0x00, 0xAF, 0xFF, 0xFF, 0x0F, 0xFF,
0xFF, 0xA0, 0x0A, 0xFA, 0x0A, 0xA0, 0x00, 0xAA, 0x0A, 0xFF,
0x00, 0xAF, 0xFA, 0xFA, 0x0A, 0xFA, 0xFF, 0xA0, 0x0F, 0xFA,
0x0A, 0xA0, 0x00, 0xAA, 0x00, 0xAF, 0xA0, 0x0A, 0xFF, 0xF0,
0x00, 0xFF, 0xFA, 0x00, 0xAF, 0xA0, 0x55, 0x50, 0x50, 0x55,
0x50, 0x55, 0x55, 0xA5, 0xA5, 0x00, 0x00, 0x05, 0xA5, 0xA5,
0x55, 0x50, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x50, 0x05, 0xA5,
0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0x00, 0x5A, 0xAA, 0xAA,
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x50, 0x50, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x50, 0x50, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55
};
const int16_t pattern1_width = 64;
const int16_t pattern1_height = 21;
const int16_t pattern1_scale = 10;
// Pattern 2 configuration
const uint16_t pattern2_palette[4] PROGMEM = {0xECDA, 0x70CC, 0x0614, 0xF75E};
const uint8_t pattern2_image[776] PROGMEM = {
0xFF, 0x55, 0xF0, 0x5F, 0xF5, 0x0F, 0x55, 0xFF, 0xFF, 0xFF,
0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0x5F,
0xFF, 0xF5, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
0x50, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0xA5, 0x05, 0xA0,
0x00, 0x05, 0x50, 0x00, 0xFF, 0x55, 0xAA, 0x55, 0xFF, 0x00,
0x0A, 0xAA, 0x55, 0xF5, 0xAA, 0xA5, 0xF5, 0x5A, 0xAA, 0x00,
0x0F, 0xF5, 0xAA, 0xAA, 0x5F, 0xF0, 0x00, 0xAA, 0x55, 0x5F,
0x5A, 0xAA, 0x5F, 0x55, 0x5A, 0xA0, 0x0F, 0xFF, 0x55, 0xFF,
0x55, 0xFF, 0xF0, 0x0A, 0xAA, 0xA5, 0x5F, 0x55, 0x5F, 0x55,
0xAA, 0xAA, 0x00, 0xF5, 0x5A, 0x55, 0x55, 0xA5, 0x5F, 0x00,
0x50, 0xAA, 0xA5, 0x5F, 0x5F, 0x55, 0xAA, 0xA0, 0x5F, 0xFF,
0x5A, 0x5F, 0x55, 0xF5, 0xA5, 0xFF, 0xF0, 0x05, 0xAA, 0x55,
0x5F, 0x55, 0x5A, 0xA5, 0x00, 0xFF, 0x5A, 0xF0, 0x55, 0x55,
0x0F, 0xA5, 0xFF, 0x00, 0x5A, 0xAA, 0x55, 0x55, 0x5A, 0xAA,
0x50, 0x0F, 0xFF, 0x5A, 0x5F, 0x55, 0xF5, 0xA5, 0xFF, 0xF0,
0x05, 0xAA, 0x55, 0x5F, 0x55, 0x5A, 0xA5, 0x00, 0x00, 0xF5,
0x5A, 0x55, 0x55, 0xA5, 0x5F, 0x00, 0x50, 0xAA, 0xA5, 0x5F,
0x5F, 0x55, 0xAA, 0xA0, 0x50, 0x0F, 0xFF, 0x55, 0xFF, 0x55,
0xFF, 0xF0, 0x0A, 0xAA, 0xA5, 0x5F, 0x55, 0x5F, 0x55, 0xAA,
0xAA, 0x00, 0x0F, 0xF5, 0xAA, 0xAA, 0x5F, 0xF0, 0x00, 0xAA,
0x55, 0x5F, 0x5A, 0xAA, 0x5F, 0x55, 0x5A, 0xA0, 0x00, 0xFF,
0x55, 0xAA, 0x55, 0xFF, 0x00, 0x0A, 0xAA, 0x55, 0xF5, 0xAA,
0xA5, 0xF5, 0x5A, 0xAA, 0x00, 0x00, 0x00, 0x05, 0x50, 0x00,
0x00, 0x00, 0x55, 0x00, 0x00, 0xA5, 0x05, 0xA0, 0x00, 0x05,
0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x0F, 0xF0, 0xFF, 0x5F, 0xFF, 0xF5, 0xFF,
0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x55, 0xF0, 0x5F, 0xF5, 0x0F, 0x55, 0xFF, 0xFF, 0xFF,
0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0xFF, 0xF0
};
const int16_t pattern2_width = 66;
const int16_t pattern2_height = 21;
const int16_t pattern2_scale = 10;
// Pattern 3 configuration
const uint16_t pattern3_palette[4] PROGMEM = {0xF7BE, 0x4982, 0xc752, 0xbbdf};
const uint8_t pattern3_image[776] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x50, 0x00, 0x14, 0x00,
0x00, 0x50, 0x00, 0x00, 0x15, 0xAA, 0x05, 0x2A, 0x95, 0x45,
0x0A, 0xA0, 0x14, 0x02, 0xA0, 0x5A, 0xAA, 0x94, 0x1A, 0xAA,
0xA5, 0x6A, 0xA8, 0x5F, 0x50, 0xAA, 0x96, 0xA5, 0x50, 0x01,
0x56, 0xA9, 0xAA, 0xA5, 0x7F, 0xFD, 0x5A, 0xAA, 0xA5, 0x40,
0x00, 0x05, 0x5A, 0xAA, 0x95, 0x7F, 0xFF, 0xF5, 0x6A, 0x95,
0x80, 0x05, 0x00, 0x15, 0x6A, 0x55, 0xFE, 0x96, 0xBF, 0x55,
0x55, 0x00, 0x15, 0x58, 0x00, 0x55, 0x57, 0xFF, 0x55, 0x5F,
0xFD, 0x56, 0x80, 0xA5, 0xF6, 0x80, 0x29, 0x5A, 0xFF, 0x54,
0x15, 0x7F, 0xA5, 0x00, 0x16, 0xBE, 0x50, 0x00, 0x17, 0xFF,
0xD0, 0x00, 0x5F, 0xFD, 0x68, 0x0A, 0x5F, 0x68, 0x02, 0x95,
0xAF, 0xF5, 0x41, 0x57, 0xFA, 0x55, 0x00, 0x15, 0x58, 0x00,
0x55, 0x57, 0xFF, 0x55, 0x5F, 0xFD, 0x69, 0x58, 0x00, 0x50,
0x01, 0x56, 0xA5, 0x5F, 0xE9, 0x6B, 0xF5, 0x5A, 0xA5, 0x40,
0x00, 0x05, 0x5A, 0xAA, 0x95, 0x7F, 0xFF, 0xF5, 0x69, 0x6A,
0x55, 0x00, 0x15, 0x6A, 0x9A, 0xAA, 0x57, 0xFF, 0xD5, 0xAA,
0x5A, 0xAA, 0x94, 0x1A, 0xAA, 0xA5, 0x6A, 0xA8, 0x5F, 0x50,
0xAA, 0x81, 0x5A, 0xA0, 0x52, 0xA9, 0x54, 0x50, 0xAA, 0x01,
0x40, 0x2A, 0x00, 0x00, 0x14, 0x14, 0x50, 0x00, 0x14, 0x00,
0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const int16_t pattern3_width = 45;
const int16_t pattern3_height = 21;
const int16_t pattern3_scale = 10;
// Pattern 4 configuration
const uint16_t pattern4_palette[4] PROGMEM = {0xf7fd, 0x064c, 0xb59d, 0x096b};
const uint8_t pattern4_image[776] PROGMEM = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x00, 0xf0, 0xf0,
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf0,
0x00, 0xff, 0x00, 0x0f, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff,
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
0x0f, 0x0f, 0x00, 0xf0, 0xf0, 0xf0, 0xff, 0xf0, 0x00, 0xaa,
0x00, 0x0f, 0xff, 0x05, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50,
0x0f, 0xf0, 0x0a, 0xaa, 0xa0, 0x0f, 0xf0, 0x05, 0x55, 0x55,
0x55, 0x55, 0x55, 0x50, 0xa0, 0x0a, 0xf0, 0xaa, 0x0f, 0xa0,
0x0a, 0xa5, 0x50, 0x55, 0x55, 0x55, 0x05, 0x5a, 0x50, 0x0f,
0xaf, 0x00, 0xfa, 0xf0, 0x05, 0x55, 0x50, 0x00, 0x00, 0x00,
0x05, 0x55, 0x5a, 0x00, 0x0a, 0xff, 0xa0, 0x00, 0xa5, 0x55,
0x50, 0x0a, 0xaa, 0xa0, 0x05, 0x55, 0xa5, 0x50, 0x50, 0xaa,
0x05, 0x05, 0x5a, 0x05, 0x50, 0xa0, 0x00, 0x0a, 0x05, 0x50,
0x55, 0x05, 0x00, 0x00, 0x00, 0x50, 0x55, 0x05, 0x5a, 0x00,
0x00, 0x00, 0xa5, 0x50, 0xa5, 0x50, 0x50, 0xaa, 0x05, 0x05,
0x5a, 0x05, 0x50, 0xa0, 0x00, 0x0a, 0x05, 0x50, 0x5a, 0x00,
0x0a, 0xff, 0xa0, 0x00, 0xa5, 0x55, 0x50, 0x0a, 0xaa, 0xa0,
0x05, 0x55, 0x50, 0x0f, 0xaf, 0x00, 0xfa, 0xf0, 0x05, 0x55,
0x50, 0x00, 0x00, 0x00, 0x05, 0x55, 0xa0, 0x0a, 0xf0, 0xaa,
0x0f, 0xa0, 0x0a, 0xa5, 0x50, 0x55, 0x55, 0x55, 0x05, 0x5a,
0x0f, 0xf0, 0x0a, 0xaa, 0xa0, 0x0f, 0xf0, 0x05, 0x55, 0x55,
0x55, 0x55, 0x55, 0x50, 0xff, 0xf0, 0x00, 0xaa, 0x00, 0x0f,
0xff, 0x05, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x00, 0xf0,
0xf0, 0xf0, 0xff, 0xf0, 0x00, 0xff, 0x00, 0x0f, 0xff, 0x00,
0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x0f, 0x0f, 0x00,
0xf0, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff
};
const int16_t pattern4_width = 56;
const int16_t pattern4_height = 21;
const int16_t pattern4_scale = 10;
// Pattern 5 configuration (based on Pattern 1)
const uint16_t pattern5_palette[4] PROGMEM = {0xFFFF, 0xFFFF, 0x0000, 0x0000};
const uint8_t pattern5_image[776] PROGMEM = {
0x55, 0x50, 0x50, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50, 0x50, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x5A, 0x5A,
0x5A, 0x5A, 0x5A, 0x50, 0x05, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5,
0xA5, 0xA5, 0x00, 0x5A, 0x55, 0x50, 0x50, 0x55, 0x50, 0x55,
0x55, 0xA5, 0xA5, 0x00, 0x00, 0x05, 0xA5, 0xA5, 0x55, 0x50,
0x0A, 0xA0, 0x00, 0xAA, 0x00, 0xAF, 0xA0, 0x0A, 0xFF, 0xF0,
0x00, 0xFF, 0xFA, 0x00, 0xAF, 0xA0, 0x0A, 0xA0, 0x00, 0xAA,
0x0A, 0xFF, 0x00, 0xAF, 0xFA, 0xFA, 0x0A, 0xFA, 0xFF, 0xA0,
0x0F, 0xFA, 0x0A, 0xA0, 0x00, 0xAA, 0x0A, 0xFA, 0x00, 0xAF,
0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xA0, 0x0A, 0xFA, 0x0A, 0xAA,
0x0A, 0xAA, 0x00, 0xAF, 0xA0, 0x0F, 0xFA, 0x00, 0x00, 0x0A,
0xFF, 0x00, 0xAF, 0xA0, 0x00, 0x0A, 0xFA, 0x00, 0x00, 0x00,
0xFF, 0x00, 0xAA, 0x0A, 0xFA, 0x0A, 0xA0, 0x0F, 0xF0, 0x00,
0x00, 0x00, 0xF0, 0x00, 0x0A, 0x00, 0x0F, 0xF0, 0x00, 0x0F,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0x0A, 0x00, 0x0A, 0xFA, 0x00,
0x00, 0x00, 0xFF, 0x00, 0xAA, 0x0A, 0xFA, 0x0A, 0xA0, 0x0F,
0xF0, 0x00, 0x0A, 0xAA, 0x0A, 0xAA, 0x00, 0xAF, 0xA0, 0x0F,
0xFA, 0x00, 0x00, 0x0A, 0xFF, 0x00, 0xAF, 0xA0, 0x0A, 0xA0,
0x00, 0xAA, 0x0A, 0xFA, 0x00, 0xAF, 0xFF, 0xFF, 0x0F, 0xFF,
0xFF, 0xA0, 0x0A, 0xFA, 0x0A, 0xA0, 0x00, 0xAA, 0x0A, 0xFF,
0x00, 0xAF, 0xFA, 0xFA, 0x0A, 0xFA, 0xFF, 0xA0, 0x0F, 0xFA,
0x0A, 0xA0, 0x00, 0xAA, 0x00, 0xAF, 0xA0, 0x0A, 0xFF, 0xF0,
0x00, 0xFF, 0xFA, 0x00, 0xAF, 0xA0, 0x55, 0x50, 0x50, 0x55,
0x50, 0x55, 0x55, 0xA5, 0xA5, 0x00, 0x00, 0x05, 0xA5, 0xA5,
0x55, 0x50, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x50, 0x05, 0xA5,
0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0x00, 0x5A, 0xAA, 0xAA,
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x50, 0x50, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x50, 0x50, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55
};
const int16_t pattern5_width = 64;
const int16_t pattern5_height = 21;
const int16_t pattern5_scale = 10;
// Pattern 6 configuration (based on Pattern 2)
const uint16_t pattern6_palette[4] PROGMEM = {0x0000, 0x0000, 0xFFFF, 0xFFFF};
const uint8_t pattern6_image[776] PROGMEM = {
0xFF, 0x55, 0xF0, 0x5F, 0xF5, 0x0F, 0x55, 0xFF, 0xFF, 0xFF,
0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0x5F,
0xFF, 0xF5, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
0x50, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0xA5, 0x05, 0xA0,
0x00, 0x05, 0x50, 0x00, 0xFF, 0x55, 0xAA, 0x55, 0xFF, 0x00,
0x0A, 0xAA, 0x55, 0xF5, 0xAA, 0xA5, 0xF5, 0x5A, 0xAA, 0x00,
0x0F, 0xF5, 0xAA, 0xAA, 0x5F, 0xF0, 0x00, 0xAA, 0x55, 0x5F,
0x5A, 0xAA, 0x5F, 0x55, 0x5A, 0xA0, 0x0F, 0xFF, 0x55, 0xFF,
0x55, 0xFF, 0xF0, 0x0A, 0xAA, 0xA5, 0x5F, 0x55, 0x5F, 0x55,
0xAA, 0xAA, 0x00, 0xF5, 0x5A, 0x55, 0x55, 0xA5, 0x5F, 0x00,
0x50, 0xAA, 0xA5, 0x5F, 0x5F, 0x55, 0xAA, 0xA0, 0x5F, 0xFF,
0x5A, 0x5F, 0x55, 0xF5, 0xA5, 0xFF, 0xF0, 0x05, 0xAA, 0x55,
0x5F, 0x55, 0x5A, 0xA5, 0x00, 0xFF, 0x5A, 0xF0, 0x55, 0x55,
0x0F, 0xA5, 0xFF, 0x00, 0x5A, 0xAA, 0x55, 0x55, 0x5A, 0xAA,
0x50, 0x0F, 0xFF, 0x5A, 0x5F, 0x55, 0xF5, 0xA5, 0xFF, 0xF0,
0x05, 0xAA, 0x55, 0x5F, 0x55, 0x5A, 0xA5, 0x00, 0x00, 0xF5,
0x5A, 0x55, 0x55, 0xA5, 0x5F, 0x00, 0x50, 0xAA, 0xA5, 0x5F,
0x5F, 0x55, 0xAA, 0xA0, 0x50, 0x0F, 0xFF, 0x55, 0xFF, 0x55,
0xFF, 0xF0, 0x0A, 0xAA, 0xA5, 0x5F, 0x55, 0x5F, 0x55, 0xAA,
0xAA, 0x00, 0x0F, 0xF5, 0xAA, 0xAA, 0x5F, 0xF0, 0x00, 0xAA,
0x55, 0x5F, 0x5A, 0xAA, 0x5F, 0x55, 0x5A, 0xA0, 0x00, 0xFF,
0x55, 0xAA, 0x55, 0xFF, 0x00, 0x0A, 0xAA, 0x55, 0xF5, 0xAA,
0xA5, 0xF5, 0x5A, 0xAA, 0x00, 0x00, 0x00, 0x05, 0x50, 0x00,
0x00, 0x00, 0x55, 0x00, 0x00, 0xA5, 0x05, 0xA0, 0x00, 0x05,
0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x0F, 0xF0, 0xFF, 0x5F, 0xFF, 0xF5, 0xFF,
0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x55, 0xF0, 0x5F, 0xF5, 0x0F, 0x55, 0xFF, 0xFF, 0xFF,
0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0xFF, 0xF0
};
const int16_t pattern6_width = 66;
const int16_t pattern6_height = 21;
const int16_t pattern6_scale = 10;
// Pattern 7 configuration (based on Pattern 3)
const uint16_t pattern7_palette[4] PROGMEM = {0xFFFF, 0x0000, 0xFFFF, 0xFFFF};
const uint8_t pattern7_image[776] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x50, 0x00, 0x14, 0x00,
0x00, 0x50, 0x00, 0x00, 0x15, 0xAA, 0x05, 0x2A, 0x95, 0x45,
0x0A, 0xA0, 0x14, 0x02, 0xA0, 0x5A, 0xAA, 0x94, 0x1A, 0xAA,
0xA5, 0x6A, 0xA8, 0x5F, 0x50, 0xAA, 0x96, 0xA5, 0x50, 0x01,
0x56, 0xA9, 0xAA, 0xA5, 0x7F, 0xFD, 0x5A, 0xAA, 0xA5, 0x40,
0x00, 0x05, 0x5A, 0xAA, 0x95, 0x7F, 0xFF, 0xF5, 0x6A, 0x95,
0x80, 0x05, 0x00, 0x15, 0x6A, 0x55, 0xFE, 0x96, 0xBF, 0x55,
0x55, 0x00, 0x15, 0x58, 0x00, 0x55, 0x57, 0xFF, 0x55, 0x5F,
0xFD, 0x56, 0x80, 0xA5, 0xF6, 0x80, 0x29, 0x5A, 0xFF, 0x54,
0x15, 0x7F, 0xA5, 0x00, 0x16, 0xBE, 0x50, 0x00, 0x17, 0xFF,
0xD0, 0x00, 0x5F, 0xFD, 0x68, 0x0A, 0x5F, 0x68, 0x02, 0x95,
0xAF, 0xF5, 0x41, 0x57, 0xFA, 0x55, 0x00, 0x15, 0x58, 0x00,
0x55, 0x57, 0xFF, 0x55, 0x5F, 0xFD, 0x69, 0x58, 0x00, 0x50,
0x01, 0x56, 0xA5, 0x5F, 0xE9, 0x6B, 0xF5, 0x5A, 0xA5, 0x40,
0x00, 0x05, 0x5A, 0xAA, 0x95, 0x7F, 0xFF, 0xF5, 0x69, 0x6A,
0x55, 0x00, 0x15, 0x6A, 0x9A, 0xAA, 0x57, 0xFF, 0xD5, 0xAA,
0x5A, 0xAA, 0x94, 0x1A, 0xAA, 0xA5, 0x6A, 0xA8, 0x5F, 0x50,
0xAA, 0x81, 0x5A, 0xA0, 0x52, 0xA9, 0x54, 0x50, 0xAA, 0x01,
0x40, 0x2A, 0x00, 0x00, 0x14, 0x14, 0x50, 0x00, 0x14, 0x00,
0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const int16_t pattern7_width = 45;
const int16_t pattern7_height = 21;
const int16_t pattern7_scale = 10;
// Pattern 8 configuration (based on Pattern 4)
const uint16_t pattern8_palette[4] PROGMEM = {0x0000, 0xFFFF, 0x0000, 0xFFFF};
const uint8_t pattern8_image[776] PROGMEM = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x00, 0xf0, 0xf0,
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf0,
0x00, 0xff, 0x00, 0x0f, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff,
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
0x0f, 0x0f, 0x00, 0xf0, 0xf0, 0xf0, 0xff, 0xf0, 0x00, 0xaa,
0x00, 0x0f, 0xff, 0x05, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50,
0x0f, 0xf0, 0x0a, 0xaa, 0xa0, 0x0f, 0xf0, 0x05, 0x55, 0x55,
0x55, 0x55, 0x55, 0x50, 0xa0, 0x0a, 0xf0, 0xaa, 0x0f, 0xa0,
0x0a, 0xa5, 0x50, 0x55, 0x55, 0x55, 0x05, 0x5a, 0x50, 0x0f,
0xaf, 0x00, 0xfa, 0xf0, 0x05, 0x55, 0x50, 0x00, 0x00, 0x00,
0x05, 0x55, 0x5a, 0x00, 0x0a, 0xff, 0xa0, 0x00, 0xa5, 0x55,
0x50, 0x0a, 0xaa, 0xa0, 0x05, 0x55, 0xa5, 0x50, 0x50, 0xaa,
0x05, 0x05, 0x5a, 0x05, 0x50, 0xa0, 0x00, 0x0a, 0x05, 0x50,
0x55, 0x05, 0x00, 0x00, 0x00, 0x50, 0x55, 0x05, 0x5a, 0x00,
0x00, 0x00, 0xa5, 0x50, 0xa5, 0x50, 0x50, 0xaa, 0x05, 0x05,
0x5a, 0x05, 0x50, 0xa0, 0x00, 0x0a, 0x05, 0x50, 0x5a, 0x00,
0x0a, 0xff, 0xa0, 0x00, 0xa5, 0x55, 0x50, 0x0a, 0xaa, 0xa0,
0x05, 0x55, 0x50, 0x0f, 0xaf, 0x00, 0xfa, 0xf0, 0x05, 0x55,
0x50, 0x00, 0x00, 0x00, 0x05, 0x55, 0xa0, 0x0a, 0xf0, 0xaa,
0x0f, 0xa0, 0x0a, 0xa5, 0x50, 0x55, 0x55, 0x55, 0x05, 0x5a,
0x0f, 0xf0, 0x0a, 0xaa, 0xa0, 0x0f, 0xf0, 0x05, 0x55, 0x55,
0x55, 0x55, 0x55, 0x50, 0xff, 0xf0, 0x00, 0xaa, 0x00, 0x0f,
0xff, 0x05, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x00, 0xf0,
0xf0, 0xf0, 0xff, 0xf0, 0x00, 0xff, 0x00, 0x0f, 0xff, 0x00,
0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x0f, 0x0f, 0x00,
0xf0, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff
};
const int16_t pattern8_width = 56;
const int16_t pattern8_height = 21;
const int16_t pattern8_scale = 10;
int16_t scrollPosition = 0;
bool isScrolling = false;
unsigned long startTime = 0;
int currentPattern = 0;
void displayPattern(Adafruit_ILI9341 &tft, const uint8_t* image, const uint16_t* palette, int16_t width, int16_t height, int16_t scale, int16_t scrollPos) {
int16_t startY = (tft.height() - height * scale) / 2;
for (int16_t y = 0; y < height; y++) {
for (int16_t x = 0; x < tft.width() / scale; x++) {
int16_t patternX = (x + scrollPos) % width;
uint8_t byte = pgm_read_byte(&image[(y * width + patternX) / 4]);
uint8_t pixel = (byte >> (6 - 2 * ((y * width + patternX) % 4))) & 0x03;
uint16_t color = pgm_read_word(&palette[pixel]);
tft.fillRect(x * scale, startY + y * scale, scale, scale, color);
}
}
}
void setup() {
Serial.begin(9600);
tft.begin();
Serial.println(F("Initialized"));
tft.fillScreen(ILI9341_BLACK);
tft.setRotation(1);
for (int i = 0; i < 8; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
}
void loop() {
checkButtons();
if (isScrolling) {
unsigned long currentTime = millis();
if (currentTime - startTime < 15000) {
displayCurrentPattern();
scrollPosition = (scrollPosition + SCROLL_SPEED) % getCurrentPatternWidth();
delay(0);
} else {
tft.fillScreen(ILI9341_BLACK);
isScrolling = false;
currentPattern = 0;
}
} else if (currentPattern != 0) {
// 当暂停时,保持显示当前图案
displayCurrentPattern();
delay(0);
}
}
void checkButtons() {
for (int i = 0; i < 8; i++) { // 注意这里改为8,因为你有8个按钮
int buttonPin = buttonPins[i];
bool currentState = digitalRead(buttonPin) == LOW;
if (currentState && !buttonStates[i]) {
handlePatternDisplay(i + 1);
buttonStates[i] = true; // 设置当前状态为按下
} else if (!currentState && buttonStates[i]) {
buttonStates[i] = false; // 设置当前状态为未按下
}
}
}
void handlePatternDisplay(int patternNumber) {
if (currentPattern == patternNumber) {
isScrolling = !isScrolling;
if (isScrolling) {
startTime = millis();
}
} else {
currentPattern = patternNumber;
startTime = millis();
isScrolling = true;
scrollPosition = 0;
tft.fillScreen(ILI9341_BLACK);
}
}
void displayCurrentPattern() {
switch (currentPattern) {
case 1:
displayPattern(tft, pattern1_image, pattern1_palette, pattern1_width, pattern1_height, pattern1_scale, scrollPosition);
break;
case 2:
displayPattern(tft, pattern2_image, pattern2_palette, pattern2_width, pattern2_height, pattern2_scale, scrollPosition);
break;
case 3:
displayPattern(tft, pattern3_image, pattern3_palette, pattern3_width, pattern3_height, pattern3_scale, scrollPosition);
break;
case 4:
displayPattern(tft, pattern4_image, pattern4_palette, pattern4_width, pattern4_height, pattern4_scale, scrollPosition);
break;
case 5:
displayPattern(tft, pattern5_image, pattern5_palette, pattern5_width, pattern5_height, pattern5_scale, scrollPosition);
break;
case 6:
displayPattern(tft, pattern6_image, pattern6_palette, pattern6_width, pattern6_height, pattern6_scale, scrollPosition);
break;
case 7:
displayPattern(tft, pattern7_image, pattern7_palette, pattern7_width, pattern7_height, pattern7_scale, scrollPosition);
break;
case 8:
displayPattern(tft, pattern8_image, pattern8_palette, pattern8_width, pattern8_height, pattern8_scale, scrollPosition);
break;
}
}
int getCurrentPatternWidth() {
switch (currentPattern) {
case 1: return pattern1_width;
case 2: return pattern2_width;
case 3: return pattern3_width;
case 4: return pattern4_width;
case 5: return pattern5_width;
case 6: return pattern6_width;
case 7: return pattern7_width;
case 8: return pattern8_width;
default: return pattern1_width;
}
}