Introducir interrupcion en programa de encendido de leds

Buenas compañeros.
Tengo un programa que funciona bien, consiste en que cuando pulsas un botón se enciende un led, si lo vuelves a pulsar se enciende el siguiente.
Si dejas presionado el pulsador no ocurre nada hasta que se desconecta y se vuelve a pulsar para encender el siguiente.

Son 8 leds y se enciende uno cada vez que se pulsa el botón.

Lo que necesito es que si después de haber encendido el primero, si se tarda mas de 20 segundos en pulsar de nuevo el botón, en vez de encenderse el led 2º pase directamente a encender el 3º.

El PIC es 16f877A, aunque quería pasarlo mas tarde a sistema arduino

Os pego el código de lo que tengo hecho que puede facilitar la tarea:

Código:
int num=0;
int state=0;

void main()
{

inicializar_puertos();

    output_b(0b00000000);
    while(true)
        {    
        if (num<8)
            {
            if (!input(pin_A0))
                {
                while (state==0)
                    {
                    num=num+1;
                    state=1;
                    }
                while (state==1)
                    {
                    if (input(pin_A0))
                    {
                        state=0;
                    }
                    }
                }
            }



        switch (num)
            {
                case 0: output_b(0b00000000);
                break;
                case 1: output_b(0b00000001);
                break;
                case 2: output_b(0b00000011);
                break;
                case 3: output_b(0b00000111);
                break;
                case 4: output_b(0b00001111);
                break;
                case 5: output_b(0b00011111);
                break;
                case 6: output_b(0b00111111);
                break;
                case 7: output_b(0b01111111);
                break;
                case 8: output_b(0b11111111);
                break;
            }
    }
}

void Inicializar_Puertos()
{
set_tris_b(0b00000000);
set_tris_a(0b11111111);
}
 
Última edición por un moderador:
Atrás
Arriba