펌웨어/CodeVision
[CodeVisionAVR] 간단한 LED 제어하기
KaiTae
2019. 5. 8. 11:42
안녕하세요, LED제어로 찾아왔습니다~!
코드비젼의 코딩의 시작은 LED제어라 해도 과언이 아닙니다. 전체 점멸부터 선택 점멸 순차 점멸 까지 다 준비해 봤습니다.
1. 전체 점멸
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <io.h> #include <delay.h> void main(void) { DDRA = 0xff; while (1) { PORTA = 0xff; delay_ms(1000); PORTA = 0x00; delay_ms(1000); } } | cs2 |
위에서 부터 설명하겠습니다. <io.h>은 코드비젼의 기본적인 헤더파일 이고 <delay.h>은 시간관련 헤더입니다..
DDRA(0x는 16진수 표기법) 는 입 출력 레지스터라고 하는 레지스터 입니다. 이것을 설정하므로써 PA0 ~ PA7 까지 출력으로 설정할 수 있습니다.
그다음 while(1)은 무한 반복문이어서 계속 실행합니다.
다음줄 PORTA=0xff(포트 A) 를 전부 1로 세팅해서 LED 전부 off시킵니다. 저의 ATmega128은 ActiveLow 이기
때문에 포트에 0을 주었을때 on이 됩니다. (Active Low관한 글)
그다음 delay_ms() 함수를 이용해 1초시간 동안 시간지연해줍니다.
PORTA=0x00 을 해주면서 LED를 모두 on시키고 다시 시간지연을 줘서 1초마다 전체점멸되는 코드입니다.
2. 선택 점멸
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <io.h> #include <delay.h> void main(void) { DDRA = 0xff; while (1) { PORTA = 0xff; delay_ms(1000); PORTA = 0xfe; delay_ms(1000); } } | cs |
거의 다 위에 설명과 동일하기에 PORTA = 0xfe; 이 부분만 설명드리겠습니다. 저의 보드는 AL(ActiveLow)이기 때문에 첫번째 비트만 0으로 클리어해서 첫번째 LED만 on시킵니다. 혹시 0xfe의 의미를 모르신다면 진수 표기법을 참고해주세요.
3. 순차 점멸 (하나씩 켜진다)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <io.h> #include <delay.h> void main(void) { int led = 0xfe; DDRA = 0xff; while (1) { PORTA = led; delay_ms(1000); led = led << 1; if(led == 0x00){ led = 0xfe; } } } | cs |
이번에는 led 변수를 추가해서 하나씩 켜지는 코드를 구현했습니다. led의 값이 0xfe, 0xfc ... 0x00 까지 변경되면서 하나씩켜지다가 모두 켜지면 다시 led변수를 초기값으로 초기화합니다. <<의 의미를 모르신다면 연산자와 자료형을 참고해주세요.
4. 쉬프트 점멸 (하나만 켜지면서 이동함)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <io.h> #include <delay.h> void main(void) { int led = 0xfe; DDRA = 0xff; while (1) { PORTA = led; delay_ms(1000); led = (led << 1) | 0x01; if(led == 0x7f){ led = 0xfe; } } } | cs |
이번에는 OR 비트연산자를 이용하여 하나씩만 led를 순차적으로 점멸 합니다. led의 값이 0xfe, 0xfd ... 0xbf, 0x7f 로 변경되면서 하나씩만 순차적으로 키게 됩니다.
여기까지 구요 궁금한점은 댓글로~