ATmega128 LED8개를 제어하기
- AVR ATmega128
- 2020. 6. 29.
계발에서 개발까지
LED8개 제어하기
ATmega128에 LED를 8개를 연결하고 제어를 해봅시다. LED가 8개 정도 되면 이제 해볼 수 있는 여러가지 방법들이 있기 때문에 좀 더 탄탄한? 회로구성을 할 수 있습니다.
LED 8개 모두 불 켜기 프로그램
일단 회로가 잘 연결 됐는지 확인을 하기 위하여 LED8개를 모두 점등시켜보겠습니다. 신호를 모두 1로 출력을 했기 때문에 LED8개 모두 점등이 되어야합니다.
#include <avr/io.h>
int main()
{
DDRA = 0xff; //PA7~PA0 신호의 방향을 모두 출력으로 사용
PORTA = 0xff; //PA7~PA0 신호를 모두 '1'로 출력함
}
원하는 LED만 불 켜 보기
위에 회로에서 LED가 점등이 잘 되면 이제 원하는 LED만 점등이 되도록 한번 코드를 짜보겠습니다.
저는 밑에 처럼 하나 점등 되면 다음은 꺼지는 프로그램으로 짜보겠습니다.
ON, OFF, ON, OFF, ON, OFF, ON, OFF
순서대로 ON,OFF를 하기 위해 바이너리 값으로 표현하면, 0b10101010이 되겠네요 이걸 헥사 값으로 표현하면 0xaa가 되므로 밑에 처럼 프로그램을 짜시면 되겠습니다.
#include <avr/io.h>
int main()
{
DDRA = 0xff; //PA7~PA0 신호의 방향을 모두 출력으로 사용
PORTA = 0xaa; //PA7~PA0 신호를 모두 '1'로 출력함
}
1초 delay_sec() 함수
이제 1초를 기다리는 함수를 알아보겠습니다. LED점등과 원하는 LED 점등. 그리고 이 딜레이 함수 만 있으면 원하는 모양이나 LED를 제어 할 수가 있습니다.
#include <avr/io.h>
void delay_sec(int sec)
{
volatile int i, j, k; //volatile 선언자 필요
for(k=0; k<sec; k++) //sec는 원하는 초 단위의 딜레이 값
for(i=0; i<1000; i++) //외부루트 1000번
for(j=0; j<1000; j++) //내부루트 1000번
;
}
움직이는 LED 프로그램
정지된 상태에서의 LED제어와 시간 딜레이 방법을 알아봤으니 이제 1초 딜레이 간격으로 LED8개를 점등해보겠습니다.
#include <avr/io.h>
void delay_sec(int sec)
{
volatile int i, j, k;
for(k=0; k<sec; k++)
for(i=0; i<1000; i++)
for(j=0; j<900; j++)
;
}
int main()
{
DDRA = 0xff;
while(1)
{
PORTA = 0x80; //첫번째 패턴 - 가장 왼쪽 LED만 ON
delay_sec(1); //1초딜레이
PORTA = 0x40;
delay_sec(1); //1초딜레이
PORTA = 0x20;
delay_sec(1); //1초딜레이
PORTA = 0x10;
delay_sec(1); //1초딜레이
PORTA = 0x08;
delay_sec(1); //1초딜레이
PORTA = 0x04;
delay_sec(1); //1초딜레이
PORTA = 0x02;
delay_sec(1); //1초딜레이
PORTA = 0x01;
delay_sec(1); //1초딜레이
}
}
'원하는 패턴 + 원하는 딜레이'의 조합이면 이제 어떤 움직임이나 LED로 원하는 모양을 표현이 가능합니다.
'AVR ATmega128' 카테고리의 다른 글
ATmega128 LED 불켜기 (0) | 2020.06.25 |
---|