HBE-MCU-All in One 키트에는 'Push Button'과 'LED' 에 대한 포트가 있습니다.

이번 포스팅에서는 Push Button 을 누를 때마다 LED가 다양하게 제어되는 형태의 프로그램에 대한 코드를

설명하려고 합니다. 각각 Push Button 에 대해서 LED는 다음과 같은 반응을 보일 수 있습니다.


그리고 소스 코드는 다음과 같습니다.


#include <avr/io.h> void my_delay(unsigned long x) { while(x--); } int main(void) { int i; unsigned char state, tmp; /* Push Button - 포트 D */ DDRD = 0x00; // 입력 /* LED - 포트 B */ DDRB = 0xFF; // 출력 while(1) { state = PIND; switch(state) { case 0x01: // 0번 버튼 PORTB = 0xFF; // 모든 LED가 켜진다. break; case 0x02: // 1번 버튼 PORTB = 0xAA; // 짝수번째 LED가 켜진다. break; case 0x04: // 2번 버튼 PORTB = 0x55; // 홀수번째 LED가 켜진다. break; case 0x08: // 3번 버튼 // 다른 스위치가 눌릴때까지 모든 LED를 깜빡인다. while(1) { PORTB = 0x00; // 모든 LED 꺼진다. my_delay(50000); if(PIND != 0x08 && PIND != 0x00) // 다른 스위치가 눌리는지 확인. break; PORTB = 0xFF; // 모든 LED 켜진다. my_delay(50000); if(PIND != 0x08 && PIND != 0x000) break; } break; case 0x10: // 4번 버튼 // 다른 스위치가 눌릴때까지 LED 1개 켜서 좌로 이동 while(1) { tmp = 128; for(i=0; i<8; i++) { PORTB = tmp; tmp = tmp >> 1; my_delay(50000); if(PIND != 0x10 && PIND != 0x00)// 다른 스위치가 눌리는지 확인. goto Finish1; } PORTB = 0x00; } Finish1: break; case 0x20: // 5번 버튼 // 다른 스위치가 눌릴때까지 LED 1개 켜서 좌로 이동 while(1) { tmp = 1; for(i=0; i<8; i++) { PORTB = tmp; tmp = tmp << 1; my_delay(50000); if(PIND != 0x20 && PIND != 0x00)// 다른 스위치가 눌리는지 확인. goto Finish2; } PORTB = 0x00; } Finish2: break; case 0x40: // 6번 버튼 PORTB = 0xF0; // 상위 4비트(LED4~LED7)만 켠다. break; case 0x80: // 7번 버튼 PORTB = 0x0F; // 하위 4비트(LED0~LED3)만 켠다. break; default: // 아무런 버튼도 누르지 않은 경우. PORTB = 0x00; // 모든 LED가 꺼진다. } } }


다음은 각각 결과에 대한 사진입니다.



▲ 0번 버튼을 누른 경우, LED가 전부 켜진다.


▲ 1번 버튼을 누른 경우, LED가 짝수 번째만 켜진다.


▲ 2번 버튼을 누른 경우, LED가 홀수 번째만 켜진다.


▲ 3번 버튼을 누른 경우, LED가 깜빡인다.


▲ 4번 버튼을 누른 경우, LED가 1개씩만 좌로 이동한다.


▲ 5번 버튼을 누른 경우, LED가 1개씩만 우로 이동한다.


▲ 6번 버튼을 누른 경우, LED가 상위 4비트(LED4~LED7)만 켜진다.


▲ 7번 버튼을 누른 경우, LED가 하위 4비트(LED0~LED3)만 켜진다.


#include <avr/io.h>

void my_delay(unsigned long x)		// 시간 딜레이 함수.
{
	while(--x);
}

// 포트 B 8개는 LED0~7까지,
// 포트 D 8개는 LED8~15까지 연결한 상태입니다.
int main(void){

	int i;
	unsigned char tmp;
	
	DDRB = 0xFF;
	DDRD = 0xFF;

	while(1){

		tmp=1;
		/* [포트 B] LED 윗 줄(LED0~LED7)에 대한 반복문 */
		for(i=0;i<8;i++)
		{	
			PORTB = tmp;
			tmp = tmp << 1;
			my_delay(500000);
		}
		PORTB = 0x00;		// LED7 끄기 위함.

		/* [포트 D] LED 아랫 줄(LED8~LED15)에 대한 반복문 */
		tmp=1;
		for(i=0;i<8;i++)
		{	
			PORTD = tmp;
			tmp = tmp << 1;
			my_delay(500000);
		}
		PORTD = 0x00;		// LED15 끄기 위함.
	}
	return 0;
}


위 소스 코드는 HBE-MCU-AllinOne 보드에 있는 LED 16개 (LED0~LED15) 를 순차적으로 켤 수 있도록 만든 코드입니다. 크게 어려운 부분이 없으므로 설명은 생략하겠습니다.



▲ LED 포트가 하나씩 불이 들어오는 모습


각 LED 포트 하나씩 불들어오는 거 다 찍었으면 더 예뻤을 텐데 시간이 없었네요 ㅎㅎㅎ;;;


p.s 궁금한 점 있으면 댓글이나 이메일 보내주시면 감사하겠습니다 ^^ :)

+ Recent posts