矩阵键盘是可以解决我们端口缺乏的问题,当然,如果我们使用芯片来实现矩阵键盘的输入端口缺乏的问题将更加划算了,本文暂时不使用芯片来解决问题,而使用纯朴的8根线来实现矩阵键盘,目的是使初学者掌握原理。想了解使用芯片解决矩阵键盘的输入端口紧缺的问题可以参看我的《输入端口少如何扩展?74hc148或74ls148级联在arduino中实现16转4的应用》
文章目录
- 一、矩阵键盘的原理
- 1、原理
- 二、无芯片模式程序与电路
- 1、上拉模式
- 2、下拉模式
- 三、使用keypad库
文章原出处: https://haigear.blog.csdn.net/article/details/130027248
一、矩阵键盘的原理
1、原理
普通情况下,我们一个4x4的键盘矩阵很显然是16个按钮,按道理来说我们就需要16个端口,但我们的数字端口只有14个,就算是把模拟端口改成数字端口用,我们也没有几个端口是盈余的了,还要接串口或者其他设备,那基本一个arduino就干不了事情了。
所以,人们想到了一个好办法,用8根线完成了这个16根线才能完成的任务。原理就是扫描,当输出线路OUT0输出高电平的时候,逐个扫描查询IN0~IN3哪个端口为高电平,因为哪个端口上显示高电平就表明哪个按钮被按下。
原理总结:通过电平回路来判断哪个按钮被按下,只有与输出端口相连的对应输入端口上能够检测到相应输入的电平特征即表示连接他们的按钮被按下,即为在输出端口所在线路和输出端口所在线路的交集按钮上。
如,OUT2输出高电平,如果我们能够在IN3上检测到高电平,说明BTN12被按下了。
二、无芯片模式程序与电路
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);
}
}
三、使用keypad库
这个库文件,我们可以在这里下载,http://playground.arduino.cc/uploads/Code/keypad.zip
以下代码即官网提供的代码,网址如下:
https://playground.arduino.cc/Code/Keypad/#Download
#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);
}
}
使用keypad后,代码十分简洁了,当然,我们必须首先了解这个keypad库的使用方法。