const int columnPins[] = {2,3,4,5,6,7,8,9}; // col pins
const int rowPins[] = {A0, A1, A2, A3, A4, A5, A6, A7};//row pins
int button =19;
int speed =300;
int pressedTime, releasedTime, pressDuration;
int PRESS_TIME =500;
//Rows
#define R1 A0
#define R2 A1
#define R3 A2
#define R4 A3
#define R5 A4
#define R6 A5
#define R7 A6
#define R8 A7
//Columns
#define C1 2
#define C2 3
#define C3 4
#define C4 5
#define C5 6
#define C6 7
#define C7 8
#define C8 9
//defining position
int direction=0; //direction is right to left so the direction is 0 to 7
int initialcol=7;
String text="";
long initialsec;
long finalsec;
//printed matrix as the 1 represents blank and 0 as an element in the matrix to turn on
int PrintLedMatrix [8][8]={
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1}
};
//matrix 0
int leta [8][8]={
{1,1,1,0,1,1,1,1},
{1,1,0,1,0,1,1,1},
{1,0,1,1,1,0,1,1},
{1,0,1,1,1,0,1,1},
{1,0,0,0,0,0,1,1},
{1,0,1,1,1,0,1,1},
{1,0,1,1,1,0,1,1},
{1,1,1,1,1,1,1,1}
};
int letb [8][8]={
{1,1,1,1,1,1,1,1},
{1,0,0,0,1,1,1,1},
{1,0,1,1,0,1,1,1},
{1,0,1,1,0,1,1,1},
{1,0,0,0,1,1,1,1},
{1,0,1,1,0,1,1,1},
{1,0,1,1,0,1,1,1},
{1,0,0,0,1,1,1,1}
};
int letc [8][8]={
{1,1,0,0,0,0,1,1},
{1,0,0,1,1,0,0,1},
{0,0,1,1,1,1,1,1},
{0,0,1,1,1,1,1,1},
{0,0,1,1,1,1,1,1},
{1,0,0,1,1,0,0,1},
{1,1,0,0,0,0,1,1},
{1,1,1,1,1,1,1,1}
};
int letd [8][8]={
{0,0,0,0,0,1,1,1},
{1,0,0,1,0,0,1,1},
{1,0,0,1,1,0,0,1},
{1,0,0,1,1,0,0,1},
{1,0,0,1,1,0,0,1},
{1,0,0,1,0,0,1,1},
{0,0,0,0,0,1,1,1},
{1,1,1,1,1,1,1,1}
};
int lete [8][8]={
{0,0,0,0,0,0,0,1},
{1,0,1,1,1,1,01},
{1,0,1,0,1,1,1,1},
{1,0,0,0,1,1,1,1},
{1,0,1,0,1,1,1,1},
{1,0,1,1,1,1,0,1},
{0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1}
};
int letf [8][8]={
{0,0,0,0,0,0,0,1},
{1,0,0,1,1,1,0,1},
{1,0,0,1,0,1,1,1},
{1,0,0,0,0,1,1,1},
{1,0,0,1,0,1,1,1},
{1,0,0,1,1,1,1,1},
{0,0,0,0,1,1,1,1},
{1,1,1,1,1,1,1,1}
};
int letg [8][8]={
{1,1,0,0,0,0,1,1},
{1,0,0,1,1,0,0,1},
{0,0,1,1,1,1,1,1},
{0,0,1,1,1,1,1,1},
{0,0,1,1,0,0,0,1},
{1,0,0,1,1,0,0,1},
{1,1,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1}
};
int leth [8][8]={
{0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1},
{0,0,0,0,0,0,1,1},
{0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1},
{1,1,1,1,1,1,1,1}
};
int leti [8][8]={
{1,0,0,0,0,1,1,1},
{1,1,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,1,1,1,1},
{1,1,0,0,1,1,1,1},
{1,0,0,0,0,1,1,1},
{1,1,1,1,1,1,1,1}
};
int letj [8][8]={
{1,1,1,0,0,0,0,1},
{1,1,1,1,0,0,1,1},
{1,1,1,1,0,0,1,1},
{1,1,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1},
{1,0,0,0,0,1,1,1},
{1,1,1,1,1,1,1,1}
};
int letk [8][8]={
{0,0,0,1,1,0,0,1},
{1,0,0,1,1,0,0,1},
{1,0,0,1,0,0,1,1},
{1,0,0,0,0,1,1,1},
{1,0,0,1,0,0,1,1},
{1,0,0,1,1,0,0,1},
{0,0,0,1,1,0,0,1},
{1,1,1,1,1,1,1,1}
};
int letl [8][8]={
{0,0,0,0,1,1,1,1},
{1,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,1,1,1,1,1},
{1,0,0,1,1,1,1,1},
{0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1}
};
int letm [8][8]={
{0,0,1,1,1,0,0,1},
{0,0,0,1,0,0,0,1},
{0,0,0,0,0,0,0,1},
{0,0,0,0,0,0,0,1},
{0,0,1,0,1,0,0,1},
{0,0,1,1,1,0,0,1},
{0,0,1,1,1,0,0,1},
{1,1,1,1,1,1,1,1}
};
int letn [8][8]={
{0,0,1,1,1,0,0,1},
{0,0,0,1,1,0,0,1},
{0,0,0,0,1,0,0,1},
{0,0,1,0,0,0,0,1},
{0,0,1,1,0,0,0,1},
{0,0,1,1,1,0,0,1},
{0,0,1,1,1,0,0,1},
{1,1,1,1,1,1,1,1}
};
int leto [8][8]={
{1,1,0,0,0,1,1,1},
{1,0,0,1,0,0,1,1},
{0,0,1,1,1,0,0,1},
{0,0,1,1,1,0,0,1},
{0,0,1,1,1,0,0,1},
{1,0,0,1,0,0,1,1},
{1,1,0,0,0,1,1,1},
{1,1,1,1,1,1,1,1}
};
int letp [8][8]={
{0,0,0,0,0,0,1,1},
{1,0,0,1,1,0,0,1},
{1,0,0,1,1,0,0,1},
{1,0,0,0,0,0,1,1},
{1,0,0,1,1,1,1,1},
{1,0,0,1,1,1,1,1},
{0,0,0,0,1,1,1,1},
{1,1,1,1,1,1,1,1}
};
int letq [8][8]={
{1,0,0,0,0,1,1,1},
{0,0,1,1,0,0,1,1},
{0,1,1,1,0,0,1,1},
{0,1,1,1,0,0,1,1},
{0,0,1,0,0,0,1,1},
{1,0,0,0,0,1,1,1},
{1,1,1,0,0,0,1,1},
{1,1,1,1,1,1,1,1}
};
int letr [8][8]={
{0,0,0,0,0,0,1,1},
{1,0,0,1,1,0,0,1},
{1,0,0,1,1,0,0,1},
{1,0,0,0,0,0,1,1},
{1,0,0,1,0,0,1,1},
{1,0,0,1,1,0,0,1},
{0,0,0,1,1,0,0,1},
{1,1,1,1,1,1,1,1}
};
int lets [8][8]={
{1,0,0,0,0,1,1,1},
{0,0,1,1,0,0,1,1},
{0,0,0,1,1,1,1,1},
{1,0,0,0,1,1,1,1},
{1,1,1,0,0,0,1,1},
{0,0,1,1,0,0,1,1},
{1,0,0,0,0,1,1,1},
{1,1,1,1,1,1,1,1}
};
int lett [8][8]={
{0,0,0,0,0,0,1,1},
{0,1,0,0,1,0,1,1},
{1,1,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,1,1,1,1},
{1,0,0,0,0,1,1,1},
{1,1,1,1,1,1,1,1}
};
int letu [8][8]={
{0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1},
{0,0,0,0,0,0,1,1},
{1,1,1,1,1,1,1,1}
};
int letv [8][8]={
{0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1},
{1,0,0,0,0,1,1,1},
{1,1,0,0,1,1,1,1},
{1,1,1,1,1,1,1,1}
};
int letw [8][8]={
{0,0,1,1,1,0,0,1},
{0,0,1,1,1,0,0,1},
{0,0,1,0,1,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,1,1,1,0,0,1},
{1,1,1,1,1,1,1,1}
};
int letx [8][8]={
{0,0,1,1,1,0,0,1},
{0,0,1,1,1,0,0,1},
{1,0,0,1,0,0,1,1},
{1,1,0,0,0,1,1,1},
{1,1,0,0,0,1,1,1},
{1,0,0,1,0,0,1,1},
{0,0,1,1,1,0,0,1},
{1,1,1,1,1,1,1,1}
};
int lety [8][8]={
{0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1},
{1,0,0,0,0,1,1,1},
{1,1,0,0,1,1,1,1},
{1,1,0,0,1,1,1,1},
{1,0,0,0,0,1,1,1},
{1,1,1,1,1,1,1,1}
};
int letz [8][8]={
{0,0,0,0,0,0,0,1},
{0,1,1,1,1,0,0,1},
{0,1,1,1,0,0,1,1},
{1,1,1,0,0,1,1,1},
{1,1,0,0,1,1,0,1},
{1,0,0,1,1,0,0,1},
{0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1}
};
//matrix 26
int letspace [8][8]={
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1}
};
void setup() {
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(19), but, CHANGE);
pinMode(19, INPUT_PULLUP);
cli();//stop interrupts
//set timer1 interrupts
TCCR1A = 0; //set entire TCCR1A register to 0
TCCR1B = 0; //same for TCCR1B
TCNT1 = 0; //initialize counter value to 0
// set compare match register for 1hz increments
OCR1A = 500; // 16000000/(1024*(1/2.5)) - 1
// turn on CTC mode
TCCR1B |= (1 << WGM12);
//set CS12 and CS10 bits for 1024 prescalar
TCCR1B |= (1 << CS12) | (1 << CS10);
// enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A );
sei();//allow interrupts
//declaring as output
pinMode(R1, OUTPUT);
pinMode(R2, OUTPUT);
pinMode(R3, OUTPUT);
pinMode(R4, OUTPUT);
pinMode(R5, OUTPUT);
pinMode(R6, OUTPUT);
pinMode(R7, OUTPUT);
pinMode(R8, OUTPUT);
pinMode(C1, OUTPUT);
pinMode(C2, OUTPUT);
pinMode(C3, OUTPUT);
pinMode(C4, OUTPUT);
pinMode(C5, OUTPUT);
pinMode(C6, OUTPUT);
pinMode(C7, OUTPUT);
pinMode(C8, OUTPUT);
TurnOffALL_LED();
}
void loop() {
Serial.println("Please enter the text to display");//user enters string in serial monitor to display
while(Serial.available()==0){}
while(Serial.available()>0){
text=Serial.readStringUntil('\n');
}
text.toUpperCase();
//Serial.println(text);
for(int i=0;i<=text.length()-1;i++){ //loops through the string and each letter
int let;
if(text[i]>40){ //checks if its letter by getting the ascii values
let=text[i]-65;
}
else if(text[i]==32){ //sets space character to corresponding matrix number
let=26;
}
for(int k=0;k<=7;k++){
LetterToMatrix(let,k, initialcol);//prints out the inital column
delay(speed);
movingmatrix(direction); //move everything all the column left by one
}
}
for(int i=0;i<=7;i++){ //has space after word
LetterToMatrix(26,i,initialcol);
delay(speed);
movingmatrix(direction);
}
}
ISR(TIMER1_COMPA_vect){
for (int i=0;i<8;i++){ //cycling through the column
SelRow(i+1);
SetLEDinRow(1,PrintLedMatrix[i][0]);
SetLEDinRow(2,PrintLedMatrix[i][1]);
SetLEDinRow(3,PrintLedMatrix[i][2]);
SetLEDinRow(4,PrintLedMatrix[i][3]);
SetLEDinRow(5,PrintLedMatrix[i][4]);
SetLEDinRow(6,PrintLedMatrix[i][5]);
SetLEDinRow(7,PrintLedMatrix[i][6]);
SetLEDinRow(8,PrintLedMatrix[i][7]);
TurnOffALL_LED();
}
}
void LetterToMatrix(int letter, int col,int initialcol){ //print the corresponding letter to ledmatrix
switch(letter){
case 0:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=leta[i][col];
}
break;
}
case 1:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=letb[i][col];
}
break;
}
case 2:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=letc[i][col];
}
break;
}
case 3:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=letd[i][col];
}
break;
}
case 4:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=lete[i][col];
}
break;
}
case 5:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=letf[i][col];
}
break;
}
case 6:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=letg[i][col];
}
break;
}
case 7:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=leth[i][col];
}
break;
}
case 8:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=leti[i][col];
}
break;
}
case 9:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=letj[i][col];
}
break;
}
case 10:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=letk[i][col];
}
break;
}
case 11:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=letl[i][col];
}
break;
}
case 12:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=letm[i][col];
}
break;
}
case 13:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=letn[i][col];
}
break;
}
case 14:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=leto[i][col];
}
break;
}
case 15:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=letp[i][col];
}
break;
}
case 16:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=letq[i][col];
}
break;
}
case 17:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=letr[i][col];
}
break;
}
case 18:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=lets[i][col];
}
break;
}
case 19:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=lett[i][col];
}
break;
}
case 20:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=letu[i][col];
}
break;
}
case 21:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=letv[i][col];
}
break;
}
case 22:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=letw[i][col];
}
break;
}
case 23:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=letx[i][col];
}
break;
}
case 24:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=lety[i][col];
}
break;
}
case 25:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=letz[i][col];
}
break;
}
case 26:{
for(int i=0;i<=7;i++){
PrintLedMatrix[i][initialcol]=letspace[i][col];
}
break;
}
default:
break;
}
}
void movingmatrix(int direction){
// moves matrix in the specified direction
for(int i=0;i<=6;i++){
for(int k=0;k<=7;k++){
PrintLedMatrix[k][abs(direction-i)]=PrintLedMatrix[k][abs(direction-(i+1))];
delay(1);
}
}
for(int i=0;i<=7;i++){
PrintLedMatrix[i][abs(direction-7)]=1;
}
}
void SelRow(int row){
if (row==1) digitalWrite(R1,HIGH); else digitalWrite(R1,LOW);
if (row==2) digitalWrite(R2,HIGH); else digitalWrite(R2,LOW);
if (row==3) digitalWrite(R3,HIGH); else digitalWrite(R3,LOW);
if (row==4) digitalWrite(R4,HIGH); else digitalWrite(R4,LOW);
if (row==5) digitalWrite(R5,HIGH); else digitalWrite(R5,LOW);
if (row==6) digitalWrite(R6,HIGH); else digitalWrite(R6,LOW);
if (row==7) digitalWrite(R7,HIGH); else digitalWrite(R7,LOW);
if (row==8) digitalWrite(R8,HIGH); else digitalWrite(R8,LOW);
}
void TurnOffALL_LED() {
digitalWrite(R1,LOW);
digitalWrite(R2,LOW);
digitalWrite(R3,LOW);
digitalWrite(R4,LOW);
digitalWrite(R5,LOW);
digitalWrite(R6,LOW);
digitalWrite(R7,LOW);
digitalWrite(R8,LOW);
digitalWrite(C1,HIGH);
digitalWrite(C2,HIGH);
digitalWrite(C3,HIGH);
digitalWrite(C4,HIGH);
digitalWrite(C5,HIGH);
digitalWrite(C6,HIGH);
digitalWrite(C7,HIGH);
digitalWrite(C8,HIGH);
}
void SetLEDinRow(int column, int state){
if (column==1) digitalWrite(C1,state);
if (column==2) digitalWrite(C2,state);
if (column==3) digitalWrite(C3,state);
if (column==4) digitalWrite(C4,state);
if (column==5) digitalWrite(C5,state);
if (column==6) digitalWrite(C6,state);
if (column==7) digitalWrite(C7,state);
if (column==8) digitalWrite(C8,state);
}
void but(){
if (digitalRead(button)==LOW){
pressedTime=millis();
}
else if(digitalRead(button)==HIGH){
if (direction == 0 ){ //direction and initial vals changed to change it from left to right or vice versa
direction = 7;
initialcol = 0;
Serial.println("Direction is Left to right");
}
else if (direction == 7){
direction = 0;
initialcol = 7;
Serial.println("Direction is Right to left");
}
}}