앞에서 배운 레지스터는 다음과 같습니다.
DDRx : 입출력 방향을 결정하는 레지스터
PORTx : 출력 신호를 결정하는 레지스터
PINx : 입력된 값이 저장되어 있는 레지스터
이를 통해서 간단하게 LED를 On/ Off하는 코드를 알아보겠습니다.
예제 코드 1 LED ON
LED가 PB0번에 연결되어 있다고 가정합시다.
LED를 On하기 위해서는 다음과 같은 과정이 필요합니다.
1. PB0를 출력 모드로 설정한다.(DDRB 이용)
2. PB0를 HIGH상태로 바꾼다.(PORTB 이용)
1번 과정은 다음 코드를 통해 구현할 수 있습니다.
DDRB |= (1 << 0); (= DDRB의 0번째 비트에 1를 저장한다.)
전 시간에 배운 비트 연산자를 활용하여 구현한 것입니다.
또는 직접 숫자를 대입하여 할 수도 있습니다.
DDRB |= 0x01; 또는
DDRB |= 0b00000001;(0b는 이진수라는 것을 명시하는 표기방법)
이렇게 하면 PB0를 출력 모드로 설정한 것입니다.
다음로는 PB0를 HIGH상태 즉, 1로 만들어야합니다.
PORTB |= (1 << 0); (= PORTB의 0번째 비트에 1를 저장한다.)
또는
PORTB |= 0x01;
또는
PORTB |= 0b00000001;
이렇게하면 PB0를 HIGH상태로 만든 것입니다.
void setup() {
DDRB |= (1 << 0); //PB0를 출력 모드로 설정
PORTB |= (1 << 0); //PB0를 HIGH 상태로 변경
}
void loop() {
}
예제 코드 2 LED OFF
LED를 끄는 동작은 출력은 0v로 한다는 뜻과 동일합니다.
따라서 PB0를 출력 모드로 설정합니다.
DDRB |= (1 << 0); //DDRB의 0번째 비트를 1(출력 모드)로 만든다.
그런 다음 PB0를 LOW 상태 즉, 0로 만들어 줍니다.
PORTB &= ~(1 << 0); //PORTB의 0번째 비트를 0(LOW)으로 만든다.
void setup() {
DDRB |= (1 << 0); //PB0를 출력 모드로 설정
PORTB &= ~(1 << 0); //PB0를 LOW 상태로 변경
}
void loop() {
}
예제 코드 3 LED Blink
On/Off를 배웠으니, On Off On Off를 1초 간격으로 작동하는 코드를 작성해봤습니다.
void setup() {
DDRB |= (1 << 0); //PB0를 출력 모드로 설정
PORTB |= (1 << 0); //PB0를 HIGH 상태로 변경
delay(1000);
PORTB &= ~(1 << 0); //PB를 LOW 상태로 변경
delay(1000);
PORTB |= (1 << 0); //PB0를 HIGH 상태로 변경
delay(1000);
PORTB &= ~(1 << 0); //PB를 LOW 상태로 변경
delay(1000);
}
void loop() {
}
여기서 LED는 On을 하든, Off를 하든 항상 출력 모드여야하기 때문에
두 번째 줄에만 DDRB |= (1 << 0); 코드로 PB0를 출력 모드로 설정했습니다.
'atmega328(아두이노 미니 이용)' 카테고리의 다른 글
스터디 상생플러스 4 - 1 (ADC 이론) (0) | 2020.04.22 |
---|---|
스터디 상생플러스 3 - 1 (PWM 이론) (0) | 2020.04.20 |
스터디 상생플러스 2 - 2 (Atmega328 I/O제어 이론) (0) | 2020.04.13 |
스터디 상생플러스 2 - 1 (Atmega328 I/O 방향 설정 이론) (0) | 2020.04.13 |
스터디 상생 플러스 1 - 2 (필요한 C언어 문법) (0) | 2020.04.09 |