BASIC4MCU | 질문게시판 | 아두이노 push버튼을 이용해서 while문속 for문 벗어나기
페이지 정보
작성자 갤럭시 작성일2020-11-03 00:35 조회3,931회 댓글2건본문
loop()속 코드입니다
flag변수를 만들어서 for문과 while문을 벗어났습니다
그러나 if(chkSw(0))문 속이 재생될 때 chkSw(1)를 누르면 반복문 속을 벗어난 건 해결했으나 chkSw(1)을 2번 눌러야(1번 누르면 반복문을 벗어나고 다시 1번더 누르면) if(chkSw(1))이 재생됩니다 1번만 눌러서 작동하게 하고싶습니다
loop(){
:
:
:
if(chkSw(0)){ //chkSw()는 sw바운싱 함수입니다
flag=0;
while(1){
for(int i =0;i<3;i++){
digitalWrite(LEDs[i],HIGH);
delay(500);
digitalWrite(LEDs[i],LOW);
if(chkSw(1)){flag=1; break;}
}
if(flag) break; //sw1이 눌리면 벗어남 //이부분을 goto로 바꿔야 할까요?
}
}
else if(chkSw(1)){
flag=0;
while(1){
for(int i =2;i>=0;i--){
digitalWrite(LEDs[i],HIGH);
delay(500);
digitalWrite(LEDs[i],LOW);
if(chkSw(0)) { flag =1; break;}
}
if(flag)break; //sw0가 눌리면 벗어남
}
}
}
댓글 2
조회수 3,931master님의 댓글
master 작성일바운싱 함수 때문에 발생하는 문제 아닐까요?
master님의 댓글
master 작성일
bool flag2=0,flag3=0; // 2,3번 핀에 스위치가 연결되어 있다고 가정하고 각각의 플래그 변수를 선언
int mode=0,num=0;
//
loop(){
if(digitalRead(2)){
if(flag2==0){ flag2=1;
if(mode==2)mode=0;
else mode=2;
delay(100); // 디바운싱용 딜레이
}
}
else{
if(flag2){ flag2=0;
delay(100); // 디바운싱용 딜레이
}
}
//--------------------------------------------------------
if(digitalRead(3)){
if(flag3==0){ flag3=1;
if(mode==3)mode=0;
else mode=3;
delay(100); // 디바운싱용 딜레이
}
}
else{
if(flag3){ flag3=0;
delay(100); // 디바운싱용 딜레이
}
}
//--------------------------------------------------------
if(mode==0){ for(int i=0;i<3;i++)digitalWrite(LEDs[i],0); num=0; } // off
//--------------------------------------------------------
if(mode==2){
for(int i=0;i<3;i++)digitalWrite(LEDs[i],0); // 모두 off 후
digitalWrite(LEDs[num],1); // 해당 LED만 ON
if(++num>2)num=0; // num 증가
}
//--------------------------------------------------------
if(mode==3){
for(int i=2;i>=0;i--)digitalWrite(LEDs[i],0); // 모두 off 후
digitalWrite(LEDs[num],1); // 해당 LED만 ON
if(--num<0)num=2; // num 감소
}
//--------------------------------------------------------
delay(500);
}