当前位置: 首页 > news >正文

【51单片机】矩阵按键快速上手

51单片机矩阵按键是一种在单片机应用系统中广泛使用的按键排列方式,特别适用于需要多个按键但I/O口资源有限的情况。以下是对51单片机矩阵按键的详细介绍:

一、矩阵按键的基本概念

  • 定义‌:矩阵按键,又称行列键盘,是用多条行线和列线交叉组成的键盘。在行线和列线的每个交叉点上设置一个按键,从而实现用较少的I/O口控制多个按键。
  • 优势‌:矩阵按键能够有效地提高单片机系统中I/O口的利用率。例如,一个4x4的矩阵键盘只需8个I/O口就可以实现16个按键的功能。

二、矩阵按键的工作原理

  • 行列扫描法‌:这是最常用的矩阵按键检测方法。首先,单片机通过程序控制将某一列线置为低电平,其余列线置为高电平,然后检测各行线是否有低电平信号。如果有,说明该行线与置为低电平的列线交叉点上的按键被按下。接着,轮流将各列线置为低电平,并检测各行线,直到找出被按下的按键。
  • 线翻转法‌:另一种检测方法是线翻转法。首先,将所有行线置为低电平,检测所有列线是否有低电平信号。如果有,记录列线值。然后,将所有列线置为低电平,检测所有行线的值。由于有按键按下,行线的值也会有变化,记录行线的值。通过这种方法,可以检测到所有被按下的按键。

三、矩阵按键的编程实现

  • 初始化‌:在程序中,首先需要初始化与矩阵键盘连接的I/O口,设置它们的初始状态。
  • 扫描与检测‌:然后,通过循环或中断的方式不断扫描矩阵键盘。在扫描过程中,根据行列扫描法或线翻转法的原理,检测按键是否被按下。
  • 消抖处理‌:由于机械按键在按下和松开时会产生抖动,因此需要在程序中加入消抖处理。常用的消抖方法有软件消抖和硬件消抖。在单片机应用中,软件消抖更为常见。
  • 按键功能实现‌:当检测到按键被按下时,根据按键的位置执行相应的功能。例如,在计算器程序中,按键的位置可能对应不同的数字或运算符。

四、矩阵按键的应用实例

  • 计算器‌:矩阵按键常用于计算器的键盘设计。通过4x4或更大规模的矩阵键盘,可以实现数字输入、运算符选择和功能键等操作。
  • 电子密码锁‌:在电子密码锁中,矩阵按键用于输入密码。用户可以通过按下矩阵键盘上的按键来输入数字或字母密码。
  • 游戏控制器‌:在一些简单的游戏控制器中,矩阵按键也常被用于实现方向键、功能键等操作。

 

 当我们按下某一个按键时,该按键对应的那一行和那一列的引脚为0,其他的引脚为1

硬件原理图

代码实现

 分别检测

