[ATmega128] LED 예제1

해당 예제는 WinAVR 컴파일러 기준 코드입니다.

회로도


소스코드

#define F_CPU 16000000
#include<avr/io.h>
#include<util/delay.h>
unsigned char led_on;
void PB_LEDOnOff(void) // LED ON/OFF 함수
{
    if (led_on) {            //led가 켜진 상태이면
        PORTB=0b00000001;    // LED 끔
        led_on = 0;
    }
    else {                //LED가 꺼진 상태이면
        PORTB=0b00000000;    // LED 켬
        led_on = 1;
    }
}
int main(void){
    unsigned char key;
    DDRB = 0b00000001; // 입출력 방향 설정
    DDRD = 0b00000000; // 입출력 방향 설정
    PORTD = 0b00000001; // 풀업저항 설정
    PORTB = 0b00000000;    //PORTB에 초기값 0x00으로 설정
    led_on = 1;
    while(1)
    {
        key = (PIND & 0b00000001); // 버튼 스위치 값을 읽기
        switch(key) // key와 값이 일치하면 해당 case 실행문을 실행
        {
        case 0b00000000: // 스위치가 눌렸음을 확인
            PB_LEDOnOff();
            _delay_ms(500); // 0.5초 시간 지연 발생
            break;
        default: // 변수와 값이 불일치하면 아무것도 하지 않음
            break;
        }
    }
}

코드 설명

DDRB = 0b00000001로 설정하여 PB0을 출력으로 사용한다. DDRD = 0b00000000이므로 PD0를 입력으로 사용한다. PORTD = 0b00000001로 하여 PD0과 연결된 풀업 저항을 활성화 시킨다. 풀업저항이 활성화 되면 입력값은 HIGH 상태를 유지시키고 Floating 현상을 방지해준다.

LED의 핀 반대방향으로 VCC와 연결되어 있기 때문에 출력이 LOW가 되어야 LED에 전압 강하가 생기기 때문에 불이 켜진다.

while문에서 보면 key = (PIND & 0b00000001) 구문을 통해서 버튼 스위치의 입력값을 확인한다. 버튼이 눌리면 PD0가 GND와 연결되면서 0의 값을 가지게 되므로 0b00000000 case에서 LED의 ON/OFF 상태를 변환시켜준다.


주의할 점

LED 예제를 풀 때 주의할 점으로는 우선 스위치와 LED의 반대방향이 Vcc인지 GND인지 확인하는 것이다. 또한 LED의 방향도 중요하다. 삼각형 방향이 항상 전압이 높은 곳에서 낮은 곳으로 흐르도록 해주어야 한다.

'임베디드 > ATmega128' 카테고리의 다른 글

[ATmega128] GPIO 활용 - 7 세그먼트  (0) 2021.10.02
[ATmega128] GPIO 활용 - LED 예제2  (0) 2021.10.02

+ Recent posts