BASIC4MCU | 질문게시판 | ATMEGA128a 스위치로 LED 제어 질문입니다.
페이지 정보
작성자 야랙핑크 작성일2022-11-26 16:35 조회4,924회 댓글6건첨부파일
본문
ATMEGA128a 스위치로 LED 제어 질문입니다.
1번 스위치를 눌렀을 때 자동으로 신호등이 순환됨.
3번 스위치를 눌렀을 때 불이 켜진상태에서 정지후 수동모드 변경
2번 스위치를 눌렀을 때 하나씩 수동으로 이동함
수동인 상태에서 3번스위치를 눌렀을 때 다시 자동모드로 변경
아래 유튜브 동영상 처럼 작동하길 원합니다.
현재 제가 사용한 코드는
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#define LED_PORT PORTF
#define LED_DDR DDRF
#define BUTTON_PIN PINA
#define BUTTON_DDR DDRA
#define BUTTON_PORT PORTA
int i;
int main(void)
{
LED_DDR=0xff;
BUTTON_DDR=0x00; //
BUTTON_PORT = 0xff; //
unsigned char key;
int LedData[]={0x09,0x11,0x24,0x22};
while (1)
{
key=PINA;
switch(key){
case 0b11111110: //1번 스위치 눌렀을 때 자동
for(i=0;i<4;i++){
if(i==0){
PORTF=LedData[i];
_delay_ms(3000);
}
else if(i==1){
PORTF=LedData[i];
_delay_ms(1000);
}
else if(i==2){
PORTF=LedData[i];
_delay_ms(3000);
}
else if(i==3){
PORTF=LedData[i];
_delay_ms(1000);
i=0;
}
}
case 0b11111101: //2번 스위치 눌렀을 때 수동 (배열 하나씩 이동)
for(i=0;i<4;i++){
PORTF=0x09;
i=0; }
break;
case 0b11111100: //3번 스위치 눌렀을 때 정지 (자동상태에서)
break;
default:
break;
}
}
}
이렇게 입니다.저걸 제 회로에 읽히면 첨부한 동영상 처럼 나옵니다.도와주시길 부탁드립니다...감사합니다.
댓글 6
조회수 4,924야랙핑크님의 댓글
야랙핑크 작성일꼭 switch~case 문 사용이 아니여도 괜찮습니다!
master님의 댓글
master 작성일
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
//
#define LED_PORT PORTF
#define LED_DDR DDRF
#define BUTTON_PIN PINA
#define BUTTON_DDR DDRA
#define BUTTON_PORT PORTA
//
int main(void){
unsigned char i=0,mode=0,flag=0,LedData[]={0x09,0x11,0x24,0x22};
DDRF=0xff; // LED
PORTA=0xff; // BUTTON
while(1){
PORTF=LedData[i];
//-------------------------------------
if((PINA&1)==0){ mode=1; } // PA0 스위치1 자동모드
if((PINA&4)==0){ mode=0; } // PA2 스위치3 수동모드
//-------------------------------------
if((PINA&4)==0){ // PA1 스위치2
if(flag==0){ flag=1;
if(mode==0){ if(++i>3)i=0; } // 수동모드라면 i 증가
_delay_ms(100);
}
}
else{
if(flag==1){ flag=0; _delay_ms(100); }
}
//-------------------------------------
if(mode==1){ if(++i>3)i=0; _delay_ms(1000); } // 자동모드라면 i 증가
}
}
수동모드에서 3번을 다시 눌러서 자동모드로 바꿀 필요 없이
1번을 누르면 자동모드가 됩니다.
야랙핑크님의 댓글
야랙핑크 작성일
선생님 정말 감사합니다. 혹시 자동모드일때 delay 조절을 어떻게 하는지 여쭤봐도 될까요?
i=0일땐 delay가 3초 i=1일땐 delay가 1초 이런식으로 하고 싶은데 작동이 잘 안되네요ㅠㅠ
master님의 댓글
master 작성일
//-------------------------------------
if(mode==1){ // 자동모드라면
if(++i>3)i=0; // i 증가
if(i==0)_delay_ms(3000);
if(i==1)_delay_ms(1000);
}
}
}
야랙핑크님의 댓글
야랙핑크
정말 감사합니다. 제가 초보인데도 한눈에 보이게 코딩해주셔서 이해가 잘 됩니다. 혹시 문법 한가지만 더 여쭤봐도 될까요ㅠㅠ
if(++i>3)i=0; 이문법이 무엇을 뜻하는지 정확히 모르겠습니다. i++은 아는데 ++i는 처음보네요. 검색을 해 봤는데 i++과 비슷한뜻인것 같은데...>3이게 있어서 무슨뜻인지 잘 모르겠네요.
master님의 댓글
master 작성일
if(++i>3)i=0;
이 문장은 아래 문장과 동일한 문법입니다.
++i;
if(i>3)i=0;
//
if(++i>3)i=0; i를 먼저 증가시킨 후 3보다 큰지 체크