#include "Int_MatrixKey.h"
#include <STC89C5xRC.H>u8 Int_MatrixKey_CheckKey()
{//    P24 P25 P26 P27// P20 +---+---+---+// P21 +---+---+---+// P22 +---+---+---+// P23 +---+---+---+// 扫描第一行,将P20置0,其余置1;P27-P20依次为:1111 1110P2 = 0xFE;// 检测第SW5是否被按下,若被按下,P24会被拉低,P27-P20依次为:1110 1110if (P2 == 0xEE) {Delay1ms(10);if (P2 == 0xEE) {while (P2 == 0xEE);return 5;}}// 检测第SW6是否被按下,若被按下,P25会被拉低,P27-P20依次为:1101 1110if (P2 == 0xDE) {Delay1ms(10);if (P2 == 0xDE) {while (P2 == 0xDE);return 6;}}// 检测第SW7是否被按下,若被按下,P26会被拉低,P27-P20依次为:1011 1110if (P2 == 0xBE) {Delay1ms(10);if (P2 == 0xBE) {while (P2 == 0xBE);return 7;}}// 检测第SW8是否被按下,若被按下,P28会被拉低,P27-P20依次为:0111 1110if (P2 == 0x7E) {Delay1ms(10);if (P2 == 0x7E) {while (P2 == 0x7E);return 8;}}// 扫描第二行,将P22置0,其余置1;P27-P20依次为:1111 1101P2 = 0xFD;// 检测第SW9是否被按下,若被按下,P24会被拉低,P27-P20依次为:1110 1101if (P2 == 0xED) {Delay1ms(10);if (P2 == 0xED) {while (P2 == 0xED);return 9;}}// 检测第SW10是否被按下,若被按下,P25会被拉低,P27-P20依次为:1101 1101if (P2 == 0xDD) {Delay1ms(10);if (P2 == 0xDD) {while (P2 == 0xDD);return 10;}}// 检测第SW11是否被按下,若被按下,P26会被拉低,P27-P20依次为:1011 1101if (P2 == 0xBD) {Delay1ms(10);if (P2 == 0xBD) {while (P2 == 0xBD);return 11;}}// 检测第SW12是否被按下,若被按下,P28会被拉低,P27-P20依次为:0111 1101if (P2 == 0x7D) {Delay1ms(10);if (P2 == 0x7D) {while (P2 == 0x7D);return 12;}}// 扫描第三行,将P22置0,其余置1;P27-P20依次为:1111 1011P2 = 0xFB;// 检测第SW13是否被按下,若被按下,P24会被拉低,P27-P20依次为:1110 1011if (P2 == 0xEB) {Delay1ms(10);if (P2 == 0xEB) {while (P2 == 0xEB);return 13;}}// 检测第SW14是否被按下,若被按下,P25会被拉低,P27-P20依次为:1101 1011if (P2 == 0xDB) {Delay1ms(10);if (P2 == 0xDB) {while (P2 == 0xDB);return 14;}}// 检测第SW15是否被按下,若被按下,P26会被拉低,P27-P20依次为:1011 1011if (P2 == 0xBB) {Delay1ms(10);if (P2 == 0xBB) {while (P2 == 0xBB);return 15;}}// 检测第SW16是否被按下,若被按下,P28会被拉低,P27-P20依次为:0111 1011if (P2 == 0x7B) {Delay1ms(10);if (P2 == 0x7B) {while (P2 == 0x7B);return 16;}}// 扫描第四行,将P23置0,其余置1;P27-P20依次为:1111 0111P2 = 0xF7;// 检测第SW17是否被按下,若被按下,P24会被拉低,P27-P20依次为:1110 0111if (P2 == 0xE7) {Delay1ms(10);if (P2 == 0xE7) {while (P2 == 0xE7);return 17;}}// 检测第SW18是否被按下,若被按下,P25会被拉低,P27-P20依次为:1101 0111if (P2 == 0xD7) {Delay1ms(10);if (P2 == 0xD7) {while (P2 == 0xD7);return 18;}}// 检测第SW19是否被按下,若被按下,P26会被拉低,P27-P20依次为:1011 0111if (P2 == 0xB7) {Delay1ms(10);if (P2 == 0xB7) {while (P2 == 0xB7);return 18;}}// 检测第SW20是否被按下,若被按下,P28会被拉低,P27-P20依次为:0111 0111if (P2 == 0x77) {Delay1ms(10);if (P2 == 0x77) {while (P2 == 0x77);return 20;}}return 0;
}

循环方式

u8 Int_KeyMatrix_CheckKey()
{u8 i, j;u8 lines[4]   = {0xFE, 0xFD, 0xFB, 0xF7};u8 columns[4] = {0x10, 0x20, 0x40, 0x80};for (i = 0; i < 4; i++) {P2 = lines[i];for (j = 0; j < 4; j++) {if ((P2 & columns[j]) == 0x00) {Com_Util_Delay1ms(10);if ((P2 & columns[j]) == 0x00) {while ((P2 & columns[j]) == 0x00);return 5 + j + 4 * i;}}}}return 0;
}

