proteus에서 arduino를 시뮬레이션하여 매트릭스 키보드 프로그램 구현

매트릭스 키보드는 우리의 포트 부족 문제를 해결할 수 있습니다.물론 칩을 사용하여 매트릭스 키보드의 입력 포트 부족을 실현하는 것이 더 비용 효율적입니다.이 기사에서는 칩을 사용하여 문제를 해결하지 않습니다. 당분간은 간단한 8선을 사용하여 매트릭스 키보드를 구현하는데 목적은 초보자가 원리를 마스터하는 것입니다. 매트릭스 키보드의 입력 포트 부족을 해결하기 위해 칩을 사용하는 방법을 알고 싶다면 내 " 입력 포트가 적은 확장 방법?"을 참조하십시오. 74hc148 또는 74ls148을 Arduino에 캐스케이드하여 16-4 " 구현


기사 원본 출처: https://haigear.blog.csdn.net/article/details/130027248

먼저 매트릭스 키보드의 원리

1. 원리

정상적인 상황에서 우리의 4x4 키보드 매트릭스에는 분명히 16개의 버튼이 있습니다.논리적으로 말하면 우리는 16개의 포트가 필요하지만 우리의 디지털 포트는 14개뿐입니다. 직렬 포트나 다른 장치를 연결해야 하는 경우 기본적으로 arduino는 아무 것도 할 수 없습니다.
따라서 사람들은 16개의 와이어로만 할 수 있는 작업을 8개의 와이어를 사용하여 완료하는 좋은 방법을 생각했습니다. 스캔 원리는 출력 라인 OUT0이 하이 레벨을 출력할 때 IN0~IN3 포트가 하이 레벨인지 확인하기 위해 하나씩 스캔합니다.
여기에 이미지 설명 삽입
원리 요약: 레벨 회로를 통해 어떤 버튼을 눌렀는지 판단하고 출력 포트에 연결된 해당 입력 포트에서 해당 입력의 레벨 특성만 감지할 수 있습니다. 출력 포트는 라인과 출력 포트가 있는 라인의 교차 버튼에 있습니다.

예를 들어 OUT2는 하이 레벨을 출력하고 IN3에서 하이 레벨을 감지할 수 있으면 BTN12가 눌려진 것입니다.

2. 칩리스 모드 프로그램 및 회로

1. 풀업 모드

arduino의 포트에는 풀업 저항이 내장되어 있으므로 pinMode를 사용하여 풀업을 설정할 수 있으므로 pinMode(pin,INPUT_PULLUP) 키보드 매트릭스의 포트를 arduino의 디지털 포트에 직접 연결합니다.
여기에 이미지 설명 삽입


int count=0;const int ROWS = 4; // 定义行数
const int COLS = 4; // 定义列数

char keys[ROWS][COLS] = {
    
      // 定义键盘矩阵数组
  {
    
    '1', '2', '3', 'A'},
  {
    
    '4', '5', '6', 'B'},
  {
    
    '7', '8', '9', 'C'},
  {
    
    '*', '0', '#', 'D'}
};

// 定义每个引脚的接口
int rowPins[ROWS] = {
    
     11, 10, 9, 8 };
int colPins[COLS] = {
    
     5, 4, 3, 2 };
void setup() {
    
    
Serial.begin(9600);
// 设置行引脚为输出模式
  for (int i = 0; i < ROWS; i++) {
    
    
    pinMode(rowPins[i], OUTPUT);
    digitalWrite(rowPins[i], HIGH);
  }

  // 设置列引脚为输入模式
  for (int i = 0; i < COLS; i++) {
    
    
    pinMode(colPins[i], INPUT_PULLUP);
  }

}
void loop() {
    
    
  // 检测键盘按键是否被按下
  for (int row = 0; row < ROWS; row++) {
    
    
    digitalWrite(rowPins[row], LOW);
    for (int col = 0; col < COLS; col++) {
    
    
      if (digitalRead(colPins[col]) == LOW) {
    
    
        Serial.println(keys[row][col]);
        delay(100);
      }
    }
    digitalWrite(rowPins[row], HIGH);
  } 
}

2. 풀다운 모드

회로 관점에서 볼 때 풀다운 모드에서는 입력 핀에 풀다운 저항을 연결해야 합니다. 왜냐하면 arduino 핀에는 풀업 저항이 내장되어 있기 때문입니다. 풀다운 저항이므로 여기에 하나만 연결할 수 있습니다. 아래 그림과 같이:
여기에 이미지 설명 삽입

char keys[ROWS][COLS] = {
    
      // 定义键盘矩阵数组
  {
    
    '1', '2', '3', 'A'},
  {
    
    '4', '5', '6', 'B'},
  {
    
    '7', '8', '9', 'C'},
  {
    
    '*', '0', '#', 'D'}
};
void setup () {
    
    
   for(int a=2;a<=5;a++){
    
    
      pinMode(a,OUTPUT);
   }
   for(int a=8;a<=11;a++){
    
    
      pinMode(a,INPUT);
    }
   Serial.begin(9600);
// TODO: put your setup code here, to run once:
}

void loop() {
    
    
  
   for(int o=2;o<=5;o++){
    
    
     digitalWrite(o,1);
      for(int i=8;i<=11;i++){
    
    
	 if(digitalRead(i)){
    
    
	    Serial.println(keys[o-2][i-8]);
	    delay(10);
	  }  
	}
	digitalWrite(o,0);
   }
}

3. 키패드 라이브러리 사용

이 라이브러리 파일은 http://playground.arduino.cc/uploads/Code/keypad.zip 에서 다운로드할 수 있습니다.
다음 코드는 공식 웹 사이트에서 제공하는 코드이며 URL은 다음과 같습니다.
https://playground.arduino .cc/코드/ 키패드/#다운로드

#include <Keypad.h>
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
    
      // 定义键盘矩阵数组
  {
    
    '1','2','3','A'},
  {
    
    '4','5','6','B'},
  {
    
    '7','8','9','C'},
  {
    
    '*','0','#','D'}
};

byte rowPins[ROWS] = {
    
    9, 8, 7, 6};
byte colPins[COLS] = {
    
    5, 4, 3, 2};

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup(){
    
    
  Serial.begin(9600);
}
void loop(){
    
    
  char key = keypad.getKey();
  if (key != NO_KEY){
    
    
  Serial.println(key);
  }
}

키패드를 사용하고 나면 코드가 매우 간결해집니다.물론 키패드 라이브러리를 사용하는 방법을 먼저 이해해야 합니다.

추천

출처blog.csdn.net/haigear/article/details/130027248