본문 바로가기

AVR 기초/LED 제어하기

LED 켜고 끄기

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

 

 

  • LED를 켜기 위해서는 1을 인가해야 합니다.(끄기 위해서는 0)
  • 즉, LED에 해당하는 포트에 해당 비트에 1을 출력하여야 합니다.
  • 포트에 1을 출력하려면
  • DDRA의 해당 비트에 1을 입력하여 출력 상태로 만들고
  • PORTA의 해당 비트에 1을 입력하면 됩니다.

코드는 다음과 같습니다.

 

#include <avr/io.h>			//atmega 사용 헤더파일 선언
#define F_CPU 16000000		//클럭주기 설정
#include <util/delay.h>		//util ->delay 헤더파일 사용 선언

void delay(int sec){		//delay 함수 사용 안할 시 delay 라는 이름의 함수 사용
	volatile int j,k,l;			//이 함수는 임의적으로 delay를 만들어줌(처리하는 시간을 이용)
	for(j = 0; j< sec ; j++){	//변수 sec는 _delay_ms 사용시 입력받는 값 대신 넣어주는 값 ( 1 이면 _delay_ms(1000)
		for(k = 0; k< 1000 ; k++){
			for (l = 0; l<500;l++){
			}			
		}
	}
}

int main(void)				//메인함수
{
	DDRA = 0xff;			//포트 A를 입출/력으로 사용하기 위해 선언.0xff는 0x<<HEX값을 사용한다는 의미. ff<= 15/15으로 다 사용한다는 의미.
							//만약, 입력으로만 사용하고자 한다면 DDRx를 1로 출력으로 사용할 때는 1로 설정.
	while (1)				//반복문 while 사용. 1의 의미는 항상 참이라는 뜻으로 무한반복.
	{
		PORTA = 0x0F;		//A를 출력<=0f 이기 때문에 오른쪽 4개만 LED ON
		_delay_ms(1000);	//딜레이를 1000만큼 줌.(_delay_ms(1000)==1초
		//delay(1);			//_dealy_ms를 사용하지 않을 시 사용
		PORTA = 0xF0;		//A를 출력<=f0 이기 때문에 왼쪽 4개 LED ON
		_delay_ms(1000);	//delay1000만큼 줌
		//delay(1);			//_dealy_ms를 사용하지 않을 시 사용
	}
	return 0;				//메인함수가 끝날때, 0을 반환
}


//********************************************************//
//	  LED HEX 계산    >>>    16진수는 0~15까지 표현가능   //
//														  //
//      LED        [][][][]  [][][][]                    //
//                 8 4 2 1 / 8 4 2 1    >>더하면 15/15   //
//      15 == f 이므로 0xff                              //
//********************************************************//

 

클럭 주기를 설정해 주는 이유는 _dealy_ms 를 사용하려면 CPU의 클럭을 설정해 줘야 동작하기 때문입니다.

만약 F_CPU를 1MHz로 설정한다면 더 빠른속도로 동작하게 됩니다.