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)만 켜진다.