본문 바로가기

AVR 기초/인터럽트

[AVR 기초] 스탑워치2

*키트는 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씩 증가
		}
	}
}