programming

GPIO - 버튼처리

programmer j 2020. 8. 8. 15:06

GPIO입력을 이용한 버튼 처리방법 메모

 

typedef struct _button_data
{
  uint8_t               button_id;
  uint8_t               prev_physical_status;   // Previous physical button status(PRESSED or RELEASED)
  uint8_t               prev_logical_status;    // Previous logical button status(PRESSED or RELEASED)
  uint8_t               current_logical_status; // Current logical button status(PRESSED or RELEASED)
  uint16_t              pressed_count;          // It represents how long a button is pressed. It is used for de-bounce filtering.
} button_data;

 

// 1ms마다 호출되는 함수

void SysTick_Handler(void)
{

            :

  // Update physical button state

  if (read_button_status(button_data.button_id) == pressed)
  {
    if (button_data.prev_physical_status == RELEASED)
    {
      button_data.prev_physical_status = PRESSED;
    }
    button_data.pressed_count++; // Pressed time increased

 

    // Update logical button state
    if (button_data.pressed_count > button_data.press_check_time)
    {
      button_data.current_logical_status = PRESSED;
    }
  }
  else
  {

    // Update physical and logical button state
    if (button_data.prev_physical_status == PRESSED)
    {
      button_data.prev_physical_status = RELEASED;
      button_data.current_logical_status = RELEASED;
    }
    button_data.pressed_count = 0; 
  }

            :           

}

 

int main(void)

{

  if (button_data.prev_logical_status == RELEASED)

  {

    if (button_data.current_logical_status == PRESSED)

    {

      // TODO : 버튼이 눌렸을 때 동작

      button_data.prev_logical_status = PRESSED;

    }

  }

  else if (button_data.prev_logical_status == PRESSED)

  {

    if (button_data.current_logical_status == RELEASED)

    {

      // TODO : 버튼을 뗏을 때 동작

      button_data.prev_logical_status = RELEASED;

    }

  }

}