const int DipSwitch[]={2,3,4,5};
const int Rows[]={21,20,19,18,17,16,15,14};
const int Cols[]={6,7,8,9,10,11,12,13};
const int PushButton=1;
int SwitchState[]={0,0,0,0};
int Dec,Temp,CurrentNum=-1,NewNum;
int i,j,k;
int Speed=-1;
int MoveRate[]={16,10,5};
bool Pressed=false;
bool Move=false;
unsigned int TempArray[8][8]={
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
};
const unsigned int HexArray[16][8][8]={
{{0,1,1,1,1,1,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,1,1,1,1,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}},
{{0,1,1,1,1,1,0,0},{0,0,0,0,0,1,0,0},{0,0,0,0,0,1,0,0},{0,1,1,1,1,1,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,1,1,1,1,0,0}},
{{0,1,1,1,1,1,0,0},{0,0,0,0,0,1,0,0},{0,0,0,0,0,1,0,0},{0,1,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,1,1,1,1,1,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,1,0,0,1,0,0,0},{1,1,1,1,1,1,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,1,0,0},{0,1,0,0,0,0,0,0},{0,1,0,0,0,0,0,0},{0,1,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,1,1,1,1,1,0,0}},
{{0,1,1,1,1,1,0,0},{0,1,0,0,0,0,0,0},{0,1,0,0,0,0,0,0},{0,1,1,1,1,1,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,1,1,1,1,0,0}},
{{0,1,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,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,1,1,1,1,1,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,1,1,1,1,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,1,1,1,1,0,0}},
{{0,1,1,1,1,1,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,1,1,1,1,0,0},{0,0,0,0,0,1,0,0},{0,0,0,0,0,1,0,0},{0,1,1,1,1,1,0,0}},
{{0,1,1,1,1,1,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,1,1,1,1,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0}},
{{0,1,1,1,1,0,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,1,1,1,0,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,1,1,1,0,0,0}},
{{0,1,1,1,1,1,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,0},{0,1,0,0,0,0,0,0},{0,1,0,0,0,0,0,0},{0,1,1,1,1,1,0,0}},
{{0,1,1,1,1,0,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,0,0,0,1,0,0},{0,1,1,1,1,0,0,0}},
{{0,1,1,1,1,1,0,0},{0,1,0,0,0,0,0,0},{0,1,0,0,0,0,0,0},{0,1,1,1,1,1,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,1,1,1,1,0,0}},
{{0,1,1,1,1,1,0,0},{0,1,0,0,0,0,0,0},{0,1,0,0,0,0,0,0},{0,1,1,1,1,1,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,0}}
};
void setup(){
pinMode(PushButton,INPUT_PULLUP);
for (int i=0;i<4;i++){
pinMode(DipSwitch[i], INPUT_PULLUP);
}
for (int Pin=0;Pin<8;Pin++){
pinMode(Cols[Pin], OUTPUT);
pinMode(Rows[Pin], OUTPUT);
digitalWrite(Cols[Pin], HIGH);
digitalWrite(Rows[Pin], HIGH);
}
}
void loop() {
Dec=0;
for (i=0;i<4;i++){
SwitchState[i]=digitalRead(DipSwitch[i]);
if (SwitchState[i]==HIGH){
switch (i) {
case 0: Dec=Dec+1; break;
case 1: Dec=Dec+2; break;
case 2: Dec=Dec+4; break;
case 3: Dec=Dec+8; break;
}
}
}
NewNum=Dec;
if (CurrentNum!=NewNum){
CurrentNum=NewNum;
for (i=0; i<=7; i++){
for (j=0; j<=7; j++){
TempArray[i][j]=HexArray[CurrentNum][i][j];
}
}
}
if (digitalRead(PushButton)==LOW){
Pressed=true;
Move=true;
}
else if ((digitalRead(PushButton)==HIGH) && (Move==true)){
if (Pressed==true){
Speed=Speed+1;
Pressed=false;
if (Speed==3){
Speed=-1;
Move=false;
}
}
for (i=0; i<=7; i++){
Temp=TempArray[i][7];
for (j=6; j>=0; j--){
TempArray[i][j+1]=TempArray[i][j];
}
TempArray[i][0]=Temp;
}
for (int k=0; k<MoveRate[Speed]; k++){
for (i=0; i<=7; i++){
digitalWrite(Rows[i],LOW);
for (j=0; j<=7; j++){
digitalWrite(Cols[j],TempArray[i][j]);
digitalWrite(Cols[j],LOW);
}
digitalWrite(Rows[i], HIGH);
delay(2);
}
}
}
else if (Move==false){
for (i=0; i<=7; i++){
digitalWrite(Rows[i],LOW);
for (j=0; j<=7; j++){
digitalWrite(Cols[j],HexArray[NewNum][i][j]);
digitalWrite(Cols[j],LOW);
}
digitalWrite(Rows[i], HIGH);
}
}
}