Arduino矩阵键盘使用教程

一 电路原理

矩阵键盘电路原理图如下:

矩阵键盘电路图

       矩阵键盘相比于独立按键的优势在于:使用同样的单片机端口,矩阵键盘可以驱动更多的按键数量。

 二 代码示例

const int numRows = 4; // 定义4行
const int numCols = 4; // 定义4列
const int debounceTime = 20; //去抖动时间长度
const char keymap[numRows][numCols] = {  //键值,可以按需要更改
  {'1', '2', '3', '+'},
  {'4', '5', '6', '-'},
  {'7', '8', '9', 'X'},
  {'*', '0', '#', '@'}
};
const int rowPins[numRows] = {7, 6, 5, 4}; // 设置硬件对应的引脚
const int colPins[numCols] = {11, 10, 9, 8};

// 初始化功能
void setup() {
  Serial.begin(9600);
//将行列设为对应输入输出模式,全设为高电平。
  for (int row = 0; row < numRows; row++) {
    pinMode(rowPins[row], INPUT);
    digitalWrite(rowPins[row], HIGH);`
  }

  for (int column = 0; column < numCols; column++) {
    pinMode(colPins[column], OUTPUT);
    digitalWrite(colPins[column], HIGH);
  }
}

// 主循环
void loop() {
  // 添加其他的程序,循环运行
  char key = getkey();
  if (key != 0) {
    Serial.print("Got key: "); // 串口打印键值
    Serial.println(key);
  }
}

// 读取键值程序
char getkey() {
  char key = 0;
  for (int column = 0; column < numCols; column++) {
    digitalWrite(colPins[column], LOW);
    for (int row = 0; row < numRows; row++) {
      if (digitalRead(rowPins[row]) == LOW) { // 是否有按键按下
        delay(debounceTime);
        while (digitalRead(rowPins[row]) == LOW); // 等待按键释放
        key = keymap[row][column];
      }
    }
    digitalWrite(colPins[column], HIGH); // 关闭当前列
  }
  return key;
}

 2.1 接线方式:

const int rowPins[numRows] = {7, 6, 5, 4}; // 设置硬件对应的引脚
const int colPins[numCols] = {11, 10, 9, 8};

根据代码进行对应引脚的接线,可自行根据设计确定。 

2.2 函数解释

读取键值的函数实现以下步骤

1、4个行线全部设为输出,并置高电平;

2、4个列线全部设为输入,并置高电平(内部上拉作用);

第一行线拉低(LOW)检测4根列线是否有低电平出现?如果有,证明有按键按下去抖,再次确认,直到按键释放,读取4个列线值,通过矩阵数组确定按键键值,如果没有则继续下一步。释放改行线(置高HIGHT)。

第二行线拉低(LOW)检测4根列线是否有低电平出现?如果有,证明有按键按下:去抖,再次确认,直到按键释放,读取4个列线值,通过矩阵数组确定按键键值,如果没有则继续下一步。释放改行线(置高HIGHT)。

第三行线拉低(LOW)检测4根列线是否有低电平出现?如果有,证明有按键按下,去抖,再次确认,直到按键释放,读取4个列线值,通过矩阵数组确定按键键值,如果没有则继续下一步。释放改行线(置高HIGHT)。

第四行线拉低(LOW)检测4根列线是否有低电平出现?如果有,证明有按键按下去抖,再次确认,直到按键释放,读取4个列线值,通过矩阵数组确定按键键值,如果没有则继续下一步。释放改行线(置高HIGHT)。

三 可能遇到的问题

    1 需要判断矩阵键盘接口左右两边分别控制的是行还是列,这里可以通过使用代码寻找规律,再自行更改引脚接入顺序。

    2 对单片机写入程序时,需要先拔掉矩阵键盘再写入。

一个简单的PCB键盘,可轻松用于Arduino项目。提供了完全可定制的代码! 硬件部件: Arduino UNO × 1个 1N4148 –通用快速开关 × 64 触觉开关,顶部致动 × 64 排针× 1个 74HC595移位寄存器× 1个 软件应用程序和在线服务: Arduino IDE 手动工具和制造机: 烙铁(通用) 我目前正在开发一个带有集成键盘的项目,这带来了一个问题:如何在开发板原型中包含键盘?我不能使用USB键盘或现有的基于Arduino的键盘,因为实际项目中的键盘直接连接到处理所有其他功能的微控制器。因此,我设计了这种基于PCB的基本64键原型键盘矩阵。 该PCB不包含任何IC(集成电路)。键盘矩阵的行和列直接连接到引脚接头,以便键盘可以连接到Arduino或任何其他微控制器。它是为您的项目原型制作的完美选择,其中包括集成键盘。 我已经包含了详细的,经过注释的代码,以使其与任何具有足够I / O引脚可用的Arduino兼容开发板一起使用,需要11个引脚。键盘有64个键,包括shift,caps,ctrl,alt,fn和“ special”的修饰符。还有六个其他键可用于任何您喜欢的操作。每个单个键的功能都可以单独定义,包括激活修饰符时每个键的功能。我认为,这比现有的键盘代码明显有用,后者严重限制了您自定义按键行为的能力。 提供的代码将文本打印到串行。如果您希望文本移至其他位置,则可以轻松更改。 关于程序大小的注意事项: 我提供的代码很大,因为它不使用任何现有的库。我完全从头开始编写此代码,以实现所需的可定制性。在Arduino UNO上,这将使用9100字节(28%)的程序存储空间,而全局变量使用394字节(19%)的动态内存。 我的代码可能会更高效,并且键盘的库和草图肯定会更小,但这是我可以设计的唯一方法,可以为每个键和每个修饰符提供完全的灵活性。它还考虑了实际的键盘使用情况。例如,在启用Caps Lock的情况下,按我的代码的同时按Shift键,将产生应小写的字母。默认情况下,在按ESC的同时按住FN键不会执行任何操作。但是该行为是完全可定制的,因此您可以根据自己的喜好进行更改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值