Arduino实践-弹性小按键到矩阵键盘

上图所示是Arduino常用来输入的弹性小按键。如图所示,弹性小按键有四个引脚,内部工作原理是,1和2端口已连接在一个弹片上,3和4端口连接在另外一个弹片上,当小按键被按下,弹性按键内部的两个弹片相互接触,当松开按键时弹片由于弹性恢复分离状态。因此使用按键时,从1或2端口中选一个连入电路一段,3或4连入电路另一端。
使用Arduino检测弹性按键是否被按下,我们先把按键如下图所示接好

如图所示,当弹性小按键被按下时,数字端口2将直接和地线GND相连,即对配置为输入的数字端口2输入低电平,该实例程序可以在Arduino IDE环境下的File->Examples->Digital->Button中找到

const int buttonPin = 2; //连接按键的数字端口编号
const int ledPin = 13; //连接LED的数字端口编号

//定义随按键状态而改变的变量
int buttonState = 0;

void setup() {
  //初始化LED驱动端口为输出
  pinMode(ledPin, OUTPUT);
  //初始化按键端口为输入
  pinMode(buttonPin, INPUT);
}

void loop(){
  //读取按键端口状态
  buttonState = digitalRead(buttonPin);

  //检测按键是否被按下
  //如果是,变量buttonState为常量值 HIGH:
  if (buttonState == HIGH) {
    //打开LED:
    digitalWrite(ledPin, HIGH);
}
else {
  //熄灭LED
  digitalWrite(ledPin, LOW);
  }
}

上述方法的按键与Arduino连接时,每一个按键都需要占用Arduino一个端口,如果我们需要较多的按键则会遇到麻烦,于是我们引入矩阵键盘,将所有按键按行和列排布。这种键盘有现成零件出售,并且也有现成的库可用,省去使用时可能带来的技术细节问题。

我们以4×4矩阵键盘为例来说明使用方法。将16个按键排成4行4列,每一行将每个按键的一段连接在一起构成行线,每一列也类似,这样便一共有4行4列共8根线,我们将这8根线依图连接到Arduino的8个数字I/O口上。
检测的原理是,先送一列低电平,其余列均为高电平,然后立即轮流检测一次各行是否有低电平,若没有则说明送低电平这一列没有键被按下,然后继续轮次送低电平到其余列扫描。若一次送低电平到列,并逐检测每行的过程中有低电平,则该行有按键被按下,而送低电平的列则为被按下键的列数。行数、列数均确定后,该按键即被确定。因为Arduino逐行逐列扫描和检测的速度足够快,所以你无须担心它会遗漏被你按下的键。
该示例程序中,我们定义和使用了一个字符二维数组,多维数组属于程序设计中相对高阶的内容,第二篇中没有讲述,这里补充说明一下。
在本站C语言介绍的文章中,我们简要介绍了数组这种数据类型。数组就是给一类型的简单数据依次编号,a[0]、a[1]、a[2]、a[3]…。但这种数据类型在某些场合是不够方便的,譬如,我要定义一个数组,记录9×9乘法表的结果。记录99乘法表结果的最佳办法不是定义一个长度为81的数组,而是定义一个9行9列的数组,这样,引用数组元素的下标就有两个,行和列,这样有两个下标量的数组称为二维数组,依次类推还有三维数组等等。

 

显然,二维数组给记录键盘按键字符这样的数据带来了方便,譬如我需要知道键盘第2行第3列的数据,只要引用已经定义好的二维数组hexaKeys中的hexaKeys[2][3]就行。
错啦!变态的程序员都是从零开始数数,而不是一。所以引用第二行第三列的数据应该是hexaKey[1][2]。在二维数组定义之初,我们就可以对其进行赋值,以上述4×4键盘为例,其格式为

char hexaKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};

以下是连线硬件图

#include <Keypad.h>

const byte ROWS = 4; //四行
const byte COLS = 4; //四列
//定义键盘上的按键标识
char hexaKeys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {4, 5, 6, 7}; //连接到行扫描的输入输出端口
byte colPins[COLS] = {8, 9, 10, 11}; //连接到列扫描的输入输出端口

//定义Keypad类的实例
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup(){
  Serial.begin(9600);
}

void loop(){
  char customKey = customKeypad.getKey();

  if (customKey){
    Serial.println(customKey);
  }
}

该程序的作用是,不断检测键盘是否有按键被按下,如果有将被按下的键检测出来,然后打印到出口输出。

打开Arduino IDE自带的串口监控窗口,当我按下小键盘上的一些按键时,监控窗口将会显示一系列对应的字符,如图所示。

打赏

Arduino实践-弹性小按键到矩阵键盘》有3个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注