본문 바로가기

AVR

LED 켜기

오늘은 처음으로 LED 켜기를 해 봤다.
간단한 듯 하면서도 포트에 대한 개념이 조금 잡히는 듯 하였다.

여기에서는 DDRD와 PORTD 개념이 나왔는데

DDRD는 포트 D의 입출력 방향을 설정하는 레지스터라고 나오면서
여러가지 말이 나왔는데 이 코드를 보고 비트 1로 설정이 되면 출력 0으로 설정이 되면 입력
으로 이해를 하였다.

그리고 PORTD는 포트 D의 데이터 출력 레지스터로 LED를 켜고 끄는 걸 말하는 걸로 이해 하였다.

그리고 3가지의 코드를 작성해 보았는데

첫번째 코드는 8개의 LED를 켜고 끄는 코드를 작성해 보았다.
==============================================================================
#include<avr/io.h>
#include<avr/delay.h>

int main(void)
{
 char i;

 DDRD = 0XFF;

 while(1)
 {
  PORTD = 0XFF;
  for(i = 0; i < 20; i++)
  {
   _delay_ms(10);
  }
  PORTD = 0X00;
  for(i = 0; i < 20; i++)
  {
   _delay_ms(10);
  }
 }
}
==============================================================================

두번째 코드는 12, 34, 56, 78 순서대로 LED가 켜지도록 코드를 작성하였다.
==============================================================================
#include<avr/io.h>
#include<avr/delay.h>

int main(void)
{
 char i;
 DDRD = 0xff;

  do{

  PORTD = 0xc0;

  for(i = 0; i < 200; i++)
  {
   _delay_ms(10);
  }
  PORTD = 0x30;
  for(i = 0; i < 200; i++)
  {
   _delay_ms(10);
  }
  PORTD = 0x0c;
  for(i = 0; i < 200; i++)
  {
   _delay_ms(10);
  }
  PORTD = 0x03;
  for(i = 0; i < 200; i++)
  {
   _delay_ms(10);
  } 
 }while(1);
}
==============================================================================

세번째 코드는 시프트 연산을 이용하여 전체에서 하나씩 LED가 꺼지는 코드를 작성하였다.
==============================================================================
#include<avr/io.h>
#include<avr/delay.h>

int main(void)
{
 char i;
 DDRD = 0XFF;
 PORTD = 0XFF;

 while(1)
 {
  PORTD = PORTD >> 1;

  for(i = 0; i < 100; i++)
  {
   _delay_ms(10);
  }
  if(0x00 == PORTD)
  {
   PORTD = 0XFF;
  }
 }
}

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

이제 대충 LED 자체를 켜고 끄는 코드는 어느정도 이해를 한 것 같다.
다음에는 버튼을 입력 받아 LED를 켜고 끄는 것을 해 봐야겠다.