본문 바로가기
AVR

[AVR] LED 실습 5. LED 순차 점등 제어(if 문 이용)

by hseoy 2020. 6. 8.
반응형

[LED 실습 5. LED 순차 점등 제어(if 문 이용) ]

이 글에서는 AVR(Atmega128A)에서 LED제어하는 것을 실습한 내용을 다루려고 한다. 이 글은 지식을 나누고자 하는 목적이 아닌 개인 기록의 목적으로 작성했다는 점을 기억하기를 바란다.

# 실습 5. LED 순차 점등 제어(if 문 이용)

이 문제에서 알아야 할 것은 LED실습2와 같으므로 생략하겠다. 

회로의 경우, 실습1 과 동일하다.

LED 상태를 기록하는 버퍼 역할의 변수를 선언하고, while(1){}안에서 이 버퍼를 PORTn에 대입한다. 그리고 이 버퍼를 시프트 시킨 값에 1을 더한 후 버퍼에 대입한다. 이때 만약 버퍼값이 0xFF라면 이 작업 대신 버퍼를 초기값인 0x00로 초기화시킨다.

버퍼를 시프트시키고 1을 더하는 이유는 시프트 시켰을 때 새롭게 채워지는 값이 0이기 때문이다. 예를 들어서 "0000 0001"을 왼쪽으로 시프트시키면 "0000 0010"이 된다. "0000 0011"이 아니라. 그런데 지금 상황에서 우리가 원하는 것은 "0000 0011"이라는 값이기 때문에 1을 더해주는 것이다. "0000 0011"이라는 값을 원하는 이유는 LED가 켜지고 꺼진 다음 다음 LED가 켜지는 것이 아니라 순차적으로 8개의 LED가 모두 켜져야 하기 때문이다. 그리고 모두 켜졌을 때 LED를 다시 처음으로 돌아가야 하기 때문에 버퍼 값을 0x00로 초기화해주는 것이다.

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>

int main()
{
    unsigned char buff;
    DDRC = 0xFF;
    PORTC = 0xFF;
    buff = 0x00;
    
    while(1)
    {
        PORTC = buff;
        _delay_ms(500);
        
        if(buff == 0xFF)
        {
            buff = 0x00;
        }
        else
        {
            buff = (buff << 1) + 1;
        }
    }
    return 0;
}

아래는 위 코드를 AVR에 업로드하여 실행시킨 영상이다. PC0에 연결된 LED(최좌측 LED)부터 PC7에 연결된 LED(최우측 LED)까지 순차적으로 켜진 후에 모두 꺼지는 것이 반복되는 것을 볼 수 있다.

 

반응형

댓글