unsigned int contador = 0;
int T1 = 0;
int Fx = 1;

int Selector[8][8] = {
  {0,1,1,1,1,1,1,1},
  {1,0,1,1,1,1,1,1},
  {1,1,0,1,1,1,1,1},
  {1,1,1,0,1,1,1,1},
  {1,1,1,1,0,1,1,1},
  {1,1,1,1,1,0,1,1},
  {1,1,1,1,1,1,0,1},
  {1,1,1,1,1,1,1,0}
};

int matriz1[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}
};

int matriz2[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 dy[] = {1, 0, 1};
int dx[] = {-1, -1, 0};

int DS1 =2;
int lanzador1 =  3;
int CLOCK1 = 4;
int DS2 = 5;
int lanzador2 =  7;
int CLOCK2 = 6;
int fotograma=2;

void animacion(int numero);
void animacion(int numero){
  for(int indice=7; indice>=0; indice--){
    if(Selector[numero][indice]==0){
      digitalWrite(DS1, LOW);
      digitalWrite(CLOCK1, HIGH);
      digitalWrite(CLOCK1, LOW);
      digitalWrite(DS2, LOW);
      digitalWrite(CLOCK2, HIGH);
      digitalWrite(CLOCK2, LOW);
    }else{
      digitalWrite(DS1, HIGH);
      digitalWrite(CLOCK1, HIGH);
      digitalWrite(CLOCK1, LOW);
      digitalWrite(DS1, LOW);
      digitalWrite(DS2, HIGH);
      digitalWrite(CLOCK2, HIGH);
      digitalWrite(CLOCK2, LOW);
      digitalWrite(DS2, LOW);
    }
  }
  for(int indice=7; indice>=0; indice--){
    if(matriz1[indice][numero]==0){
      digitalWrite(DS1, LOW);
      digitalWrite(CLOCK1, HIGH);
      digitalWrite(CLOCK1, LOW);
    }else{
      digitalWrite(DS1, HIGH);
      digitalWrite(CLOCK1, HIGH);
      digitalWrite(CLOCK1, LOW);
      digitalWrite(DS1, LOW);
    }
    if(matriz2[indice][numero]==0){
      digitalWrite(DS2, LOW);
      digitalWrite(CLOCK2, HIGH);
      digitalWrite(CLOCK2, LOW);
    }else{
      digitalWrite(DS2, HIGH);
      digitalWrite(CLOCK2, HIGH);
      digitalWrite(CLOCK2, LOW);
      digitalWrite(DS2, LOW);
    }
  }
}

enum tipo_estado {Sm1,Sm2,Sm3,Sm4,Sm5,Sm6,Sm7,Sm8,Sfx,Swait}; //Se define tipo dato
enum tipo_estado estado = Sm1;

enum state_type {SVisual,Supdate}; //Se define tipo dato
enum state_type state = SVisual;

void setup(){
Serial.begin(9600);
pinMode(DS1, OUTPUT);
pinMode(CLOCK1, OUTPUT);
pinMode(lanzador1, OUTPUT);
pinMode(DS2, OUTPUT);
pinMode(CLOCK2, OUTPUT);
pinMode(lanzador2, OUTPUT);

}    

void loop(){
//logica de salida FM1
  switch(state){
    case SVisual:
    break;
    case Supdate:
    //Primer angulo
      for(int fila=7; fila>=0; fila--){
        for(int columna=0; columna<=7; columna++){
          if(matriz1[fila][columna]==1){
            int izquierda = 0;
            int derecha = 0;        
            int columna_izquierda = 0;
            int fila_izquierda = 0;
            int columna_derecha = 0;
            int fila_derecha = 0;
            int cambio= 0;
          for(int direccion= 0; direccion<3; direccion++){
            int y = fila;
            int x = columna; //Guarda la pocision
            y += dy[direccion]; //Cambia la pocision
            x += dx[direccion];
            if(x>=0 && y<=7){ //verifica la nueva posicion = valida
              if(direccion == 0 && matriz1[y][x] == 0){
                matriz1[fila][columna] = 0;
                matriz1[y][x] = 1;
                cambio = 1;
              }
              if(direccion == 1 && matriz1[y][x] == 0 && cambio == 0){
                while(x>=0 && y<=7 && matriz1[y][x] == 0 ){
                      izquierda ++;
                      columna_izquierda = x;
                      fila_izquierda = y;
                      y += dy[direccion];
                      x += dx[direccion];
                }
              }
              if (direccion == 2 && matriz1[y][x] == 0 && cambio == 0){
                while(x>=0 && y<=7 && matriz1[y][x] == 0){
                  derecha ++;
                  columna_derecha = x;
                  fila_derecha = y;
                  y += dy[direccion];
                  x += dx[direccion];
                }
              }
            }
          }
          if(derecha>izquierda){
            matriz1[fila][columna] = 0;
            matriz1[fila_derecha][columna_derecha] = 1;
            }else if(izquierda>derecha){
            matriz1[fila][columna] = 0;
            matriz1[fila_izquierda][columna_izquierda] = 1;
            }else if(izquierda=derecha && izquierda!= 0 && derecha!= 0){
            matriz1[fila][columna] = 0;
            matriz1[fila_izquierda][columna_izquierda] = 1; 
            }  
          }
        }
      }
//Primer angulo
      for(int fila=7; fila>=0; fila--){
        for(int columna=0; columna<=7; columna++){
          if(matriz2[fila][columna]==1){
            int izquierda = 0;
            int derecha = 0;        
            int columna_izquierda = 0;
            int fila_izquierda = 0;
            int columna_derecha = 0;
            int fila_derecha = 0;
            int cambio= 0;
          for(int direccion= 0; direccion<3; direccion++){
            int y = fila;
            int x = columna; //Guarda la pocision
            y += dy[direccion]; //Cambia la pocision
            x += dx[direccion];
            if(x>=0 && y<=7){ //verifica la nueva posicion = valida
              if(direccion == 0 && matriz2[y][x] == 0){
                matriz2[fila][columna] = 0;
                matriz2[y][x] = 1;
                cambio = 1;
              }
              if(direccion == 1 && matriz2[y][x] == 0 && cambio == 0){
                while(x>=0 && y<=7 && matriz2[y][x] == 0 ){
                      izquierda ++;
                      columna_izquierda = x;
                      fila_izquierda = y;
                      y += dy[direccion];
                      x += dx[direccion];
                }
              }
              if (direccion == 2 && matriz2[y][x] == 0 && cambio == 0){
                while(x>=0 && y<=7 && matriz2[y][x] == 0){
                  derecha ++;
                  columna_derecha = x;
                  fila_derecha = y;
                  y += dy[direccion];
                  x += dx[direccion];
                }
              }
            }
          }
          if(derecha>izquierda){
            matriz2[fila][columna] = 0;
            matriz2[fila_derecha][columna_derecha] = 1;
            }else if(izquierda>derecha){
            matriz2[fila][columna] = 0;
            matriz2[fila_izquierda][columna_izquierda] = 1;
            }else if(izquierda=derecha && izquierda!= 0 && derecha!= 0){
            matriz2[fila][columna] = 0;
            matriz2[fila_izquierda][columna_izquierda] = 1; 
            }  
          }
        }
      }

      if(matriz1[7][0]==1 && fotograma==0){
        fotograma=2;
        matriz1[7][0]= 0;
        matriz2[0][7]= 1;
      }
      Serial.println("imagen generada");
    Fx=1;
    break;
  }
  //Sm1,Sm2,Sm3,Sm4,Sm5,Sm6,Sm7,Sm8,Sfx,Swait//
//logica de salida FM2
  switch(estado){
    case Sm1:
      animacion(0);
        digitalWrite(lanzador1, HIGH);
        digitalWrite(lanzador1, LOW);
        digitalWrite(lanzador2, HIGH);
        digitalWrite(lanzador2, LOW); 
    break;
    case Sm2:
      animacion(1);
        digitalWrite(lanzador1, HIGH);
        digitalWrite(lanzador1, LOW);
        digitalWrite(lanzador2, HIGH);
        digitalWrite(lanzador2, LOW); 
    break;
    case Sm3:
      animacion(2);
        digitalWrite(lanzador1, HIGH);
        digitalWrite(lanzador1, LOW);
        digitalWrite(lanzador2, HIGH);
        digitalWrite(lanzador2, LOW); 
    break;
    case Sm4:
      animacion(3);
        digitalWrite(lanzador1, HIGH);
        digitalWrite(lanzador1, LOW);
        digitalWrite(lanzador2, HIGH);
        digitalWrite(lanzador2, LOW); 
    break;
    case Sm5:
      animacion(4);
        digitalWrite(lanzador1, HIGH);
        digitalWrite(lanzador1, LOW);
        digitalWrite(lanzador2, HIGH);
        digitalWrite(lanzador2, LOW); 
    break;
    case Sm6:
      animacion(5);
        digitalWrite(lanzador1, HIGH);
        digitalWrite(lanzador1, LOW);
        digitalWrite(lanzador2, HIGH);
        digitalWrite(lanzador2, LOW); 
    break;
    case Sm7:
      animacion(6);
        digitalWrite(lanzador1, HIGH);
        digitalWrite(lanzador1, LOW);
        digitalWrite(lanzador2, HIGH);
        digitalWrite(lanzador2, LOW); 
    break;
    case Sm8:
      animacion(7);
        digitalWrite(lanzador1, HIGH);
        digitalWrite(lanzador1, LOW);
        digitalWrite(lanzador2, HIGH);
        digitalWrite(lanzador2, LOW); 
      contador++;
    break;

    case Sfx:
    if(contador==50){
      contador=0;
      Fx=0;
      T1=1;
    }
    break;

    case Swait:
    break;
  }

  //logica de estado siguiente
  switch(state){
    case SVisual :
      if(T1==1){
        state=Supdate;
        T1=0;
      }else{
        state=SVisual;
      }
    break;
    case Supdate :
      state=SVisual;
      fotograma--;
    break;
  }
  //logica de estado siguiente
  switch(estado){
    case Sm1 :
      estado=Sm2;
    break;
    case Sm2 :
      estado=Sm3;
    break;
    case Sm3 :
      estado=Sm4;
    break;
    case Sm4 :
      estado=Sm5;
    break;
    case Sm5 :
      estado=Sm6;
    break;
    case Sm6 :
      estado=Sm7;
    break;
    case Sm7 :
      estado=Sm8;
    break;
    case Sm8 :
      estado=Sfx;
    break;
    case Sfx :
      estado=Swait;
    break;
    case Swait :
      if(Fx==0){
        estado=Swait;
      }else{
        estado=Sm1;
      }
    break;
  }
}

$abcdeabcde151015202530354045505560fghijfghij
74HC595
74HC595
74HC595
74HC595