Part 3/¶ Programming
[마프]신호등 만들기
CrlAYh
2011. 11. 10. 18:21
#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(); // 글로벌 인터럽트를 허용 }