通过这个函数就可以获取到每个矩阵对应的数字了

int main(){u8 key;while(1){key = Int_KeyMatrix_CheckKey();if(key){//对应逻辑}}
}

相关文章:

【51单片机】矩阵按键快速上手

51单片机矩阵按键是一种在单片机应用系统中广泛使用的按键排列方式&#xff0c;特别适用于需要多个按键但I/O口资源有限的情况。以下是对51单片机矩阵按键的详细介绍&#xff1a; 一、矩阵按键的基本概念 ‌定义‌&#xff1a;矩阵按键&#xff0c;又称行列键盘&#xff0c;是…...

一文说清:git reset HEAD原理

1 使用add命令&#xff0c;将文件添加到暂存区 命令如下&#xff1a; 对比结果如下&#xff1a; 2 使用reset HEAD命令 如下&#xff1a; 结果对比如下&#xff1a; 忽略logs目录下的内容。 发现只是修改了index暂存区的内容。删掉了原来添加到暂存区的对象ID&#x…...

【前端面试题】书、定位问题、困难

看过什么书 《JavaScript 高级程序设计&#xff08;第 4 版&#xff09;》&#xff08;作者&#xff1a;Matt Frisbie&#xff09; 这是一本深入学习 JavaScript 语言的经典书籍。它详细地涵盖了 JavaScript 的高级特性&#xff0c;包括原型链、闭包、异步编程等复杂概念。以闭…...

WADesk 升级 Webpack5 一些技术细节认识5和4的区别在哪里

背景 升级过程中发现有很多新的知识点&#xff0c;虽然未来可能永远都不会再遇到&#xff0c;但是仍然是一次学习的好机会&#xff0c;可以让自己知道&#xff0c;打包软件的进化之路&#xff0c;和原来 Webpack 4 版本的差异在哪里。 移除的依赖记录 babel/register: 在 Nod…...

学习 Dockerfile 常用指令

学习 Dockerfile 常用指令 在构建 Docker 镜像时&#xff0c;Dockerfile 文件是一份至关重要的配置文件&#xff0c;它定义了构建镜像的所有步骤。通过在 Dockerfile 中使用不同的指令&#xff08;命令&#xff09;&#xff0c;我们可以控制镜像的构建过程、设置环境、指定执行…...

day11 性能测试(3)——Jmeter 断言+关联

【没有所谓的运气&#x1f36c;&#xff0c;只有绝对的努力✊】 目录 1、复习 2、查看结果树 多个http请求原因分析 3、作业 4、Jmeter断言 4.1 响应断言 4.1.1 案例 4.1.2 小结 4.2 json断言 4.2.1 案例 4.2.2 小结 4.3 断言持续时间 4.3.1 案例 4.3.2 小结 4.…...

ES6中的map和set

Map JS的数据对象&#xff08;Obejct&#xff09;&#xff0c;本质上是键值对的集合&#xff08;Hash结构&#xff09;&#xff0c;但是传统上只能用字符串当作键&#xff08;一定程度上对其的使用有限制&#xff09; 比如下面代码 const data {} const element document.…...

UE5中实现Billboard公告板渲染

公告板&#xff08;Billboard&#xff09;通常指永远面向摄像机的面片&#xff0c;游戏中许多技术都基于公告板&#xff0c;例如提示拾取图标、敌人血槽信息等&#xff0c;本文将使用UE5和材质节点制作一个公告板。 Gif效果&#xff1a; 网格效果&#xff1a; 1.思路 通过…...

泊松编辑 possion editing图像合成笔记

开源地址&#xff1a; GitHub - kono-dada/Reproduction-of-possion-image-editing 掩码必须是矩形框...

#渗透测试#漏洞挖掘#红蓝攻防#SRC漏洞挖掘

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

系列2:基于Centos-8.6Kubernetes 集成GPU资源信息

每日禅语 自省&#xff0c;就是自我反省、自我检查&#xff0c;自知己短&#xff0c;从而弥补短处、纠正过失。佛陀强调自觉觉他&#xff0c;强调以达到觉行圆满为修行的最高境界。要改正错误&#xff0c;除了虚心接受他人意见之外&#xff0c;还要不忘时时观照己身。自省自悟之…...

Coturn 实战指南:WebRTC 中的 NAT 穿透利器

1. 什么是 Coturn&#xff1f; Coturn 是一种开源的 TURN(Traversal Using Relays around NAT)服务器&#xff0c;用于解决 NAT 穿透问题。它帮助客户端在受限网络环境(例如防火墙或 NAT 后面)中实现双向通信&#xff0c;常用于 WebRTC 应用、VoIP、在线游戏等场景。 2. Cotur…...

基于卷积神经网络的Caser算法

将一段交互序列嵌入到一个以时间为纵轴的平面空间中形成“一张图”后&#xff0c;基于卷积序列嵌入的推荐&#xff08;Caser&#xff09;算法利用多个不同大小的卷积滤波器&#xff0c;来捕捉序列中物品间的点级&#xff08;point-level&#xff09;、联合的&#xff08;union-…...

自闭症在学校:了解自闭症的特点,优化学校教育方式

在教育的广阔天地里&#xff0c;每一片叶子都承载着生命的独特韵律&#xff0c;每一朵花都在以自己的方式绽放。然而&#xff0c;在特殊教育的花园里&#xff0c;有一群孩子&#xff0c;他们或许不那么容易被看见&#xff0c;不那么容易与世界沟通&#xff0c;但他们同样拥有学…...

多线程的知识总结(8):用 thread 类 或全局 async (...) 函数,创建新线程时,谁才是在新线程里第一个被执行的函数

&#xff08;40&#xff09;用 thread 类 或全局 async (…) 函数&#xff0c;创建新线程时&#xff0c;谁才是在新线程里第一个被执行的函数&#xff1f; 弄清楚这个问题&#xff0c;有利于推测和理解线程中代码的执行流程。根据 thread 类 和 async &#xff08;…&#xff0…...

ArcGIS地理空间平台manager存在任意文件读取漏洞

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

HarmonyOS Next 元服务新建到上架全流程

HarmonyOS Next 元服务新建到上架全流程 接上篇 这篇文章的主要目的是介绍元服务从新建到上家的完整流程 在AGC平台上新建一个项目 链接 一个项目可以多个应用 AGC新建一个元服务应用 新建一个本地元服务项目 如果成功在AGC平台上新建过元服务&#xff0c;那么这里会自动显…...

【Linux】makefile项目管理

前言 makefile是一种自动化构建工具&#xff0c;广泛用于管理和编译项目&#xff0c;特别是在C和C等语言中。它通过定义规则来控制源代码的编译、链接和清理等过程。以下是一个基本的Makefile结构和示例&#xff0c;帮助你理解如何管理项目&#xff1a; 首先&#xff1a;创建…...

Lumos学习王佩丰Excel第二十一讲:经典Excel动态图表实现原理

一、动态图表实现原理 1、理解图表中的数据系列 在Excel图表中&#xff0c;系列指的是图表中的数据集合&#xff0c;它通常代表着一个数据源。每个系列都可以包含多个数据点&#xff0c;这些数据点在图表中以特定的形式展现&#xff0c;如柱状图中的柱子&#xff0c;折线图中…...

Linux框架(二)——pinctrl和gpio子系统

基于设备树的 LED 驱动&#xff0c;但是驱动的本质还是没变&#xff0c;都是配置 LED 灯所使用的 GPIO 寄存器&#xff0c;驱动开发方式和裸机基本没啥区别。 Linux 内核提供了 pinctrl 和 gpio 子系统用于GPIO 驱动&#xff0c;本章我们就来学习一下如何借助 pinctrl 和 gpio…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...