风筝
发表于: 2022-7-27 09:48:48 | 显示全部楼层

我们在手机、计算器、微波炉、门锁等上经常看到的那种键盘属于矩阵键盘,它们几乎无处不在。


然而,在DIY电子产品中,它们是让用户与您的项目交互的好方法,并且通常需要导航菜单、输入密码和控制机器人。


硬件概述 – 薄膜键盘

薄膜键盘(Membrane Keypad)由薄而柔韧的薄膜材料制成。它们的尺寸可能有4×3、4×4、4×1等。不管它们的尺寸如何,它们都以相同的方式工作。


它们的一大优点是它们带有背胶,因此您几乎可以将其连接到任何东西上。你只需要撕掉背面的纸。

4x3-4x4-Keypads.jpg


我们以4×4键盘为例。它共有16个键。每个按键下方是一个特殊的薄膜开关。所有这些薄膜开关通过焊盘下方的导电线相互连接,形成4×4网格矩阵。

Internal-Conductive-Traces-of-4x3-Membrane-Keypad-On-Back-Side.jpg


如果您使用了16个单独的按键,则需要17个输入引脚(每个按键一个,一个接地引脚)才能使它们工作。然而,使用矩阵排列,您只需要8个微控制器引脚(4列和4行)即可完成扫描按键。


4×3和4×4薄膜键盘的引脚排列

4×3和4×4薄膜键盘的引脚排列如下所示。

Mambrane-Keypad-Pinout.jpg


键盘如何工作以及如何扫描它们?

工作原理非常简单。按下按键可将其中一条行线与其中一条列线短路,从而允许电流在它们之间流动。例如,当按下键“4”时,第1列和第2行被短接。

4x3-Membrane-Keypad-Working.gif


微控制器可以扫描这些线路以查找按钮按下状态。为此,它遵循以下程序。

1.  微控制器将所有列和行线设置为输入。

2.  然后,它选择一行设置为输出,并将其设置为高电平。

3.  之后,它依次检查每一列线。

4.  如果列连接保持低电平,则未按下该列线上的按钮。

5.  如果它变为高电平,则微控制器知道哪一行设置为高电平,以及在检查时检测到哪一列为高电平。

6.  最后,它知道按下了对应于检测到的行和列的按钮。


使用Arduino连接4×3和4×4薄膜键盘

现在我们了解了有关薄膜键盘的所有信息,可以开始将它与Arduino连接起来。


连接非常简单。首先将键盘的引脚1连接到Arduino上的数字引脚9。现在继续向左连接引脚,如2与8、3与7等。

Wiring-Membrane-Keypad-with-Arduino.jpg


安装Keypad库

为了确定按下了哪个键,我们需要连续扫描行和列。幸运的是,Keypad.h可以隐藏这种不必要的复杂性,以便我们可以发出简单的命令来知道按下了哪个键。


要安装库,请导航到 Sketch > Include Library > Manage Libraries...等待库管理器下载库索引并更新已安装库的列表。

Manage-Libraries.jpg


通过键入“keypad”过滤您的搜索。 应该有几个条目。 查找由Mark Stanley, Alexander Brevig制作的Keypad库。 单击该条目,然后选择安装。

Arduino-Keypad-Library-Installation.jpg


Arduino代码

以下草图将让您全面了解如何使用4×3和4×4薄膜键盘检测按键,并可以作为更多实际实验和项目的基础。


4×3键盘代码

  1. #include <Keypad.h>

  2. const byte ROWS = 4; //four rows
  3. const byte COLS = 3; //three columns

  4. char keys[ROWS][COLS] = {
  5.   {'1','2','3'},
  6.   {'4','5','6'},
  7.   {'7','8','9'},
  8.   {'*','0','#'}
  9. };
  10. byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
  11. byte colPins[COLS] = {5, 4, 3}; //connect to the column pinouts of the keypad

  12. //Create an object of keypad
  13. Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

  14. void setup(){
  15.   Serial.begin(9600);
  16. }
  17.   
  18. void loop(){
  19.   char key = keypad.getKey();// Read the key
  20.   
  21.   // Print if key pressed
  22.   if (key){
  23.     Serial.print("Key Pressed : ");
  24.     Serial.println(key);
  25.   }
  26. }
复制代码

4×4键盘代码

  1. #include <Keypad.h>

  2. const byte ROWS = 4; //four rows
  3. const byte COLS = 4; //four columns

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

  10. byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
  11. byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad

  12. //Create an object of keypad
  13. Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

  14. void setup(){
  15.   Serial.begin(9600);
  16. }
  17.   
  18. void loop(){
  19.   char key = keypad.getKey();// Read the key
  20.   
  21.   // Print if key pressed
  22.   if (key){
  23.     Serial.print("Key Pressed : ");
  24.     Serial.println(key);
  25.   }
  26. }
复制代码

这是串口监视器中输出的样子。

4x3-4x4-Keypad-Arduino-interfacing-Output-On-Serial-Monitor.jpg


代码说明

该草图首先包含Keypad.h库并定义行数和列数。


接下来,我们定义一个二维键盘数组keys[ROWS][COLS],它保存在键盘上按下特定按钮时要打印的字符。


在我们的草图中,字符的布局与它们出现在键盘上的一样。但实际上你可以将这些定义为你想要的任何东西。例如,如果您打算创建一个计算器项目,您只需将数组定义更改为:

  1. char keys[ROWS][COLS] = {
  2.   {'1','2','3','4'},
  3.   {'5','6','7','8'},
  4.   {'9','0','+','-'},
  5.   {'.','*','/','='}
  6. };
复制代码

接下来,我们创建一个keypad对象。构造函数Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS ) 接受五个参数。

●    makeKeymap(keys) 将内部键盘映射初始化为等于用户定义的键盘映射。

●    rowPinscolPins 是与键盘的行和列连接的arduino引脚号。

●    ROWSCOLS 是键盘的行数和列数。

一旦创建了keypad对象,我们可以发出一个简单的命令 getKey() 来检查按下了哪个按键。


键盘库中的其他有用函数

您可以将一些有用的函数与Keypad对象一起使用。下面列出了其中的几个:

●    char waitForKey() 永远等待,直到有人按下一个键。它会阻止所有其他代码,直到按下某个键。这意味着没有闪烁的LED,没有LCD屏幕更新,除了中断程序之外什么都没有。

●    KeyState getState() 返回任何键的当前状态。四种状态是IDLE、PRESSED、RELEASED和HOLD。

●    boolean keyStateChanged() 让您知道按键何时从一种状态更改为另一种状态。例如,您可以测试何时按下某个键,而不仅仅是测试一个有效的键。

●    setHoldTime(unsigned int time) 设置用户必须按住按钮直到触发HOLD状态的毫秒数。

●    setDebounceTime(unsigned int time) 设置键盘在接受新的按键/按键事件之前将等待的毫秒数。

●    addEventListener(keypadEvent) 如果使用键盘,则触发事件。

跳转到指定楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-22 20:04 , Processed in 0.054520 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表