CCCPaste
#define PUERTO_LEDS PORTD
#define CONFIGURAR_LEDS DDRD = 0xFF

#define CONFIGURAR_BOTON DDRB = DDRB | (1<<0)
#define BOT_PRESIONADO digitalRead(8)

#define CONFIGURAR_LED_TEST DDRB = DDRB | (1<<5)
#define ENCENDER_LED_TEST PORTB = PORTB | (1<<5)
#define APAGAR_LED_TEST PORTB = PORTB & ~(1<<5)


#define TPO_LED_TEST_ON 950
#define TPO_LED_TEST_OFF 50

//Estado anterior del boton
static bool presionado_ant = 0;

//referencia milis led test
static unsigned long milis_ant_test = 0;

//
static bool led_ant_test = 0;
static int efecto = 0;
static unsigned long milis_ant_efecto = 0;
static int contador = 0;
int start_presion = 0;
int end_presion = 0;
int idle_presion = 0;
int hold_presion = 0;
bool sentido_efecto1 = 0;

void setup() {

  CONFIGURAR_LED_TEST;
  CONFIGURAR_BOTON;
  CONFIGURAR_LEDS;

}

void loop() {

  LedTest();
  SupervisaPulsador();
  Efectos();

}

void SupervisaPulsador(void)
{
  bool presionado = BOT_PRESIONADO;
  if (presionado == presionado_ant) return;

  presionado_ant = presionado;

  if (BOT_PRESIONADO) {

    start_presion = millis();
    idle_presion = start_presion - end_presion;


    /*efecto++;
      PUERTO_LEDS = B00000000;
      if(efecto == 3){
      efecto = 0;
      }*/

  } else {
    end_presion = millis();
    hold_presion = end_presion - start_presion;
    if (hold_presion >= 500) {
      efecto = 2;
    }
    if (hold_presion < 500) efecto = 0;

    if (idle_presion < 500) {
      efecto = 1;
      sentido_efecto1 = !sentido_efecto1;
    }

  }

}

/* Eventos
    Se presionó el botón
    Se superaron los 500ms con el botón presionado
    Se liberó el botón antes de los 500ms
    Se liberó el botón después de los 500ms
    Pasaron más de 500ms desde que se liberó el botón
*/



void LedTest()
{
  unsigned long tiempoActual = millis();

  if (tiempoActual - milis_ant_test >= 950 && led_ant_test == 0) {

    milis_ant_test = tiempoActual;
    ENCENDER_LED_TEST;
    led_ant_test = 1;

  } else if (tiempoActual - milis_ant_test >= 50 && led_ant_test == 1) {
    milis_ant_test = tiempoActual;
    APAGAR_LED_TEST;
    led_ant_test = 0;
  }



}

void Efectos(void)
{
  unsigned long tiempoActualEfecto = millis();

  if (tiempoActualEfecto - milis_ant_efecto >= 500) {
    milis_ant_efecto = tiempoActualEfecto;

    switch (efecto) {
      case 0:


        PUERTO_LEDS <<= 1;

        PUERTO_LEDS = PUERTO_LEDS | 1;

        if (PUERTO_LEDS == B11111111) {
          PUERTO_LEDS = B00000000;
        }


        break;

      case 1:

        if (sentido_efecto1) {
          switch (contador) {

            case 0:
              PUERTO_LEDS = B00000000;
              PUERTO_LEDS = PUERTO_LEDS | (1 << 0);
              break;
            case 1:
              PUERTO_LEDS = B00000000;
              PUERTO_LEDS = PUERTO_LEDS | (1 << 1);
              break;
            case 2:
              PUERTO_LEDS = B00000000;
              PUERTO_LEDS = PUERTO_LEDS | (1 << 2);
              break;
            case 3:
              PUERTO_LEDS = B00000000;
              PUERTO_LEDS = PUERTO_LEDS | (1 << 3);
              break;
            case 4:
              PUERTO_LEDS = B00000000;
              PUERTO_LEDS = PUERTO_LEDS | (1 << 4);
              break;
            case 5:
              PUERTO_LEDS = B00000000;
              PUERTO_LEDS = PUERTO_LEDS | (1 << 5);
              break;
            case 6:
              PUERTO_LEDS = B00000000;
              PUERTO_LEDS = PUERTO_LEDS | (1 << 6);
              break;
            case 7:
              PUERTO_LEDS = B00000000;
              PUERTO_LEDS = PUERTO_LEDS | (1 << 7);
              break;


          }

          contador++;

          if (contador > 7) contador = 0;
        }

        else {
          switch (contador) {

            case 0:
              PUERTO_LEDS = B00000000;
              PUERTO_LEDS = PUERTO_LEDS | (1 << 7);
              break;
            case 1:
              PUERTO_LEDS = B00000000;
              PUERTO_LEDS = PUERTO_LEDS | (1 << 6);
              break;
            case 2:
              PUERTO_LEDS = B00000000;
              PUERTO_LEDS = PUERTO_LEDS | (1 << 5);
              break;
            case 3:
              PUERTO_LEDS = B00000000;
              PUERTO_LEDS = PUERTO_LEDS | (1 << 4);
              break;
            case 4:
              PUERTO_LEDS = B00000000;
              PUERTO_LEDS = PUERTO_LEDS | (1 << 3);
              break;
            case 5:
              PUERTO_LEDS = B00000000;
              PUERTO_LEDS = PUERTO_LEDS | (1 << 2);
              break;
            case 6:
              PUERTO_LEDS = B00000000;
              PUERTO_LEDS = PUERTO_LEDS | (1 << 1);
              break;
            case 7:
              PUERTO_LEDS = B00000000;
              PUERTO_LEDS = PUERTO_LEDS | (1 << 0);
              break;


          }

          contador++;

          if (contador > 7) contador = 0;
        }










        break;

      case 2:

        PUERTO_LEDS = B00000000;

      default:
        break;

    }
  }

}