#include <IRremote.h>

#define Farriba 16736925
#define Fder 16761405
#define Fabajo 16754775
#define Fizq 16720605
#define centro 16712445
#define boton1 16738455
#define boton2 16750695
#define boton3 16756815
#define boton4 16724175
#define boton5 16718055
#define boton6 16743045
#define boton7 16716015
#define boton8 16726215
#define boton9 16734885
#define ast 16728765
#define boton0 16730805
#define almo 16732845

//int ctrl = 0;

int col[]={2,3,4,5,6,7,8};
int fila[]={9,10,11,12,13,14};


int RECV_PIN = 15; // IR Receptor pin
IRsend irsend;
IRrecv irrecv(RECV_PIN);
decode_results results;

int matriz[7][6];

int ON[7][6]= {
    {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} };
    
int OFF[7][6]= { 
    {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} };
    
void setup(){
  for(int i=0; i<=6; i++){
    pinMode(col[i],OUTPUT);
    digitalWrite(col[i],LOW);
  }
  for(int j=0; j<=5; j++){
    pinMode(fila[j], OUTPUT);
    digitalWrite(fila[j],HIGH);
  }
  Serial.begin(9600);               // inicializar el puerto serie de comunicaciones a 9600 bps
  irrecv.enableIRIn();              // Reinicia el receptor
  pinMode(16, OUTPUT);
}


void loop(){
  
if(irrecv.decode(&results)){
   switch(results.value){
   case Farriba:  
          for(int j=0; j<=5; j++){
            digitalWrite(fila[j],HIGH);
            }
           break;
    case Fabajo:
          for(int j=0; j<=5; j++){
            digitalWrite(fila[j],LOW);
            }
           break;
    case centro:
            while(1){
              for(int j=0; j<=5; j++){
                digitalWrite(fila[j],HIGH);
              }
              delay(200);
                
              for(int j=0; j<=5; j++){
                digitalWrite(fila[j],LOW);
              }
              delay(200);
             
              if(irrecv.decode(&results)){      // si se obtiene una señal IR del receptor IR
                if((results.value == Farriba || results.value == Fabajo || results.value == boton1 || results.value == boton2 || results.value == boton3 || results.value == boton4 ||
                    results.value == boton5 || results.value == boton6 || results.value == boton7 || results.value == boton9 || results.value == ast || results.value == almo))
                break;
                irrecv.resume();
              }
            }
            break;
    case boton1: 
            despl_abajo();
            break;
    case boton3:
            despl_arriba();
            break;
    case boton2: 
            despl_abajo_inv();
            break;
    case boton4:
            despl_arriba_inv();
            break;  
    case boton5:
            despl_izquierda();
            break;
    case boton6:
            despl_der();
            break;
    case boton7:
            despl_izq(); 
            break;
    case boton8:
            despl_derecha();
            break;
    case boton9:
            while(1){
              for(int j=0; j<=5; j++){
                digitalWrite(fila[j],LOW);
              }
              delay(50);
              for(int j=0; j<=5; j++){
                digitalWrite(fila[j],HIGH);
              }
          
              if(irrecv.decode(&results)){      // si se obtiene una señal IR del receptor IR
                if((results.value == Farriba || results.value == Fabajo || results.value == boton1 || results.value == boton2 || results.value == boton3 || results.value == boton4 ||
                    results.value == boton5 || results.value == boton6 || results.value == boton7 || results.value == centro || results.value == ast || results.value == almo))
                break;
                irrecv.resume();
              }
            }
            break; 
 } 
  
   irrecv.resume();
}  
  
  
  
}  // fin loop


void parpadeo(){
  for(int j=0; j<=5; j++){
     digitalWrite(fila[j],LOW);
  }
  
  delay(400);
  for(int j=0; j<=5; j++){
     digitalWrite(fila[j],HIGH);
  }
  delay(400);
}  
  
void despl_abajo(){
  for(int j=0; j<=5; j++){
    digitalWrite(fila[j],LOW);
  }
  delay(200);
  digitalWrite(fila[1],HIGH);
  delay(200);
  digitalWrite(fila[2],HIGH);
  delay(200);
  digitalWrite(fila[5],HIGH);
  delay(200);
  digitalWrite(fila[0],HIGH);  
  delay(200);
  digitalWrite(fila[3],HIGH);
  delay(200);
  digitalWrite(fila[4],HIGH);
}

void despl_arriba(){
  for(int j=0; j<=5; j++){
    digitalWrite(fila[j],LOW);
  }
  delay(200);
  digitalWrite(fila[4],HIGH);
  delay(200);
  digitalWrite(fila[3],HIGH);
  delay(200);
  digitalWrite(fila[0],HIGH);
  delay(200);
  digitalWrite(fila[5],HIGH);  
  delay(200);
  digitalWrite(fila[2],HIGH);
  delay(200);
  digitalWrite(fila[1],HIGH);
}

void despl_abajo_inv(){
  delay(200);
  digitalWrite(fila[1],LOW);
  delay(200);
  digitalWrite(fila[2],LOW);
  delay(200);
  digitalWrite(fila[5],LOW);
  delay(200);
  digitalWrite(fila[0],LOW);  
  delay(200);
  digitalWrite(fila[3],LOW);
  delay(200);
  digitalWrite(fila[4],LOW);
}

