아두이노 비트필드(bit field)를 이용한 버튼입력 처리

Software/Arduino|2023. 1. 17. 11:35
반응형

아두이노에 버튼이 여러개 있을 경우 각각의 버튼에 대한 입력을 체크하여 각각의 버튼에 대한 입력 처리만 하게됩니다. 

예를 들어 버튼이 3개가 있다면 3가지 경우의 입력만 처리하게 됩니다.  

 

하지만 적은 수의 버튼으로 좀더 많은 경우의 처리를 하는 방법이 있습니다. 바로 bit field 기능을 이용하면 됩니다. 

비트 필드를 구성하게 되면 두개 이상의 키가 동시에 눌리는 경우도 하나의 입력값으로 인식하여 처리 루틴을 만드는 것이 가능합니다.

만일 버튼이 3개 있다면 최대 7가지의 경우로 조합하여 입력 처리를 할 수 있습니다. 

 

#define U08  unsigned char 

union BUTTON_STATE   // 버튼입력 상태에 대한 비트필드 공용체
{
  U08 State ;
  struct
  {
    int UP_BUTTON    : 1 ;
    int DOWN_BUTTON  : 1 ;
    int LEFT_BUTTON  : 1 ;
    int RIGHT_BUTTON : 1 ;   
    int EMPTY        : 4 ;
  } ;
} ;

const int upButton    = 2;    
const int downButton  = 3;       
const int leftButton  = 4;
const int rightButton = 5;

BUTTON_STATE btn_state ;

void setup()
{
  // initialize the buttons' inputs:
  pinMode(upButton, INPUT);      
  pinMode(downButton, INPUT);      
  pinMode(leftButton, INPUT);      
  pinMode(rightButton, INPUT);     
}

U08 Read_Button()
{
   btn_state.UP_BUTTON    = digitalRead(upButton); 
   btn_state.DOWN_BUTTON  = digitalRead(downButton);
   btn_state.LEFT_BUTTON  = digitalRead(leftButton);
   btn_state.RIGHT_BUTTON = digitalRead(rightButton);

   return btn_state.State ;
}
 
void loop()
{
    U08 Key_State ;

    Key_State = Read_Button() ;

    switch(Key_State)
    {
        case 0x01 : function1() ; break ;  // UP_BUTTON
        case 0x02 : function2() ; break ;  // DOWN_BUTTON
        case 0x04 : function3() ; break ;  // LEFT_BUTTON
        case 0x08 : function4() ; break ;  // RIGHT_BUTTON
        case 0x03 : function5() ; break ;  // UP_BUTTON & DOWN_BUTTON
    }
}
반응형

댓글()