#include <string.h>
#include <EEPROM.h>
/*2-dimensional array of column pin numbers:*/
int C[] = {13,12,11,10,9,8,7,6};    
const int LONG_PRESS_TIME  = 2000; // 1000 milliseconds
int PB = 2;
int speed_val=60;

int speed_con=0;
char dynamic_data;

char Data,current_data;
String datastring;
int datalength;
int char_to_process;
int count=0;

char ALPHA[] ={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0X00,0x00,       //Blank
0x00,0xfc,0x3a,0x11,0x11,0x3a,0xfc,0x00,0x00,0x00,       //A
0x00,0xff,0x99,0x99,0x99,0x66,0x00,0x00,0x00,0x00,       //B
0x00,0x3c,0x42,0x81,0x81,0x81,0x42,0x00,0x00,0x00,       //C
0x00,0xff,0x81,0x81,0x81,0x42,0x3c,0x00,0x00,0x00,       //D
0x00,0xff,0x89,0x89,0x89,0x81,0x00,0x00,0x00,0x00,       //E
0x00,0xff,0x09,0x09,0x09,0x01,0x00,0x00,0x00,0x00,       //F
0x00,0x3c,0x42,0x81,0x91,0x91,0x72,0x00,0x00,0x00,       //G
0x00,0xff,0x10,0x10,0x10,0xff,0x00,0x00,0x00,0x00,       //H
0x00,0x81,0x81,0xff,0x81,0x81,0x00,0x00,0x00,0x00,       //I
0x00,0x41,0x81,0x81,0x7f,0x01,0x01,0x00,0x00,0x00,       //J
0x00,0xff,0x18,0x24,0x42,0x81,0x00,0x00,0x00,0x00,       //K
0x00,0xff,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,       //L
0x00,0xff,0x02,0x04,0x04,0x02,0xff,0x00,0x00,0x00,       //M
0x00,0xff,0x06,0x08,0x10,0x60,0xff,0x00,0x00,0x00,       //N
0x00,0x3c,0x42,0x81,0x81,0x42,0x3c,0x00,0x00,0x00,       //O
0x00,0xff,0x11,0x11,0x11,0x0e,0x00,0x00,0x00,0x00,       //P
0x00,0x7e,0x91,0xa1,0x41,0xbe,0x00,0x00,0x00,0x00,       //Q
0x00,0xff,0x11,0x31,0x51,0x8e,0x00,0x00,0x00,0x00,       //R
0x00,0x4e,0x89,0x91,0x91,0x62,0x00,0x00,0x00,0x00,       //S
0x00,0x01,0x01,0xff,0x01,0x01,0x00,0x00,0x00,0x00,       //T
0x00,0x7f,0x80,0x80,0x80,0x80,0x7f,0x00,0x00,0x00,       //U
0x00,0x3f,0x40,0x80,0x40,0x3f,0x00,0x00,0x00,0x00,       //V
0xff,0x40,0x20,0x10,0x10,0x20,0x40,0xff,0x00,0x00,       //W
0x00,0xc3,0x24,0x18,0x18,0x24,0xc3,0x00,0x00,0x00,       //X
0x03,0x04,0x08,0xf0,0x08,0x04,0x03,0x00,0x00,0x00,       //Y
0xc1,0xa1,0x91,0x89,0x85,0x83,0x00,0x00,0x00,0x00        //Z
};


void speed_set()
{ 
  count = count +1;
  if (count > 2)
    count =0;
     if (count ==0)
    speed_val =60;
   else if(count == 1)
    speed_val= 40;
   else
    speed_val =20;  
}
void setup() 
{
 Serial.begin(115200);
 pinMode(PB, INPUT_PULLUP);
 attachInterrupt(digitalPinToInterrupt(PB), speed_set, FALLING);
 pinMode(C[0],OUTPUT);
 pinMode(C[1],OUTPUT);
 pinMode(C[2],OUTPUT);
 pinMode(C[3],OUTPUT);
 pinMode(C[4],OUTPUT);
 pinMode(C[5],OUTPUT);
 pinMode(C[6],OUTPUT);
 pinMode(C[7],OUTPUT);
  for (int i=0;i<8;i++)
  {
    digitalWrite(C[i],HIGH);
  }
  DDRA = 0xFF;
  PORTA =0;
}

