#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
void pcint0_init(void);
volatile unsigned char PinChange = 0;
volatile unsigned char PinState = 0x00;
int main(void) {
DDRB = 0xF0;
PORTB = 0x0F;
DDRA = 0xFF;
pcint0_init();
while(1) {
if(PinChange) {
switch (PinState) {
case 0x08:
PORTA |= 0x08;
_delay_ms(1000);
PORTA &= ~0x08;
PinChange = 0;
PinState = 0x00;
break;
case 0x04:
PORTA |= 0x04;
_delay_ms(1000);
PORTA &= ~0x04;
PinChange = 0;
PinState = 0x00;
break;
case 0x02:
PORTA |= 0x02;
_delay_ms(1000);
PORTA &= ~0x02;
PinChange = 0;
PinState = 0x00;
break;
case 0x01:
PORTA |= 0x01;
_delay_ms(1000);
PORTA &= ~0x01;
PinChange = 0;
PinState = 0x00;
break;
default:
PinChange = 0;
PinState = 0x00;
break;
}
}
}
}
void pcint0_init(void) {
cli();
PCICR |= (1 << PCIE0);
PCMSK0 = PCMSK0 | (1 << PCINT0) | (1 << PCINT1) | (1 << PCINT2) | (1 << PCINT3);
PCIFR |= (1 << PCIF0);
sei();
}
ISR(PCINT0_vect) {
PinChange = 1;
PinState = PINB;
PCIFR |= (1 << PCIF0);
}