본문 바로가기
임베디드/Arduino

키입력 인터럽트

by sj0020 2020. 9. 2.
/*
* 키입력 인터럽트 Update 2019.08.30 by hack4ork
*/
#define BUTTON_PIN1 2

const int buttonPin1 = 2; // 인터럽트 0
const int buttonPin2 = 3; // 인터럽트 1
const int buttonPin3 = 4;

volatile long preTime = 0;
volatile long curTime = 0;
const int deBounce = 200;

void setup()
{
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(buttonPin1), buttonInterrupt1, FALLING);
  attachInterrupt(digitalPinToInterrupt(buttonPin2), buttonlnterrupt2, FALLING);
}

void loop() {
  int val = digitalRead(buttonPin3);
  if (val ==1){
    Serial.println("1번 버튼 누름");
  }
}

void buttonInterrupt1() {
  curTime = millis();
  if(curTime - preTime >= deBounce) {
    uint8_t oldSREG = SREG;
    cli();
    Serial.println("2번버튼 누름");
    preTime = curTime;
    SREG = oldSREG;
  }
}
void buttonlnterrupt2() {
Serial.println("3번버튼 누름");
}

 

/*
* 키입력 인터럽트 Update 2019.08.30 by hack4ork
* 풀다운 폴링
*/
#define BUTTON_PIN1 2

const int buttonPin1 = 2; // 인터럽트 0
const int buttonPin2 = 3; // 인터럽트 1
const int buttonPin3 = 4;

volatile long preTime = 0;
volatile long curTime = 0;
const int deBounce = 200;
int buttonState; 

void setup()
{
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(buttonPin1), buttonInterrupt1, FALLING);
  attachInterrupt(digitalPinToInterrupt(buttonPin2), buttonlnterrupt2, FALLING);
}

void loop() {
  // put your main code here, to run repeatedly:
  int reading = digitalRead(buttonPin3); // 폴링 방식 //클럭주파수 때문에 쫙 떨어지면서 뜬다.
  

  // if the button state has changed:
  if (reading != buttonState) { // buttonState의 값은 전역변수 0 => reading이 1일 때,
    buttonState = reading; // buttonState 값을 0으로 바꿔라

    // only toggle the LED if the new button state is HIGH
    if (buttonState == 1) { // if 버퍼 -> 시간차 조정
      Serial.println("1번 누름");
    }
  }
}

void buttonInterrupt1() {
  curTime = millis();
  if(curTime - preTime >= deBounce) {
    uint8_t oldSREG = SREG;
    cli();
    Serial.println("2번버튼 누름");
    preTime = curTime;
    SREG = oldSREG;
  }
}
void buttonlnterrupt2() {
  curTime = millis();
  if(curTime - preTime >= deBounce) {
    uint8_t oldSREG = SREG;
    cli();
    Serial.println("3번버튼 누름");
    preTime = curTime;
    SREG = oldSREG;
  }
}