*키트는 Atmega128A를 사용하였습니다*
//StopWatch SW1 인터럽트 발생시 시간 o
#include <avr/io.h>
#include <avr/interrupt.h> //인터럽트 헤더파일 선언 >> 인터럽트 사용 가능
#define F_CPU 16000000UL
#include <util/delay.h>
volatile int currenttime, stoptime = 0;
volatile int go = 1; //변수 GO 만듬. GO 의 값 : 1 설정
unsigned char fnd[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67};
unsigned char fnd_pos[4] = {0x01, 0x02, 0x04, 0x08};
volatile int count = 0;
ISR(INT4_vect){
go = 0; //스위치 1번(위쪽)을 눌렀을 때 GO = 0
if (count ==0) //count 가 0 이라면,,
{
count = 1; //count 의 값을 1로 설정
_delay_ms(15);
}
else{ //count의 값이 0이 아니라면
count = 0; //count의 값을 0으로
stoptime = currenttime; //stoptime 변수에 currenttime의 값 저장
_delay_ms(15);
}
}
ISR(INT5_vect){ //스위치 2번(아래 스위치) 눌렀을때 발생하는 서비스 루틴
stoptime = 0; //stoptime = 0 으로
currenttime = 0; //currenttime = 0
count = 0; //count =0
go = 1; //go = 1 .. >> 초기값과 같게 만듬[stoptime, currenttime, count,go]
_delay_ms(15);
} //루틴 끝
void display_fnd(int count){
int i, x[4];
x[3] = (count/1000)%10;
x[2] = (count/100)%10;
x[1] = (count/10)%10;
x[0] = (count)%10;
for (i=0;i<4;i++){
PORTC = fnd[x[i]];
PORTG = fnd_pos[i];
_delay_ms(2);
}
}
int main(void)
{
/* Replace with your application code */
DDRC = 0xff;
DDRG = 0x0f;
DDRE = 0xcf;
EICRB = 0x0a;
EIMSK = 0x30;
sei();
while (1)
{
if (count == 0) //count의 값이 0이라면,,
{
display_fnd(stoptime);
}
else{ //count의 값이 0이 아니라면
display_fnd(currenttime);
}
if(go == 0){ //go의 값이 0 이라면
currenttime++; //currenttime 의 값 1씩 증가
}
}
}
'AVR 기초 > 인터럽트' 카테고리의 다른 글
[AVR 기초] 스탑워치 1 (0) | 2020.07.12 |
---|---|
[AVR 기초] 스위치를 이용한 FND 4자리 1씩 증가하기 (0) | 2020.07.12 |
[AVR 기초] 인터럽트(Interrupt)란 (0) | 2020.07.12 |