#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
typedef enum
{
intermediate,
yellowstate,
intermediate1,
yellowstate1
}trafficstate;
volatile trafficstate currentstate = intermediate;
void init(void)
{
DDRD |= (1 << PD0) | (1 << PB1) | (1 << PD2);
DDRC |= 0b00000111;
TCCR1A |= (1 << COM1A1);
TCCR1B |= (1 << WGM12) | (1 << CS12) | (1 << CS10);
OCR1A = 15624;
TIMSK1 |= (1 << OCIE1A);
sei();
}
void updatelights(void)
{
switch(currentstate)
{
case intermediate:
PORTD = (1 << PD0);
PORTC = (1 << PC2);
break;
case yellowstate:
PORTD = (1 << PD1);
break;
case intermediate1:
PORTD = (1 << PD2);
PORTC = (1 << PC0);
break;
case yellowstate1:
PORTC = (1 << PC1);
break;
}
}
ISR(TIMER1_COMPA_vect)
{
static uint8_t timeinstate = 0;
timeinstate++;
switch(currentstate)
{
case intermediate:
if(timeinstate >= 7)
{
currentstate = yellowstate;
timeinstate = 0;
}
break;
case yellowstate:
if(timeinstate >= 5)
{
currentstate = intermediate1;
timeinstate = 0;
}
break;
case intermediate1:
if(timeinstate >= 7)
{
currentstate = yellowstate1;
timeinstate = 0;
}
break;
case yellowstate1:
if(timeinstate >= 5)
{
currentstate = intermediate;
timeinstate = 0;
}
break;
}
updatelights();
}
int main(void)
{
init();
updatelights();
while(1)
{
}
return 0;
}