각 LED 점멸

 

이전 ATmega 0번 포스팅에서 다룬 LED 순차 점멸에서 한 단계 더 나아가 이번에는 스위치를 한 번 누를 때 마다 점멸되는 LED가 다르게 설정해보겠습니다.

#define F_CPU 16000000L				// Board에 대한 CLK정보(16MHz)

#include <avr/io.h>
#include <avr/delay.h>

const int _delay_t = 500;
int k = 0;
int j = 0;
void TogglePinA(int n, int dl)		// n : n번째 비트, dl : delay in mili-second
{
	char b = 1 << n;				//n의 값에 따라 n번째 비트에 1을 넣는다.	
	PORTA |= b;						//PortA의 0번째 비트를 HIGH로 출력
	_delay_ms(500);
	PORTA &= ~b;					//PortA의 0번째 비트를 LOW로 출력
	_delay_ms(500);
}

int main(void) // 여기로 시작되어 들어감
{
    /* Replace with your application code */
				  
	DDRA |= (1<<0 | 1<<1 | 1<<2); // A port의 0, 1 ,2번째 비트를 출력용으로 사용, 나머지는 입력 = 0은 출력, 1은 입력
	DDRB &= ~(1<<0);// B port의 0번째 비트를 입력용으로 사용
    while (1)		// Embedded Program은 무한루프가 기본이다.
    {
		
		if(!(PINB & 0x01 == 1))			// 안누르면 1
		{
			k++;						// Loop가 돌아올 때마다 k값 상승
			j = k % 3;					// k의 나머지값 j 지정
			
			while(1)					// switch를 누르고 있을 때 넘어가지 않음
			if(PINB & 0x01 == 1)
			{
			break;
			}
		}
		
		switch (j)						// 나머지 값에 따라 점등되는 LED 설정
		{		
		case 1: TogglePinA(0, _delay_t); break;
		
		case 2: TogglePinA(1, _delay_t); break;
		
		default: TogglePinA(2, _delay_t); break;
		}
    }
}

 

위 코드에서 if문 내의 while(1)문을 지우면 Switch를 누르고 있을 때 LED가 순차적으로 불이 들어오게 됩니다.