ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 키패드의 기본
    Arduino/키패드 2020. 10. 23. 18:11

    키패드와 아두이노의 하드웨어적인 연결

    연결은 쉽다.R1~R4와 C1~C4는 키패드의 핀번호이다.

    R4는 아두이노의 6번핀, R3은 7번핀, R2는 8번핀, R1은 9번핀에 각 각 연결한다.

    C1은 아두이노의 5번핀, C2는 4번핀, C3은 3번핀, C4는 2번핀에 각 각 연결한다.

     

    키패드의 버튼을 입력받아 출력하는 예제

    소스 코드

    void setup() 
    {
      Serial.begin(9600);
      
      pinMode(4,INPUT_PULLUP);
      pinMode(5,INPUT_PULLUP);
      pinMode(6,INPUT_PULLUP);
      pinMode(7,INPUT_PULLUP);
    }
    
    void loop() 
    {
      if(!digitalRead(4))       Serial.println("s1");  
      else if(!digitalRead(5))  Serial.println("s2");    
      else if(!digitalRead(6))  Serial.println("s3");    
      else if(!digitalRead(7))  Serial.println("s4");    
    
      delay(100);
    }

     

     

    키패드의 버튼을 입력받아 출력하는 예제로 이차원 배열을 활용

    프로그래밍의 기본 아이디어는 컴퓨터의 속도는 매우빠르다는 사실을 이용했고,

    한 행마다 한 행의 열을 체크해서 눌린 키패드를 찾는 방식이다.

    소스 코드

    더보기
    //  컴퓨터의 속도는 매우빠르다는 사실을 이용한다.
    const byte ROW_CNT = 4; // 행의 개수
    const byte COL_CNT = 4; // 열으 개수
    
    byte rowPins[ROW_CNT] = {9,8,7,6}; //  R4는 6번핀, R3은 7번핀, R2는 8번핀, R1은 9번핀
    byte colPins[COL_CNT] = {5,4,3,2}; //  C1은 5번핀, C2는 4번핀, C3은 3번핀, C4는 2번핀
     
     char keys[ROW_CNT][COL_CNT] = {
      {'1', '2', '3', 'A'},
      {'4', '5', '6', 'B'},
      {'7', '8', '9', 'C'},
      {'*', '0', '#', 'D'}
    };
    
    void setup(){
      Serial.begin(9600);
      //  row 라인은 출력모드로서 HIGH로 초기화하고 전원을 공급하는 역할을 합니다.
      //  col열은 입력 라인으로 해당 버튼이 눌러질 경우 풀업 저항일 경우 0의 값이 출력된다.
      for(int i = 0; i < ROW_CNT; i++)
      {
        pinMode(rowPins[i], OUTPUT);
        digitalWrite(rowPins[i], HIGH);   // 각층 초기화로 잠금. 건드릴 수 없는 상태.
      }
      for(int i = 0; i < COL_CNT; i++)
      {
        pinMode(colPins[i], INPUT_PULLUP); //각호실 내부풀업저항모드로 읽기
      }  
    }
    
    void loop(){
      char val = '\0';
     
      for(int row = 0; row < ROW_CNT; row++)
      {
          digitalWrite(rowPins[row], LOW);   // 해당층 개방
          
          for(int col = 0; col < COL_CNT; col++)
          {     
              //  해당 행의 열이 눌렸는지를 체크(행렬의 열 체크)
              if(!digitalRead(colPins[col]))
                val = keys[row][col];
          }
          //  행의 검사가 끝나면 검사가 끝난 행을 닫는다.        
          digitalWrite(rowPins[row], HIGH);  // 해당층 잠금
      }
      //  눌린 키패드가 있다면, 출력
      if(val != '\0')
      {
        Serial.println(val);
        delay(300);
      }      
    }

     

     

    위의 예제를 응용한 방법으로, 키패드를 통한 키 값을 계속 저장하다가

    특정 키가 눌리면 현재까지 입력된 문자들을 출력하는 예제

    소스 코드

    더보기
    //  컴퓨터의 속도는 매우빠르다는 사실을 이용한다.
    const byte ROW_CNT = 4; // 행의 개수
    const byte COL_CNT = 4; // 열으 개수
    
    byte rowPins[ROW_CNT] = {9,8,7,6}; //  R4는 6번핀, R3은 7번핀, R2는 8번핀, R1은 9번핀
    byte colPins[COL_CNT] = {5,4,3,2}; //  C1은 5번핀, C2는 4번핀, C3은 3번핀, C4는 2번핀
     
     char keys[ROW_CNT][COL_CNT] = {
      {'1', '2', '3', 'A'},
      {'4', '5', '6', 'B'},
      {'7', '8', '9', 'C'},
      {'*', '0', '#', 'D'}
    };
    
    void setup(){
      Serial.begin(9600);
      //  row 라인은 출력모드로서 HIGH로 초기화하고 전원을 공급하는 역할을 합니다.
      //  col열은 입력 라인으로 해당 버튼이 눌러질 경우 풀업 저항일 경우 0의 값이 출력된다.
      for(int i = 0; i < ROW_CNT; i++)
      {
        pinMode(rowPins[i], OUTPUT);
        digitalWrite(rowPins[i], HIGH);   // 각층 초기화로 잠금. 건드릴 수 없는 상태.
      }
      for(int i = 0; i < COL_CNT; i++)
      {
        pinMode(colPins[i], INPUT_PULLUP); //각호실 내부풀업저항모드로 읽기
      }  
    }
    
    String s;
    
    void loop(){
    
      char val = '\0';
      
      for(int row = 0; row < ROW_CNT; row++)
      {
          digitalWrite(rowPins[row], LOW);   // 해당층 개방
          
          for(int col = 0; col < COL_CNT; col++)
          {     
              //  해당 행의 열이 눌렸는지를 체크(행렬의 열 체크)
              if(!digitalRead(colPins[col]))
              {
                val = keys[row][col];
              }
          }
          //  행의 검사가 끝나면 검사가 끝난 행을 닫는다.        
          digitalWrite(rowPins[row], HIGH);  // 해당층 잠금
      }
      if(val != '\0')
      {
        if (val == '#')
        {
           Serial.println(s);
           s = "";
        }
        else s.concat(val);
         
        delay(300);
      }       
    }

     

    댓글

Designed by Tistory.