1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | /******************************************************************** 파일명 : Interrupt_led.c 동 작 : LED의 불이 100ms마다 좌측으로 쉬프트 되면서 켜진다. 버튼을 누르면 LED가 멈추었다가 한번 더 누르면 다시 동작한다. 포트연결 : 1) 포트D의 0번비트를 Switch에 연결 2) 포트E 8핀을 LED에 연결 소스 설명 : 1) AVR 입출력에 대한 헤더 파일과 인터럽트를 사용하기 위한 헤더와 delay 함수사용을 위한 헤더파일을 선언한다. 2) 인터럽트 0 서비스 루틴을 선언한다. 3) 포트D의 0번비트를 입력, 포트E를 출력으로 선언 4) 인터럽트 0을 상승엣지에서 동작하도록 설정한다. 5) 모든 인터럽트를 허용하는 함수 6) 100ms마다 LED가 좌측으로 쉬프트되면서 켜진다. Time_Stop이 0인경우에만 계속 쉬프트하고 1일경우 쉬프트를멈추게된다. 7) 인터럽트를 멈추고 Time_STOP이 0일때는 1로 1일땐 0으로 값을 변경해준뒤 인터럽트를 다시 허용시킨다. _delay_us()함수는 104 us 까지 , _delay_ms()함수는 35 ms 까지 지원한다. ********************************************************************/ // 1) #include<avr/io.h> #include<avr/interrupt.h> #include<util/delay.h> unsigned char Time_STOP = 0; // 2) SIGNAL(SIG_INTERRUPT0); int main(){ unsigned char LED_Data = 0x01,i; // 3) DDRD = 0xFE; DDRE = 0xFF; // 4) EICRA = 0x0F; EICRB = 0x00; EIMSK = 0x01; EIFR = 0x01; // 5) sei(); while(1){ // 6) PORTE = LED_Data; if(Time_STOP == 0) { if(LED_Data == 0x80) { LED_Data = 0x01; } else { LED_Data <<= 1; } } for(i=0;i<10;i++) _delay_ms(100); } return 0; } // 7) SIGNAL(SIG_INTERRUPT0){ cli(); if(Time_STOP == 0) Time_STOP = 1; else Time_STOP = 0; sei(); } | cs |
'프로그래밍 > ATMega128' 카테고리의 다른 글
(ATmega128) 타이머로 LED 켜기 (0) | 2016.07.10 |
---|---|
(ATMega128) PWM 사용하기 (0) | 2016.07.10 |
(ATMega128) FND값 올리기 (0) | 2016.07.10 |
(ATMega128) Switch 누른데로 LED켜기 (0) | 2016.07.10 |
(ATMega128) LED 켜기 (0) | 2016.07.10 |