【按键扫描】矩阵按键之多按键扫描

article/2025/1/17 5:54:32

前言

上一章我们介绍了经典矩阵键盘的实现方法,但是示例程序中仅实现了单按键检测功能。虽说单按键已经基本可以覆盖矩阵键盘的常见需求,但在一些特殊应用场合,我们仍然需要多按键识别操作,或者一些类似电脑组合按键的功能支持。

先从示例程序上进行改善,支持多按键检测。

多按键扫描示例程序

经典矩阵键盘是由行列线组成,行线与列线构成一个二维模型,从代码的角度看,类似二维数组。

使用二维数组的每一个值,记录矩阵键盘行列中对应按键的状态,按键按下记录为1,按键抬起记录为0,每次检测后保存当前矩阵状态。
前后两次检测,判断对应矩阵有没有变化,即可确认是否有按键状态更新, 也可以判断当前有哪些按键被按下。

实际使用时,由于按键状态只有 0/1 状态变化,使用 1bit 即可表示。
所以二维数据可简化为一维数组,列不超过8时,可使用 uint8_t 8位数据的每一位去代表每一列的按键状态。

// 检查每一行对应的列值
void check_cols_on_row(uint8_t row, uint8_t matrix[])
{uint8_t col;uint8_t col_shifter = 1;uint8_t row_value = 0;// 逐行选中set_gpio_low(matrix_rows[row]);for (col = 0; col < MATRIX_COL_MAX; col++, col_shifter <<= 1){// 逐位赋值//   GPIO 为高时,抬起状态,记录为0,//   GPIO 为低时,按下状态,记录为1row_value |= get_gpio(matrix_cols[col]) ? KEY_UNPRESSED : col_shifter;}matrix[row] = row_value;// 清除选中行set_gpio_height(matrix_rows[row]);
}// 矩阵键盘扫描
void matrix_scan(uint8_t matrix[])
{uint8_t row;memset(matrix, 0x0, sizeof(matrix));for (row = 0; row < MATRIX_ROW_MAX; row++){// 判断对应行中的列状态,确认按键状态check_cols_on_row(row, matrix);}
}

按键消抖,此处实现了一种简单的消抖方式"矩阵消抖",第一次检测矩阵状态,延时10us,再次检测矩阵状态,如果矩阵前后两次状态相同,才认为是有效数据,否则认为是按键抖动。

消抖方式可自行实现,在时间和空间复杂度上进一步优化。

// 按键扫描
uint8_t key_scan()
{uint8_t changed = 0;uint8_t bounce = 0;// 扫描矩阵状态matrix_scan(scan_matrix);// 和上一次有效值比较,如果存在差异,初步检测状态变化changed = memcmp(scan_matrix, active_matrix, sizeof(scan_matrix)) != 0;if (changed){// 延时消抖delay_10us(1);// 再次扫描状态,如果矩阵状态相同,才认为状态更新matrix_scan(debounce_matrix);bounce = memcmp(scan_matrix, debounce_matrix, sizeof(scan_matrix)) != 0;if (!bounce){memcpy(active_matrix, scan_matrix, sizeof(scan_matrix));return MATRIX_CHANGED;}}return MATRIX_UNCHANGED;
}

矩阵检测后,需要根据按键的功能需求,确认对应的实现方式,DEMO 仅做打印处理。

// 处理键盘扫描结果
void key_process()
{static uint8_t matrix_prev[MATRIX_ROW_MAX];uint8_t row, col;uint8_t matrix_row;uint8_t matrix_change;uint8_t col_mask = 1;matrix_key_t key;for (row = 0; row < MATRIX_ROW_MAX; row++){matrix_row = matrix_get_row(row);// 当前行值与上次的行值进行比较,看是否有变化matrix_change = matrix_row ^ matrix_prev[row];if (matrix_change){for (col = 0; col < MATRIX_COL_MAX; col++, col_mask <<= 1){// 当有变化时,逐位判断,哪一列的值有变化if (matrix_change & col_mask){key.keymap = keymaps[row][col];key.row = row;key.col = col;// 确定按键是按下还是抬起状态if (matrix_row & col_mask)key.status = KEY_PRESSED;elsekey.status = KEY_UNPRESSED;matrix_print(active_matrix);matrix_key_print(&key);// 记录当前状态变化matrix_prev[row] ^= col_mask;}}}}return;
}

经典矩阵键盘的"鬼影"

经典矩阵键盘,在多按键同时按下时,有时会存在误识别的现象。

具体的表现场景:当矩阵中的一组按键构成四边形时,处于四边形4个顶点的对应按键有三个按键被按下时,则第四个按键也会被检测为导通状态。如图 SW1, SW2, SW3 被按下时,SW4 也会被识别为按下状态。

矩阵键盘在检测 SW4 时,电流会产生如下导通回路,这种现象被称为按键鬼影(ghosting)。按键数量较多时,鬼影现象会变得更明显。

矩阵键盘"鬼影"通路

鬼影主要是多按键按下时的异常通路导致,为了避免这种情况产生,我们可以利用二极管的单向导通特性,阻断通路,使矩阵键盘中的按键都可以被独立检测。

在按键侧增加列对行导通方向的二极管,即可阻断异常通路,且不影响正常的按键检测。

矩阵键盘通路二极管阻断

二极管会产生压降,从而会降低电路的稳定性,普通二极管为0.7v,肖特基二极管为0.2v左右,在实际应用中,可优先考虑压降小的肖特基二极管。

结论

矩阵键盘在实际使用中,如需要多按键支持,需要使用二极管避免鬼影现象,程序上也需要对多按键进行兼容处理,如此才可以实现一个"全键无冲"版本的矩阵键盘。

其他

多按键扫描相关的程序和原理,本来是想在 proteus 中进行验证,但在实际仿真时,发现程序并没有按照预期的方式在运行。主要有如下两点:

  1. 无二极管时,矩阵键盘并没有按照预期出现"鬼影"效果,实际表现为相关按键不受控制
  2. 添加二极管后,单片机无法正常检测到低电平,按键均无法识别。

排查原因未果,而实际又没有相关硬件验证,如上为搜集到的一些资料及推理整理。希望有条件人事可以加以验证。



http://chatgpt.dhexx.cn/article/AtVpIm0s.shtml

相关文章

STM32矩阵按键

矩阵按键原理 本实验使用STM32F103单片机&#xff0c;主题代码通用的。 如果每个按键占用一个GPIO引脚&#xff0c;对于使用多个按键来说就是一种资源的浪费&#xff0c;因此当我们在设计时&#xff0c;可以考虑矩阵这种方式。本实验使用4*4也就是16个按键。 矩阵按键相对于独立…

【按键扫描】独立按键与矩阵按键

按键介绍 我们通常提到按键&#xff0c;一般是指按键开关&#xff0c;也称为轻触开关。轻触开关是最常用的几种电子元器件之一&#xff0c;被各种电子产品广泛使用。 轻触开关与普通开关类似&#xff0c;但又略有不同。普通开关有闭合与断开两种状态&#xff0c;切换后状态会…

矩阵按键实验

矩阵按键简介 以 4*4 矩阵键盘为例。 16 个按键被排成 4 行 4 列&#xff0c;第一行将每个按键的一端连接在一起构成行线&#xff0c;第一列将每个按键的另一端连接在一起构成列线&#xff0c;这样便一共有 4 行 4 列共 8 根线&#xff0c;如图所示&#xff1a; 将这 8 根线连接…

51单片机学习记录(五)矩阵按键

文章目录 1、矩阵按键的控制原理2、矩阵按键实现1、行列式法实现矩阵按键2、线翻转法实现矩阵按键3、按键实战 1、矩阵按键的控制原理 独立按键与单片机连接时&#xff0c; 每一个按键都需要单片机的一个 I/O 口&#xff0c; 若某单片机系统需较多按键&#xff0c; 如果用独立…

51单片机矩阵键盘扫描及使用方法

一、矩阵键盘简介 矩阵键盘&#xff0c;也称矩阵按键&#xff0c;是为了节约单片机IO口占用所引入的一种外设。 &#xff08;图片截取至普中A2开发板原理图&#xff09; &#xff08;图片截取至普中A2开发板实物图&#xff09; 我们知道&#xff0c;一个独立按键需要1个IO口。但…

单片机编辑库四之矩阵按键

单片机编辑库一之延时与led灯 单片机编辑库二之按键 单片机编辑库三之蜂鸣器 单片机编辑库四之矩阵按键 之前为大家介绍了独立按键的原理和使用方法&#xff0c;这一章给大家带来一个升级体验——矩阵按键&#xff0c;话不多说&#xff0c;直接开始今天的内容。 一、矩阵按键…

51单片机——矩阵按键实验,小白讲解,相互学习

矩阵按键介绍&#xff1a; 独立按键与单片机连接时&#xff0c;每一个按键都需要单片机的一个I/O 口&#xff0c;若某单片机系统需较多按键&#xff0c;如果用独立按键便会占用过多的I/O 口资源.单片机系统中I/O 口资源往往比较宝贵&#xff0c;当用到多个按键时为了减少I/O 口…

STM32----矩阵按键

一、实物图 二、开发流程 分析&#xff1a;对于矩阵按键&#xff0c;我们一般采用行列扫描反转的方法进行开发&#xff0c;分别把每一个引脚连接一个GPIO口并设置一半成通用推挽输出模式&#xff0c;一半为上拉输入模式&#xff0c;行列扫描反转进行判断按击的按键来判断行列从…

(五)矩阵按键

本章我们主要是写矩阵键盘的内容&#xff0c;矩阵键盘的原理和独立按键的按键原理基本是类似的&#xff0c;只是关于整个的原理还是要有些介绍&#xff0c;本章我们通过矩阵按键的某个按键按下&#xff0c;然后在数码管上输出对应的按键值。 1.关于按键 可以看前面按键的内容…

【STM32 基础实验矩阵按键】

文章目录 一、元器件矩阵键盘说明二、基于stm32f10c8t6 基础实验矩阵按键&#xff08;1&#xff09;实验功能实现说明&#xff08;2&#xff09;矩阵键盘原理&#xff08;3&#xff09;代码部分&#xff08;4&#xff09;效果展示 三、总结与扩展附上参考文献链接与视频链接出处…

51单片机入门——矩阵按键

文章目录 1.按键1.1.独立按键1.2.矩阵按键 2.按键的扫描与抖动2.1.独立按键的扫描2.2.按键抖动与消抖2.3.矩阵按键的扫描 3.简易计算器 1.按键 1.1.独立按键 常用的按键电路有两种形式&#xff0c;独立式按键和矩阵式按键&#xff0c;独立式按键比较简单&#xff0c;它们各自…

mac怎么给移动硬盘分区

我们经常用Windows系统给移动硬盘分区&#xff0c;对于Windows系统的操作我们是非常熟悉的&#xff0c;但是现在很多人都在使用苹果电脑&#xff0c;那么如何用Mac给硬盘分区呢&#xff1f;这个可是需要技术的。如果我们不会用Mac系统给移动硬盘分区&#xff0c;当我们在Mac上插…

ntfs格式的移动硬盘如何在mac电脑写入?

随着照片视频等技术的进步&#xff0c;这类文件越发清晰的同时&#xff0c;占用内存也越来越大&#xff0c;人们逐渐将其中不常用到的存入移动硬盘中&#xff0c;以此减少电脑空间占用。目前国内大多数移动硬盘均为Windows自研的NTFS格式&#xff0c;对于这类NTFS格式的移动硬盘…

mac怎么删除硬盘里面的东西?为什么苹果电脑无法删除移动硬盘文件?

mac怎么删除硬盘里面的东西&#xff1f;由于移动硬盘的文件系统是NTFS格式的&#xff0c;而这种格式与Mac电脑是不兼容的&#xff0c;Mac电脑没有权限对移动硬盘上的数据进行操作&#xff0c;Mac上不能把移动硬盘的数据删除了&#xff0c;那么&#xff0c;有没有什么操作方法&a…

苹果电脑怎么用移动硬盘ntfs?快速读取和编辑Mac外置移动硬盘

苹果电脑怎么用移动硬盘ntfs&#xff1f;如果你对电脑比较熟悉的话&#xff0c;可能知道NTFS磁盘格式。该格式专门为Windows系统设计的&#xff0c;也称为Windows NT文件系统。从Windows系统迁移到Mac可能是一项相当困难的任务&#xff0c;因为NTFS格式的硬盘在Mac上不能正常工…

如何在Mac上给移动硬盘加密

随着人们的安全意识越来越强&#xff0c;手机加密、Wi-Fi加密&#xff0c;甚至平时工作的U盘、移动硬盘也要加密。在Mac上对移动硬盘加密并不是很难&#xff0c;通过磁盘工具对硬盘进行格式化处理&#xff0c;并重新选择磁盘格式便可实现加密。下面就让我们来看具体的操作吧&am…

mac无法在移动硬盘上新建文件夹 mac如何在移动硬盘新建文件夹

明明是新买的硬盘&#xff0c;为什么把移动硬盘插入Mac后&#xff0c;Mac无法在移动硬盘上新建文件夹呢&#xff1f;相信很多Mac用户都曾遇到过Mac无法在移动硬盘上新建文件夹的问题。为什么会出现这样的问题呢&#xff1f;用户应该怎么解决呢&#xff1f;本文就来为大家介绍ma…

Mac无法写入移动硬盘 这些软件帮你解决

疫情期间因工作需要&#xff0c;从淘宝上买了一个移动硬盘&#xff0c;将公司的文件拷贝到这个移动硬盘上&#xff0c;并没有发现什么问题&#xff0c;一拿回到家里就懵圈了&#xff0c;突然发现里面的文件都无法进行修改或剪切粘贴。 一番百度之后&#xff0c;我找到了原因&a…

Mac如何拷贝文件到移动硬盘

haha~ 看到这个标题不要以为博主这是傻了: “切, 往移动硬盘拷文件谁不会啊~”, “又在故弄玄虚, 就这也写博客~” … 确实, 我要把这个写成博客了. 因为今天要拷贝MacOS Sierra安装包到另外一台电脑上, 安装包有4.7个G, U盘果断不行, 于是换上移动硬盘, 连上电脑, 将安装包拖入…

Mac下如何把iphone资料备份到移动硬盘

一般的备份方法 首先新系统的iphone备份已经转到了访达 连接iphone后在访达左边栏会看到你的手机 在终端输入下面这段命令行 ln -s /Volumes/Data/ios_backup &#xff5e;/Library/Application\ Support/MobileSync/Backup /Volumes/Data/ios_backup 这行是你想要指定的目…