#define IRQ0 __vector_1 #define TIM0_OVF __vector_7 #define SIGNAL __attribute__ ((signal)) unsigned char *led; unsigned char *leddir; unsigned int counter; //contador de interrupções unsigned char tipo_interrupcao; unsigned char value; void print_led(unsigned char value); void leds_off(void); void enable_interrupt(void); unsigned char check_buttons(void); void IRQ0(void) SIGNAL; void TIM0_OVF(void) SIGNAL; int main(void) { led = (unsigned char*) 0x38; leddir = (unsigned char*) 0x37; *leddir = 0xff; tipo_interrupcao = 0x00; // interrupção na descida counter = 0; leds_off(); enable_interrupt(); while(1); return 0; } void IRQ0(void) { unsigned char *timsk; timsk = (unsigned char*) 0x59; unsigned char *mcucr; mcucr = (unsigned char*) 0x55; if (tipo_interrupcao == 0x00) { //apertou o botão counter = 0; *mcucr = 0x03; //altera para interrupção na rampa de descida *timsk = 0x02; //ativa o contador } else { //soltou o botão *mcucr = 0x02; //altera para interrupção na rampa de subida *timsk = 0x00; //reseta o contador leds_off(); counter = 0; } tipo_interrupcao = ~tipo_interrupcao; } void TIM0_OVF(void) { counter++; if (counter >= 61) { print_led(check_buttons()); } } /* acende os leds de acordo com o parâmetro "value". */ void print_led(unsigned char value) { *led = value; } /* apaga todos os leds. */ void leds_off(void) { *led = 0xff; } /* ativa o uso de interrupções. */ void enable_interrupt(void) { unsigned char *sreg; sreg = (unsigned char*) 0x5F; *sreg |= 0x80; unsigned char *gimsk; gimsk = (unsigned char*) 0x5B; *gimsk = 0xC0; /* ativa interrupções na rampa de descida */ unsigned char *mcucr; mcucr = (unsigned char*) 0x55; *mcucr = 0x02; /* divisor do contador (ck/1024). */ unsigned char *tccr0; tccr0 = (unsigned char*) 0x53; *tccr0 |= 0x05; } unsigned char check_buttons(void){ unsigned char *botoes; botoes = (unsigned char*) 0x30; return *botoes; }