1. #include <avr/io.h>  
  2. #include <avr/interrupt.h>  
  3.   
  4.   
  5. volatile unsigned char LED_Data = 0x06;   
  6. volatile unsigned short timer0Cnt = 0;  // 시간 카운트 변수  
  7. volatile unsigned char cnt=0;           // 0.5초 횟수 체크 변수  
  8. volatile unsigned char check=0;         // 버튼 push 여부 체크 변수  
  9. int greflg = 1;                 //green flg  
  10. int redflg = 0;                 //red flg  
  11. int yelflg = 0;                 //yellow flg  
  12.   
  13.   
  14. SIGNAL(SIG_OVERFLOW0);          // 인터럽트 발생 시 선언되는 함수 선언  
  15.   
  16. int main(){  
  17.   
  18.     DDRE = 0xFF;        // LED와 연결  
  19.     DDRB = 0x00;        // 버튼과 연결  
  20.   
  21.     TCCR0 = 0x07;       // 타이머 설정, 오버플로인터럽트 노말 모드  
  22.     TCNT0 = 0xFF-72;    // 0.01초에 한 번씩 오버플로인터럽트 발생    
  23.     TIMSK |= 1<< TOIE0;   // 타이머 0번 인터럽트 활성  
  24.     TIFR |= 1 << TOV0;    // 타이머 0번 인터럽트 플래그 셋  
  25.   
  26.     sei();              // 글로벌 인터럽트 허용  
  27.   
  28.     while (1){  
  29.         PORTE = LED_Data    ;       // LED_Data 값에 따라 LED 출력  
  30.         if ( PINB && check == 0)    // 버튼 push 체크  
  31.             check = 1;              // 버튼을 누를 경우 1로 설정  
  32.     }  
  33.     return 0;  
  34.   
  35. }  
  36.   
  37. SIGNAL(SIG_OVERFLOW0){                  // 타이머 오버플로우  
  38.   
  39.     cli();                              // 글로버 인터럽트 비허용  
  40.     TCNT0 = 0xFF-72; timer0Cnt ++;      // 0.01초마다 1씩 증가  
  41.   
  42.     if(timer0Cnt == 50) {               // 0.5초마다 if 문 안의 내용 실행  
  43.         if ( check > 0 ) {           // 버튼을 누른 경우  
  44.             check++;  
  45.             if ( check == 6 ) {  
  46.                 LED_Data = 0x06;    // 초록으로 설정  
  47.                 greflg = 0;  
  48.                 redflg = 1;  
  49.                 //yelflg = 0;  
  50.                 check = 0;          // 버튼 push 여부 초기화  
  51.                 cnt=0;              // 0.5초 회수 체크 초기화  
  52.             }  
  53.             timer0Cnt = 0;          // 타이머 초기화  
  54.         } else if ( check == 0 ) {  // 버튼을 누르지 않았을 때  
  55.             cnt++;                  // 0.5초 횟수 체크 변수 증가  
  56.             //초록불, 빨간불에서 10초간 대기, 10초 후 노란불을 켜기위해 플래그 설정  
  57.             if ( (greflg == 1 || redflg == 1) && cnt == 10 ){  
  58.                 LED_Data = 0x07;   
  59.                 cnt = 0;  
  60.                 LED_Data=0x07;  
  61.                 yelflg = 1;  
  62.             } else if ( yelflg == 1 ){  
  63.                 if ( cnt == 8 && greflg == 1 ){  
  64.                     LED_Data = 0x06;  
  65.                     cnt = 0;   
  66.                     greflg = 0;  
  67.                     redflg = 1;  
  68.                     yelflg = 0;  
  69.                 }else if(  cnt == 8 && redflg == 1 ){  
  70.                     LED_Data = 0x03;  
  71.                     cnt = 0;   
  72.                     greflg = 1;  
  73.                     redflg = 0;  
  74.                     yelflg = 0;  
  75.             //노란불 점멸  
  76.                 }else if ( cnt%2 == 1 ) {  
  77.                     LED_Data=0x07;  
  78.                 }  
  79.                 else LED_Data=0x05;  
  80.             }//end if  
  81.         }  
  82.         timer0Cnt = 0;  // 타이머 초기화  
  83.     }  
  84.     sei();      // 글로벌 인터럽트를 허용  
  85. }  

'Part 3 > ¶ Programming' 카테고리의 다른 글

[무료]윈도우폰 개발서  (0) 2011.12.19
[iPhone]Table Views, Navigation, and Arrays  (0) 2011.11.15
ZeuS Source Code!!!!  (0) 2011.05.13
Design Principle  (0) 2011.03.24
[VB2010]scanf가  (0) 2010.10.02
AND