void despl_arriba_inv(){
  delay(200);
  digitalWrite(fila[4],LOW);
  delay(200);
  digitalWrite(fila[3],LOW);
  delay(200);
  digitalWrite(fila[0],LOW);
  delay(200);
  digitalWrite(fila[5],LOW);  
  delay(200);
  digitalWrite(fila[2],LOW);
  delay(200);
  digitalWrite(fila[1],LOW);
}

//////

void despl_izquierda(){
  for(int j=0; j<=6; j++){
    digitalWrite(col[j],HIGH);
  }
  for(int j=0; j<=5; j++){
    digitalWrite(fila[j],LOW);
}
  delay(200);
  digitalWrite(col[0],LOW);
  digitalWrite(fila[1],LOW);
  delay(200);
  digitalWrite(fila[1],HIGH);
  digitalWrite(col[1],LOW);
  digitalWrite(fila[2],LOW);
  delay(200);
  digitalWrite(fila[2],HIGH);
  digitalWrite(col[3],LOW);
  digitalWrite(fila[5],LOW);
  delay(200);
  digitalWrite(fila[5],HIGH);
  digitalWrite(col[2],LOW);
  digitalWrite(fila[0],LOW); 
  delay(200);
  digitalWrite(fila[0],HIGH); 
  digitalWrite(col[5],LOW);
  digitalWrite(fila[3],LOW);
  delay(200);
  digitalWrite(fila[3],HIGH);
  digitalWrite(col[4],LOW);
  digitalWrite(fila[4],LOW);
  delay(200);
  digitalWrite(col[6],LOW);
  digitalWrite(fila[4],HIGH);
}

void despl_derecha(){
  for(int j=0; j<=6; j++){
    digitalWrite(col[j],HIGH);
  }
  for(int j=0; j<=5; j++){
    digitalWrite(fila[j],LOW);
}
  delay(200);
  digitalWrite(col[6],LOW);
  digitalWrite(fila[4],LOW);
  delay(200);
  digitalWrite(fila[3],HIGH);
  digitalWrite(col[4],LOW);
  digitalWrite(fila[4],HIGH);
  delay(200);
  digitalWrite(fila[0],HIGH);
  digitalWrite(col[5],LOW);
//  digitalWrite(fila[3],LOW);
  delay(200);
  digitalWrite(fila[5],HIGH);
  digitalWrite(col[2],LOW);
//  digitalWrite(fila[0],LOW); 
  delay(200);
  digitalWrite(fila[2],HIGH); 
  digitalWrite(col[3],LOW);
//  digitalWrite(fila[5],LOW);
  delay(200);
  digitalWrite(fila[1],HIGH);
  digitalWrite(col[1],LOW);
//  digitalWrite(fila[2],LOW);
  delay(200);
  digitalWrite(col[0],LOW);
  digitalWrite(fila[1],HIGH);
}

void despl_der(){
  for(int j=0; j<=6; j++){
    digitalWrite(col[j],HIGH);
  }
  for(int j=0; j<=5; j++){
    digitalWrite(fila[j],LOW);
}
  delay(200);
  digitalWrite(col[6],LOW);
  digitalWrite(fila[1],LOW);
  delay(200);
  digitalWrite(fila[1],HIGH);
  digitalWrite(col[4],LOW);
  digitalWrite(fila[2],LOW);
  delay(200);
  digitalWrite(fila[2],HIGH);
  digitalWrite(col[5],LOW);
  digitalWrite(fila[5],LOW);
  delay(200);
  digitalWrite(fila[5],HIGH);
  digitalWrite(col[2],LOW);
  digitalWrite(fila[0],LOW); 
  delay(200);
  digitalWrite(fila[0],HIGH); 
  digitalWrite(col[3],LOW);
  digitalWrite(fila[3],LOW);
  delay(200);
  digitalWrite(fila[3],HIGH);
  digitalWrite(col[1],LOW);
  digitalWrite(fila[4],LOW);
  delay(200);
  digitalWrite(col[0],LOW);
  digitalWrite(fila[4],HIGH);
}


void despl_izq(){
  for(int j=0; j<=6; j++){
    digitalWrite(col[j],HIGH);
  }
  for(int j=0; j<=5; j++){
    digitalWrite(fila[j],LOW);
}
  delay(200);
  digitalWrite(col[0],LOW);
  digitalWrite(fila[4],LOW);
  delay(200);
  digitalWrite(fila[4],HIGH);
  digitalWrite(col[1],LOW);
  digitalWrite(fila[3],LOW);
  delay(200);
  digitalWrite(fila[3],HIGH);
  digitalWrite(col[3],LOW);
  digitalWrite(fila[0],LOW);
  delay(200);
  digitalWrite(fila[0],HIGH);
  digitalWrite(col[2],LOW);
  digitalWrite(fila[5],LOW); 
  delay(200);
  digitalWrite(fila[5],HIGH); 
  digitalWrite(col[5],LOW);
  digitalWrite(fila[2],LOW);
  delay(200);
  digitalWrite(fila[2],HIGH);
  digitalWrite(col[4],LOW);
  digitalWrite(fila[1],LOW);
  delay(200);
  digitalWrite(col[6],LOW);
  digitalWrite(fila[1],HIGH);
}


