[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 |