Tengo que contar el número de veces que se presiona un botón en 5 segundos y mostrarlo en una matriz de LED.
Si el número de veces que se hace clic en el botón es 1, entonces el último LED debería brillar ( 0001
- valor binario de 1). De manera similar, para 2 clics, el tercer LED debería brillar ( 0010
- binario de 2).
Pero cuando intento esto, siempre obtengo la salida para el caso 0
, sin importar cuántas veces haga clic en el botón.
¿Cuál es el problema?
#include<avr/io.h>
#include<avr/interrupt.h>
#include<util/delay.h>
int extratime=0;
int num_presses=0;
int main(void)
{
DDRD = 0b11111111;
PORTD = 0b00000000;
DDRB = 0b11110000;
PORTB = 0b00000000;
char button_state;
TCCR1B = (1 << WGM12);
OCR1A = 15625;
TIMSK = (1 << OCIE1A);
sei();
TCCR1B |= (1 << CS12) | (1 << CS10);
while(1)
{
if (bit_is_clear(PINB, 0)) //button is pressed
{
if (button_state==0) //was previously not pressed)
{
num_presses++;
}
button_state=1;
}
else
{
if (button_state==1) //was previously pressed
{
}
button_state=0;
}
}
}
ISR(TIMER1_COMPA_vect)
{
extratime++;
if(extratime == 5)
{
switch(num_presses)
{
case 0: PORTD = 0b10010000;
_delay_ms(10000);
break;
case 1: PORTD = 0b10000000;
_delay_ms(10000);
break;
case 2: PORTD = 0b01000000;
_delay_ms(10000);
break;
case 3: PORTD = 0b11000000;
_delay_ms(10000);
break;
case 4: PORTD = 0b00100000;
_delay_ms(10000);
break;
case 5: PORTD = 0b10100000;
_delay_ms(10000);
break;
default: PORTD =0b11110000;
break;
}
extratime = 0;
num_presses = 0;
}
}
este es mi nuevo código, incluso esto no funciona ... #incluir #incluir #incluir
int extra_time=0;
int num_presses=0;
int main(void)
{
DDRD = 0b11111111;
PORTD = 0b10000000;
DDRB = 0b00000111;
PORTB = 0b00000000;
char button_state;
TCCR1B = (1 << WGM12);
OCR1A = 15625;
TIMSK = (1 << OCIE1A);
sei();
TCCR1B |= (1 << CS12) | (1 << CS10);
while(1)
{
if (bit_is_clear(PINB, 0)) //button is pressed
{
if (button_state==0) //was previously not pressed)
{
num_presses++;
}
button_state=1;
}
else
{
if (button_state==1) //was previously pressed
{
}
button_state=0;
}
if (TCNT1 >= 15625)
{
if (extra_time == 5)
{
switch(num_presses)
{
case 0:
PORTD = 0b11100000;
break;
case 1:
PORTD = 0b00100000;
break;
case 2:
PORTD = 0b01000000;
break;
case 3:
PORTD = 0b01100000;
break;
default:
PORTD = 0b10100000 ;
break;
}
extra_time = 0;
}
else
{
++extra_time;
}
TCNT1 = 0;
}
}
}
Por favor ayuda ... Tengo que presentar este proyecto mañana.