BASIC4MCU | 질문게시판 | 아두이노 스위치
페이지 정보
작성자 erree 작성일2021-04-05 21:59 조회23,591회 댓글6건본문
스위치를 한번 누르면 1번에서 2번으로 바뀌고, 다시 한번 누르면 2번에서 1번으로 바뀌게 하고싶습니다.
현재 상태는 스위치를 계속 누르고있어야지만 2번으로 바뀌고, 떼면은 1번으로 바뀝니다
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd (0x27,16,2);
void setup() {
lcd.init();
lcd.backlight();
pinMode(2,INPUT_PULLUP);
pinMode(3,INPUT_PULLUP);
for(int i=0; i<5; i++){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Digital Pulse");
lcd.setCursor(0,1);
lcd.print("Number: A001");
delay(500);}
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Mode Button");
lcd.setCursor(0,1);
lcd.print(" Push Mode SW1!");
while(digitalRead(2)==1);
}
}
void loop(){
if(digitalRead(2)==1){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("1.Pulse Mode");
lcd.setCursor(0,1);
lcd.print(" Push Select!");
while(digitalRead(2)==1);
}
if(digitalRead(2)==0){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("2.Sensor Mode");
lcd.setCursor(0,1);
lcd.print(" Push Select!");
while(digitalRead(2)==0);
}
}
댓글 6
조회수 23,591master님의 댓글
master 작성일
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd (0x27,16,2);
//
bool flag=0,mode=0;
//
void setup() {
pinMode(2,INPUT_PULLUP);
pinMode(3,INPUT_PULLUP);
lcd.init(); lcd.backlight();
//
for(int i=0; i<5; i++){
lcd.clear(); lcd.setCursor(0,0); lcd.print("Digital Pulse");
lcd.setCursor(0,1); lcd.print("Number: A001");
delay(500);
}
//
lcd.clear(); lcd.setCursor(0,0); lcd.print(" Mode Button");
lcd.setCursor(0,1); lcd.print(" Push Mode SW1!");
while(digitalRead(2)==1);
}
//
void loop(){
if(digitalRead(2)==0){
if(flag==0){ flag=1;
mode^=1;
lcd.clear();
if(mode){
lcd.setCursor(0,0); lcd.print("1.Pulse Mode");
lcd.setCursor(0,1); lcd.print(" Push Select!");
}
else{
lcd.setCursor(0,0); lcd.print("2.Sensor Mode");
lcd.setCursor(0,1); lcd.print(" Push Select!");
}
delay(100);
}
}
else{
if(flag){ flag=0; delay(100); }
}
}
erree님의 댓글
erree
mode^=1; 이 부분이 이해가 잘 안됩니다.
master님의 댓글
master
1과 어떤 수를 xor 하면 어떤 수가 반전(토글 됩니다.)
mode=0일 때에 mode^=1; 실행되면 mode=1 이 되고
mode=1일 때에 mode^=1; 실행되면 mode=0 이 됩니다.
즉, 0과 1이 번갈아가면서 토글(반전) 됩니다.
erree님의 댓글
erree 작성일
감사합니다 혹시 마지막 if(flag){flag=0} 이 문장이
플래그값이1이면 위쪽 if(flag==0) 에 대해 출력을 하는건지 궁금합니다
master님의 댓글
master
if(digitalRead(2)==0){ // 스위치를 누르면
if(flag==0){ flag=1; // 플래그가 0이면 1로 변경함 // 스위치의 하강엣지 검출용 플래그 변수
스위치 누름에 따른 처리코드
}
}
else{ // 스위치를 누르지 않았으면
if(flag){ flag=0; delay(100); } // 플래그 변수가 1이면(0이 아니면) 플래그를 0으로 처리 // 스위치 상승엣지 검출
}
master님의 댓글
master
스위치의 하강엣지와 상승엣지를 검출하기 위한 코드입니다.
오래 누르고 있어도 1회만 검출하기 위한 용도죠