void loop() 
{

Serial.println("Enter Data  AND else enter AS END CHARACTER $ ");
  do{
  while(!Serial.available());

  if(Serial.available()>0)
  {
    Data = Serial.read();
    datastring += Data;
   }
  }while(Data !='$');

  Serial.print("Data String is : ");
  Serial.println(datastring);
  Serial.flush();   // FLUSHING THE  SERIAL BUFFER
  datalength = datastring.length();
  Serial.print("Data length  is ");
  Serial.println(datalength);


int j=10;
for (int y=0;y<datalength-1;y++)   // HOW MANY CHARACTERS, USERS HAS ENTERED
  {
    current_data=datastring[y];
    char_to_process = int(current_data); // GETTING THE DECIMAL EQUIVALENT
  // Initializing EEPROM by 0     // MAX 512 CHARACTERS CAN BE STORED
  for (int i= 0; i<=9;i++)
        EEPROM.write(i, 0);   
 
  // copying the char in to a dynamic_data array 
            for (int i= 0; i<=9;i++)
             {
               dynamic_data=ALPHA[(char_to_process -64)*10 + i];// VALUE OF ALPHA ARRAY STORE AT THAT INDEX
               EEPROM.write(j+i, dynamic_data); 
             }
             j=j+10;
             
    }

  Serial.println("Displaying data on to Matrix");
  
  for(int k=0; k<=10;k++)   // THIS WILL DISPLAY DATA 1
  for(int x=0;x<(datalength-1)*10;x++)  // ADDRESS
  {
    for(int a=0;a<speed_val;a++)
    {
         for (int i=0;i<8;i++)
          { 
             digitalWrite(C[i],LOW);
             PORTA = EEPROM.read(i+x); // DATA CORRESPONDING TO THAT COLOUMN
            delay(1);
            digitalWrite(C[i],HIGH);
          }    
    }
  }
  
  delay(10);

}
mega:SCL
mega:SDA
mega:AREF
mega:GND.1
mega:13
mega:12
mega:11
mega:10
mega:9
mega:8
mega:7
mega:6
mega:5
mega:4
mega:3
mega:2
mega:1
mega:0
mega:14
mega:15
mega:16
mega:17
mega:18
mega:19
mega:20
mega:21
mega:5V.1
mega:5V.2
mega:22
mega:23
mega:24
mega:25
mega:26
mega:27
mega:28
mega:29
mega:30
mega:31
mega:32
mega:33
mega:34
mega:35
mega:36
mega:37
mega:38
mega:39
mega:40
mega:41
mega:42
mega:43
mega:44
mega:45
mega:46
mega:47
mega:48
mega:49
mega:50
mega:51
mega:52
mega:53
mega:GND.4
mega:GND.5
mega:IOREF
mega:RESET
mega:3.3V
mega:5V
mega:GND.2
mega:GND.3
mega:VIN
mega:A0
mega:A1
mega:A2
mega:A3
mega:A4
mega:A5
mega:A6
mega:A7
mega:A8
mega:A9
mega:A10
mega:A11
mega:A12
mega:A13
mega:A14
mega:A15
led1:A
led1:C
led2:A
led2:C
led3:A
led3:C
led4:A
led4:C
led5:A
led5:C
led6:A
led6:C
led7:A
led7:C
led8:A
led8:C
led9:A
led9:C
led10:A
led10:C
led11:A
led11:C
led12:A
led12:C
led13:A
led13:C
led14:A
led14:C
led15:A
led15:C
led16:A
led16:C
led17:A
led17:C
led18:A
led18:C
led19:A
led19:C
led20:A
led20:C
led21:A
led21:C
led22:A
led22:C
led23:A
led23:C
led24:A
led24:C
led25:A
led25:C
led26:A
led26:C
led27:A
led27:C
led28:A
led28:C
led29:A
led29:C
led30:A
led30:C
led31:A
led31:C
led32:A
led32:C
led33:A
led33:C
led34:A
led34:C
led35:A
led35:C
led36:A
led36:C
led37:A
led37:C
led38:A
led38:C
led39:A
led39:C
led40:A
led40:C
led41:A
led41:C
led42:A
led42:C
led43:A
led43:C
led44:A
led44:C
led45:A
led45:C
led46:A
led46:C
led47:A
led47:C
led48:A
led48:C
led49:A
led49:C
led50:A
led50:C
led51:A
led51:C
led52:A
led52:C
led53:A
led53:C
led54:A
led54:C
led55:A
led55:C
led56:A
led56:C
led57:A
led57:C
led58:A
led58:C
led59:A
led59:C
led60:A
led60:C
led61:A
led61:C
led62:A
led62:C
led63:A
led63:C
led64:A
led64:C
r1:1
r1:2
r2:1
r2:2
r3:1
r3:2
r4:1
r4:2
r5:1
r5:2
r6:1
r6:2
r7:1
r7:2
r8:1
r8:2
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r