const byte ledPin0 = 6;
const byte ledPin1 = 7;
const byte ledPin2 = 8;
const byte ledPin3 = 9;
const byte ledPin4 = 10;
const byte ledPin5 = 11;
const byte ledPin6 = 12;
const byte ledPin7 = 13;

const byte mode0 = 3;
const byte mode1 = 4;

const byte InterruptPin = 2;
volatile byte UpDown = HIGH;

byte ledState = 0; 
byte mode = 0;
byte inicio = 0;
byte direccion = true;
byte izquierda = 0;
byte derecha = 0;
unsigned long previousMillis = 0; 
const long interval = 1000; 

void setup() {
  // put your setup code here, to run once:
  pinMode(ledPin0, OUTPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin5, OUTPUT);
  pinMode(ledPin6, OUTPUT);
  pinMode(ledPin7, OUTPUT);

  pinMode(mode0, OUTPUT);
  pinMode(mode1, OUTPUT);


  pinMode(InterruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(InterruptPin), blink, FALLING);
}

void loop() {
  // put your main code here, to run repeatedly:
unsigned long currentMillis = millis();

if (currentMillis - previousMillis >= interval) {
      previousMillis = currentMillis;

///////////////////////////////////////////////////
//Secuencias
///////////////////////////////////////////////////
//*************************************************
//Secuencias 1
//*************************************************
if(mode==0){
  if(direccion==true)
  {
    ledState<<=1;
    if(ledState==0b10000000)
      direccion=false;
  }
  else
  {
    ledState>>=1;
    if(ledState==0b00000001)
      direccion=true;
  }
}
//*************************************************
//*************************************************
//Secuencias 2
//*************************************************
else if(mode==1){
  if(direccion==true)
  {
    derecha<<=1;
    izquierda>>=1;
    ledState=ledState|derecha;
    ledState=ledState|izquierda;
    if(ledState==0b11111111){
      direccion=false;
      derecha=0b11111111;
      izquierda=0b11111111;
    }
  }
  else
  {
    derecha<<=1;
    izquierda>>=1;
    ledState=ledState&derecha;
     ledState=ledState&izquierda;

    if(ledState==0b00000000){
      direccion=true;
      ledState=0b10000001;
      derecha=0b00000001;
      izquierda=0b10000000;     
    }
  }
}
//*************************************************
//*************************************************
//Secuencias 3
//*************************************************
else if(mode==2){
  if(direccion==true)
  {
    derecha<<=1;
    izquierda>>=1;
    ledState=ledState|derecha;
     ledState=ledState|izquierda;
    if(ledState==0b11111111){
      direccion=false;
      derecha=0b11101111;
      izquierda=0b11110111;
    }
  }
  else
  {
    ledState=ledState&derecha;
    ledState=ledState&izquierda;
    derecha<<=1;
    derecha++;
    izquierda>>=1;
    izquierda|=0b10000000;

    if(ledState==0b00000000){
      direccion=true;
      ledState=0b00011000;
      derecha=0b00001000;
      izquierda=0b00010000;   
    }
  }
}
//*************************************************
//*************************************************
//Secuencias 4
//*************************************************
else if(mode==3){
  if(direccion==true)
  {
    derecha<<=1;
    izquierda>>=1;
    ledState=derecha;
    ledState=ledState|izquierda;
    if(ledState==0b10000001){
      direccion=false;
      derecha=0b00000001;
      izquierda=0b10000000;
    }
  }
  else
  {
    derecha<<=1;
    izquierda>>=1;
    ledState=ledState&derecha;
     ledState=ledState&izquierda;

    if(ledState==0b00000000){
      direccion=true;
      ledState=0b10000001;
      derecha=0b00000001;
      izquierda=0b10000000;     
    }
  }
}
//*************************************************
}
  digitalWrite(ledPin0,bitRead(~ledState,0));
  digitalWrite(ledPin1,bitRead(~ledState,1));
  digitalWrite(ledPin2,bitRead(~ledState,2));
  digitalWrite(ledPin3,bitRead(~ledState,3));
  digitalWrite(ledPin4,bitRead(~ledState,4));
  digitalWrite(ledPin5,bitRead(~ledState,5));
  digitalWrite(ledPin6,bitRead(~ledState,6));
  digitalWrite(ledPin7,bitRead(~ledState,7));

  digitalWrite(mode0, bitRead(~mode,0));
  digitalWrite(mode1, bitRead(~mode,1));


}

void blink(){
  if(mode<3){ 
    mode++;
  }
  else {
    mode=0;
  }
  inicio = 0;
  if(mode==0){
   ledState=0b00000001;
  }
  if(mode==1){
    ledState=0b10000001;
    derecha=0b00000001;
    izquierda=0b10000000;
  }
  if(mode==2){
    ledState=0b00011000;
    derecha=0b00001000;
    izquierda=0b00010000;
  }
  if(mode==3){
    ledState=0b00011000;
  }
}