/*
First to Last Column = 6 to 13
First to Last Row = 21 to 14
*/
const int rowLED[8] = {21,20,19,18,17,16,15,14};//Declare row led pins in 8x8 matrix to an array
const int colLED[8] = {6,7,8,9,10,11,12,13};//Declare column led pins in 8x8 matrix to an array
const int dipSwitch[4] = {2,3,4,5};
const int btn = 1;
//Using a 2-D array to store state values for all hexadecimal values for easier access
const int char_Arr[8][8*16]= {{0,1,1,1,1,1,1,0,0,0,1,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,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0},
{0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,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,1,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},
{0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},
{0,1,0,0,0,0,1,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,1,1,1,1,1,1,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0},
{0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,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,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},
{0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,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,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},
{0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,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,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},
{0,1,1,1,1,1,1,0,0,1,1,1,1,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,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,1,0,0,0,0,0,1,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,0}};
int speed[3] = {9,5,2};
int tempOut_Arr[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}};
int dipVal = 0;//Stores the denary value of the dip switch
int posn = 0;
bool btnHeld = false;
int speedC = -1;
bool toggleMove = false;
void selectRow(int r){ //function to set current selected row to low power and rest to high for progressive screen output
if (r == 0) digitalWrite(rowLED[0], LOW); else digitalWrite(rowLED[0], HIGH);
if (r == 1) digitalWrite(rowLED[1], LOW); else digitalWrite(rowLED[1], HIGH);
if (r == 2) digitalWrite(rowLED[2], LOW); else digitalWrite(rowLED[2], HIGH);
if (r == 3) digitalWrite(rowLED[3], LOW); else digitalWrite(rowLED[3], HIGH);
if (r == 4) digitalWrite(rowLED[4], LOW); else digitalWrite(rowLED[4], HIGH);
if (r == 5) digitalWrite(rowLED[5], LOW); else digitalWrite(rowLED[5], HIGH);
if (r == 6) digitalWrite(rowLED[6], LOW); else digitalWrite(rowLED[6], HIGH);
if (r == 7) digitalWrite(rowLED[7], LOW); else digitalWrite(rowLED[7], HIGH);
}
void setState(int c, int s){ //function to set specific columns to the state mentioned in char_arr
if (c == 0) digitalWrite(colLED[0], s);
else if (c == 1) digitalWrite(colLED[1], s);
else if (c == 2) digitalWrite(colLED[2], s);
else if (c == 3) digitalWrite(colLED[3], s);
else if (c == 4) digitalWrite(colLED[4], s);
else if (c == 5) digitalWrite(colLED[5], s);
else if (c == 6) digitalWrite(colLED[6], s);
else if (c == 7) digitalWrite(colLED[7], s);
}
void setup() {
for(int x=0; x<8; x++){
pinMode(rowLED[x], OUTPUT);// set row led to digital output
pinMode(colLED[x], OUTPUT);// set column led to digital output
}
for(int x=0; x<4; x++){
pinMode(dipSwitch[x], INPUT_PULLUP);
}
Serial.begin(9600);
}
void loop() {
dipVal = 0;
if (digitalRead(dipSwitch[0]) == HIGH) dipVal = dipVal + 1;
if (digitalRead(dipSwitch[1]) == HIGH) dipVal = dipVal + 2;
if (digitalRead(dipSwitch[2]) == HIGH) dipVal = dipVal + 4;
if (digitalRead(dipSwitch[3]) == HIGH) dipVal = dipVal + 8;
if(digitalRead(btn)==LOW){
btnHeld = true;//since button is being pressed, set it to true
toggleMove = true;
}
else if ((digitalRead(btn) == HIGH) && (toggleMove == true)){//if the button is let go and the button was held previously
if (btnHeld == true){
speedC = speedC + 1;
btnHeld = false;//button not held so set to false
if (speedC == 3) {
speedC = -1;
toggleMove = false;
}
}
for (int indexOut=0;indexOut<8;indexOut++){
for (int indexIn=posn;indexIn<8;indexIn++){
tempOut_Arr[indexOut][indexIn-posn]=char_Arr[indexOut][(indexIn+(8 * dipVal))];
}
switch (posn){
case 1:
tempOut_Arr[indexOut][7]=char_Arr[indexOut][(8*dipVal)];
break;
case 2:
tempOut_Arr[indexOut][7]=char_Arr[indexOut][(8*dipVal)+1];
tempOut_Arr[indexOut][6]=char_Arr[indexOut][(8*dipVal)];
break;
case 3:
tempOut_Arr[indexOut][7]=char_Arr[indexOut][(8*dipVal)+2];
tempOut_Arr[indexOut][6]=char_Arr[indexOut][(8*dipVal)+1];
tempOut_Arr[indexOut][5]=char_Arr[indexOut][(8*dipVal)];
break;
case 4:
tempOut_Arr[indexOut][7]=char_Arr[indexOut][(8*dipVal)+3];
tempOut_Arr[indexOut][6]=char_Arr[indexOut][(8*dipVal)+2];
tempOut_Arr[indexOut][5]=char_Arr[indexOut][(8*dipVal)+1];
tempOut_Arr[indexOut][4]=char_Arr[indexOut][(8*dipVal)];
break;
case 5:
tempOut_Arr[indexOut][7]=char_Arr[indexOut][(8*dipVal)+4];
tempOut_Arr[indexOut][6]=char_Arr[indexOut][(8*dipVal)+3];
tempOut_Arr[indexOut][5]=char_Arr[indexOut][(8*dipVal)+2];
tempOut_Arr[indexOut][4]=char_Arr[indexOut][(8*dipVal)+1];
tempOut_Arr[indexOut][3]=char_Arr[indexOut][(8*dipVal)];
break;
case 6:
tempOut_Arr[indexOut][7]=char_Arr[indexOut][(8*dipVal)+5];
tempOut_Arr[indexOut][6]=char_Arr[indexOut][(8*dipVal)+4];
tempOut_Arr[indexOut][5]=char_Arr[indexOut][(8*dipVal)+3];
tempOut_Arr[indexOut][4]=char_Arr[indexOut][(8*dipVal)+2];
tempOut_Arr[indexOut][3]=char_Arr[indexOut][(8*dipVal)+1];
tempOut_Arr[indexOut][2]=char_Arr[indexOut][(8*dipVal)];
break;
case 7:
tempOut_Arr[indexOut][7]=char_Arr[indexOut][(8*dipVal)+6];
tempOut_Arr[indexOut][6]=char_Arr[indexOut][(8*dipVal)+5];
tempOut_Arr[indexOut][5]=char_Arr[indexOut][(8*dipVal)+4];
tempOut_Arr[indexOut][4]=char_Arr[indexOut][(8*dipVal)+3];
tempOut_Arr[indexOut][3]=char_Arr[indexOut][(8*dipVal)+2];
tempOut_Arr[indexOut][2]=char_Arr[indexOut][(8*dipVal)+1];
tempOut_Arr[indexOut][1]=char_Arr[indexOut][(8*dipVal)];
break;
}
}
for (int c=0;c<speed[speedC];c++){
for (int indexOut=0;indexOut<8;indexOut++){
selectRow(indexOut);
for (int indexIn=8;indexIn>=0;indexIn--){
setState(indexIn,tempOut_Arr[indexOut][indexIn]);
}
delay(5);
}
}
posn = posn + 1;
if (posn==8) posn = 0;
}
else if(toggleMove == false){
for (int indexOut=0;indexOut<8;indexOut++){
selectRow(indexOut);
for (int indexIn=0;indexIn<8;indexIn++){
setState(indexIn,char_Arr[indexOut][(indexIn+(8 * dipVal))]);
}
delay(5);
}
}
}