본문 바로가기

AVR

버튼 입력 받아 LED 켜고 끄기


오늘은 버튼이 입력되는 때 LED의 움직임이 달라 지는 것을 연습 했다.

어떻게 보면 쉬운 것이지만

생각보다 코드가 조금 길었지만 그래도 쉬운 것들 밖에 없어서 이해하기는 쉬웠다.

이 버튼 입력 받는 방법에 대해서 설명을 하면

먼저 버튼 입력에 따른 LED의 움직임이 차이가 있어야 되기 때문에

버튼에 따른 LED 출력을 다르게 하였다.

그리고 포트의 입력은 PINX 도 처음으로 사용해 보았다.

PINF는 포트 F의 입력을 받는 레지스터로

여기에서는 버튼의 입력을 받는 걸로 하였다. 여기에서도

1이면 입력을 받고 0이면 입력을 받지 않는 다는 것이다.

코드는

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

typedef unsigned char byte;

byte i, led;
void delay_2s()
{
 byte k;
 for(k = 0; k < 200; k++)
 {
  _delay_ms(10);
 }
}

void a()
{
 led = 0xff;
 for(i = 0; i < 8; i++)
 {
  PORTD = led;
  led = (led >> 1);
  delay_2s();
 }
}

void b()
{
 led = 0x00;
 for(i = 0; i < 8; i++)
 {
  PORTD = led;
  led = (led >> 1) | 0x80;
  delay_2s();
 }
}

void c()
{
 led = 0x00;
 for(i = 0; i < 8; i++)
 {
  PORTD = led;
  led = (led << 1) | 0x01;
  delay_2s();
 }
}

void d()
{
 led = 0xff;
 for(i = 0; i < 8; i++)
 {
  PORTD = led;
  led = (led << 1);
  delay_2s();
 }
}


int main(void)
{
 byte sw;
 DDRD = 0XFF;
 DDRF = 0X00;
 PORTF = 0X0F;

 do{
  sw = PINF & 0X0F;
  switch(sw)
  {
   case 0x0e:
    a();
    break;

   case 0x0d:
    b();
    break;

   case 0x0b:
    c();
    break;

   case 0x07:
    d();
    break;

   default:
    PORTD = 0X00;
    delay_2s();
    PORTD = 0xff;
    delay_2s();

  }
 }while(1);
}

==============================================================================

이런식으로 하여 버튼 입력에 대한 변화를 알아 보았다.

다음에는 외부인터럽트나 LCD 입력에 대해서 한번 알아 볼까 생각 중이다.