본문 바로가기

AVR 기초/인터럽트

[AVR 기초] 스위치를 이용한 FND 4자리 1씩 증가하기

*키트는 Atmega128A를 사용하였습니다*

 

 

스위치를 이용해 FND 4자리 스위치 1씩 증가하기 입니다.

 

예시를 보겠습니다.

코드는 다음과 같습니다.

 

#include <avr/io.h>
#include <avr/interrupt.h>						//인터럽트 헤더파일 선언
#define F_CPU 16000000UL
#include <util/delay.h>


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;			//변수 count =0. 인터럽트와 메인에서 함께 사용하는 변수는 volatile을 선언하는것이 안전

ISR(INT4_vect){					//Interrupt Service Routine ----INT4 사용
	count++;					//이 인터럽트가 발생할때 count 1증가
	_delay_ms(15);				//0.015초 딜레이
}
ISR(INT5_vect){					//Interrupt Service Routine ----INT5 사용
	count=0;					//이 인터럽트가 발생하였을 때 count는 0
	_delay_ms(15);
}

void display_fnd(int count){            //fnd를 나타내는 함수
	int i, x[4];						//display_fnd 함수 안에서만 사용하는 변수 i,배열 x 4개
	x[3] = (count/1000)%10;				//천의자리  -->>  count를 1000으로 나눈 후, 10으로 나눈 값의 나머지를 저장
	x[2] = (count/100)%10;				//백의자리
	x[1] = (count/10)%10;				//십의자리
	x[0] = (count)%10;					//1의자리
//위의 식을 계산하면 몇번 눌렀는지 계산이 됨 >> 그 값을 밑의 for문을 통하여 display
	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;						//INT4번,5번에 대한 세팅을 함. \\Falling Edge 가 발생하면 인터럽트가 발생하도록 설정
	EIMSK = 0x30;						//인터럽트 4,5 사용
	sei();								//인터럽트 enable
	
	while (1)
	{
		display_fnd(count);
	}
}

 

IRR은 Interrupt Service Routine입니다.

INT4_vect와 INT5_vect는 스위치 4번과 5번을 말합니다.

'AVR 기초 > 인터럽트' 카테고리의 다른 글

[AVR 기초] 스탑워치2  (0) 2020.07.12
[AVR 기초] 스탑워치 1  (0) 2020.07.12
[AVR 기초] 인터럽트(Interrupt)란  (0) 2020.07.12