#include <avr/io.h>
#include <avr/interrupt.h>
volatile unsigned char LED_Data = 0x06;
volatile unsigned short timer0Cnt = 0; // 시간 카운트 변수
volatile unsigned char cnt=0; // 0.5초 횟수 체크 변수
volatile unsigned char check=0; // 버튼 push 여부 체크 변수
int greflg = 1; //green flg
int redflg = 0; //red flg
int yelflg = 0; //yellow flg
SIGNAL(SIG_OVERFLOW0); // 인터럽트 발생 시 선언되는 함수 선언
int main(){
DDRE = 0xFF; // LED와 연결
DDRB = 0x00; // 버튼과 연결
TCCR0 = 0x07; // 타이머 설정, 오버플로인터럽트 노말 모드
TCNT0 = 0xFF-72; // 0.01초에 한 번씩 오버플로인터럽트 발생
TIMSK |= 1<< TOIE0; // 타이머 0번 인터럽트 활성
TIFR |= 1 << TOV0; // 타이머 0번 인터럽트 플래그 셋
sei(); // 글로벌 인터럽트 허용
while (1){
PORTE = LED_Data ; // LED_Data 값에 따라 LED 출력
if ( PINB && check == 0) // 버튼 push 체크
check = 1; // 버튼을 누를 경우 1로 설정
}
return 0;
}
SIGNAL(SIG_OVERFLOW0){ // 타이머 오버플로우
cli(); // 글로버 인터럽트 비허용
TCNT0 = 0xFF-72; timer0Cnt ++; // 0.01초마다 1씩 증가
if(timer0Cnt == 50) { // 0.5초마다 if 문 안의 내용 실행
if ( check > 0 ) { // 버튼을 누른 경우
check++;
if ( check == 6 ) {
LED_Data = 0x06; // 초록으로 설정
greflg = 0;
redflg = 1;
//yelflg = 0;
check = 0; // 버튼 push 여부 초기화
cnt=0; // 0.5초 회수 체크 초기화
}
timer0Cnt = 0; // 타이머 초기화
} else if ( check == 0 ) { // 버튼을 누르지 않았을 때
cnt++; // 0.5초 횟수 체크 변수 증가
//초록불, 빨간불에서 10초간 대기, 10초 후 노란불을 켜기위해 플래그 설정
if ( (greflg == 1 || redflg == 1) && cnt == 10 ){
LED_Data = 0x07;
cnt = 0;
LED_Data=0x07;
yelflg = 1;
} else if ( yelflg == 1 ){
if ( cnt == 8 && greflg == 1 ){
LED_Data = 0x06;
cnt = 0;
greflg = 0;
redflg = 1;
yelflg = 0;
}else if( cnt == 8 && redflg == 1 ){
LED_Data = 0x03;
cnt = 0;
greflg = 1;
redflg = 0;
yelflg = 0;
//노란불 점멸
}else if ( cnt%2 == 1 ) {
LED_Data=0x07;
}
else LED_Data=0x05;
}//end if
}
timer0Cnt = 0; // 타이머 초기화
}
sei(); // 글로벌 인터럽트를 허용
}