#include <MD_MAX72xx.h>
#define CLK_PIN 13
#define DATA_PIN 11
#define CS_PIN 10
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define BTN 4
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, 1);
int current_matrix[8][8];
int past_dip_value = -1;
int btn_past = LOW, btn;
int moving = 0;
int move_delay = 0;
int last_move = 0;
void setup() {
// put your setup code here, to run once:
pinMode(0, INPUT_PULLUP);
pinMode(1, INPUT_PULLUP);
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(BTN, INPUT);
mx.begin();
mx.control(MD_MAX72XX::INTENSITY, MAX_INTENSITY/2);
mx.clear();
}
int MATRIX[4][8][8] = {
{
{0,0,0,1,1,0,0,0},
{0,0,1,0,0,1,0,0},
{0,0,1,0,0,1,0,0},
{0,0,1,0,0,1,0,0},
{0,0,1,0,0,1,0,0},
{0,0,1,0,0,1,0,0},
{0,0,0,1,1,0,0,0},
{0,0,0,0,0,0,0,0}
},
{
{0,0,0,0,1,0,0,0},
{0,0,0,1,1,0,0,0},
{0,0,1,0,1,0,0,0},
{0,0,0,0,1,0,0,0},
{0,0,0,0,1,0,0,0},
{0,0,0,0,1,0,0,0},
{0,0,0,0,1,0,0,0},
{0,0,1,1,1,1,1,0}
},
{
{0,1,1,1,1,0,0,0},
{0,0,0,0,1,0,0,0},
{0,0,0,0,1,0,0,0},
{0,0,0,0,1,0,0,0},
{0,1,1,1,1,0,0,0},
{0,1,0,0,0,0,0,0},
{0,1,0,0,0,0,0,0},
{0,1,1,1,1,0,0,0}
},
{
{0,1,1,1,1,0,0,0},
{0,0,0,0,1,0,0,0},
{0,0,0,0,1,0,0,0},
{0,0,0,0,1,0,0,0},
{0,1,1,1,1,0,0,0},
{0,0,0,0,1,0,0,0},
{0,0,0,0,1,0,0,0},
{0,1,1,1,1,0,0,0}
}
};
void print_character(int matrix[8][8]){
mx.clear();
for (int i = 0; i < 8; i++){
for (int j = 0; j < 8; j++){
if (matrix[i][j] == 1)
mx.setPoint(i, j, true);
}
}
mx.update();
}
// 4 digit binary
// binary to decimal->
// pin0 * 2^0 + pin1 * 2^1 + pin2 * 2^2 + pin3 * 2^3
int dip_value(){
int value = digitalRead(0)
+ digitalRead(1) * 2
+ digitalRead(2) * 4
+ digitalRead(3) * 8;
return value;
}
void move(){
for (int i = 0; i < 8; i++){
int old = current_matrix[i][7];
for (int j = 6; j >= 0 ; j--){
current_matrix[i][j+1] = current_matrix[i][j];
}
current_matrix[i][0] = old;
}
}
void loop() {
int dip = dip_value();
if (dip != past_dip_value){
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++)
current_matrix[i][j] = MATRIX[dip][i][j];
print_character(current_matrix);
past_dip_value = dip;
}
if (move_delay != 0 && millis() >= last_move + move_delay){
move();
print_character(current_matrix);
last_move = millis();
}
btn_past = btn;
btn = digitalRead(BTN);
if (btn == LOW && btn_past == HIGH){
if (move_delay == 0) move_delay = 600;
else move_delay -= 200;
last_move = millis();
}
delay(20);
}