深入解析:51单片机基础-矩阵按键

news/2025/11/11 19:56:25/文章来源:https://www.cnblogs.com/yxysuanfa/p/19211431

第八章 矩阵按键

1. 导入

在第七章中,我们学习了独立按键的使用,每个按键占用一个I/O口,当按键数量较多时会迅速消耗单片机资源。为解决此问题,本章引入矩阵按键(也称行列式按键),通过“行线+列线”组合识别多个按键,显著节省I/O口。

矩阵按键广泛应用于键盘、遥控器、控制面板等设备中。本章目标:


2. 硬件设计

2.1 矩阵按键结构

以最常见的4×4矩阵键盘为例,由4条行线(Row)和4条列线(Col)组成,共可连接16个按键。

Col0Col1Col2Col3
Row0K1K2K3K4
Row1K5K6K7K8
Row2K9K10K11K12
Row3K13K14K15K16

2.2 电路连接

  • 行线(Row0~Row3):接P1.0 ~ P1.3,配置为输出
  • 列线(Col0~Col3):接P1.4 ~ P1.7,配置为输入,需内部或外部上拉电阻;
  • 每个按键位于行线与列线交叉点,按下时导通。

实际连接示例:

  • P1.0 → Row0
  • P1.1 → Row1
  • P1.2 → Row2
  • P1.3 → Row3
  • P1.4 → Col0
  • P1.5 → Col1
  • P1.6 → Col2
  • P1.7 → Col3

注意:P1口有内部上拉,可直接使用;若使用P0口,需外加上拉电阻。


3. 软件设计

3.1 工作原理

矩阵按键识别采用扫描法,基本步骤如下:

  1. 所有行线输出高电平;
  2. 读取列线状态,若某列为低,说明有键按下;
  3. 进入识别阶段:逐行输出低电平,其余行高;
  4. 再读列线,根据哪一行拉低及哪一列读低,确定具体按键;
  5. 软件消抖并返回键值。

3.2 行扫描法实现

#include <reg52.h>// 定义行和列sbit ROW0 = P1^0;sbit ROW1 = P1^1;sbit ROW2 = P1^2;sbit ROW3 = P1^3;#define COL_PORT (P1 >> 4)  // 列线为P1.4~7,右移4位获取低4位// 按键延时void delay_ms(unsigned int ms) {unsigned int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 125; j++);}// 矩阵按键扫描函数,返回键值(1~16),0表示无按键unsigned char matrix_key_scan() {P1 = 0xF0;  // 行线输出高(P1.0~3=1),列线输入(P1.4~7上拉)if ((P1 & 0xF0) != 0xF0) {  // 列线有低电平,说明有键按下delay_ms(10);  // 消抖if ((P1 & 0xF0) != 0xF0) {// 开始逐行扫描P1 = 0xFE;  // Row0=0, Row1~3=1if ((P1 & 0xF0) != 0xF0) {switch (P1 & 0xF0) {case 0xE0: return 1;case 0xD0: return 2;case 0xB0: return 3;case 0x70: return 4;}}P1 = 0xFD;  // Row1=0if ((P1 & 0xF0) != 0xF0) {switch (P1 & 0xF0) {case 0xE0: return 5;case 0xD0: return 6;case 0xB0: return 7;case 0x70: return 8;}}P1 = 0xFB;  // Row2=0if ((P1 & 0xF0) != 0xF0) {switch (P1 & 0xF0) {case 0xE0: return 9;case 0xD0: return 10;case 0xB0: return 11;case 0x70: return 12;}}P1 = 0xF7;  // Row3=0if ((P1 & 0xF0) != 0xF0) {switch (P1 & 0xF0) {case 0xE0: return 13;case 0xD0: return 14;case 0xB0: return 15;case 0x70: return 16;}}}}return 0;  // 无按键}

3.3 键值映射优化

为便于使用,可定义键值数组:

unsigned char code key_table[4][4] = {
{1,  2,  3,  4},
{5,  6,  7,  8},
{9,  10, 11, 12},
{13, 14, 15, 16}
};

扫描时通过行列索引查表:

unsigned char matrix_key_scan_simple() {
unsigned char row, col;
// 设置行为输出,列为输入
P1 = 0xF0;
if ((P1 & 0xF0) != 0xF0) {
delay_ms(10);
if ((P1 & 0xF0) != 0xF0) {
// 扫描每一行
for (row = 0; row < 4; row++) {
P1 = (P1 & 0xF0) | (0x0F & ~(1 << row));  // 第row行输出0
col = (P1 >> 4) & 0x0F;  // 读取列
if (col != 0x0F) {
while((P1 >> 4) != 0x0F);  // 等待释放
return key_table[row][7 - col];  // 查表(需根据实际连接调整)
}
}
}
}
return 0;
}

实际中需根据硬件连接调整行列对应关系。


3.4 应用示例:按键控制数码管显示

目标:按下矩阵键1~9,数码管显示对应数字。

void main() {
unsigned char key;
unsigned char code seg_code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
while(1) {
key = matrix_key_scan();
if (key >= 1 && key <= 9) {
P0 = seg_code[key];        // 段码输出
P2 = 0x0E;                 // 选中第一位
delay_ms(5);
}
}
}

3.5 支持多按键识别(扩展)

上述方法仅支持单键识别。若需支持多键,需加入更复杂的逻辑或使用专用芯片。


3.6 编译与下载

若无响应:


##4. 小结

本章通过实现矩阵按键识别,掌握了高效输入系统的设计方法,主要内容包括:

4.1 常见问题与解决

问题原因解决方法
无法识别按键行列接反、方向错误检查I/O配置,确认输出/输入
误识别抖动未消除增加消抖延时或改进逻辑
只能识别部分键扫描顺序错误逐行测试,用万用表测量电平
重影未等待释放加入while等待松手
亮度闪烁扫描时间过长将按键扫描放入定时中断或优化循环

4.2 下一步学习建议

本章标志着你已掌握高效的多键输入技术,下一章将进入定时器/计数器模块的深入学习,实现精准延时与中断控制。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/962683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gmssl 国密标准下载

https://www.gmssl.cn/gmssl/index.jsp

没有路由器的情况下如何通过电脑网口连接开发板

没有路由器的情况下如何通过电脑网口连接开发板当我们的板子不带无线网卡,或者没有路由器的情况,直接一根网线连接,然后ssh就可以了

重启 MariaDB 数据库服务

1.重启 MariaDB 数据库服务:systemctl restart mariadb.servicesystemctl:系统控制工具,用于管理systemd系统和服务restart:操作指令,先停止服务再启动服务mariadb.service: 服务名称,MariaDB数据库服务的标识等…

重练算法(代码随想录版) day 7 -哈希表part2

今日刷题量:3 当前刷题总量:36 Easy: 20 Mid: 15 Hard: 1 Day 7 解题思想 1.对于数组独立,求是否满足目标target,不用考虑重复问题,可以简单采用哈希解法,如454 2.但是对于15、18要求在一个数组中找到目标target…

团队作业2——《需求规格说明书》

一、作业基本信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/1348…

gmssl常用命令 - 需要持续更新

1. 生成私钥 OpenSSL (RSA) # 生成RSA私钥 openssl genrsa -out private_key.key 2048 # 生成RSA私钥(带密码) openssl genrsa -out private_key.key -aes256 -passout pass:password 2048GMSSL (SM2) # 生成SM2私钥…

实用指南:根据用户行为数据中的判断列表在 Elasticsearch 中训练 LTR 模型

实用指南:根据用户行为数据中的判断列表在 Elasticsearch 中训练 LTR 模型pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-famil…

转转客服IM聊天系统背后的技术挑战和实践分享

转转客服IM聊天系统背后的技术挑战和实践分享在当今互联网时代,高效的用户服务是提升用户体验的关键。转转自研的客服IM聊天系统作为用户与客服沟通的桥梁,承担着传递信息、解决问题的关键角色。然而,消息数据的流转…

英语_阅读_Computers_待读

The development of computers has been one of the most important advances in modern history. 计算机的发展是现代历史上最重要的进步之一。 Early computers were huge machines that took up entire rooms. 早期…

202511.11 - A

今天上了工程实训和英语,学期已过半,着手准备期末,加油

AT_arc160_c [ARC160C] Power Up

典,做过一遍就会了。 考虑设 \(f_{i, j}\) 表示从小到大到了\(i\),目前能够有 \(j\) 个数为 \(i\) 的不同集合方案数,转移写个前缀和可以简单做到 \(O(n^2)\)。 优化的契机就在于,这个合并的过程是指数级增长的,每…

英语_阅读_Life in cities_待读

Life in cities has changed remarkably over the decades. 几十年来,城市生活发生了显著的变化。 In the past, urban areas were crowded with people and busy markets, making them incredibly lively but somewh…

实验 5:ViT Swin Transformer

软件工程原理与实践(实验五)姓名: 学号: 姓名和学号课程 中国海洋大学 25 秋《软件工程原理与实践》实验名称 实验 5:ViT & Swin Transformer博客链接一、实验内容 1.1 Vision TransformerViT 网络详解 使用…

一个强大的排序工具

有人want to sort a 20GB binary file that contains 30-byte key and 20 byte value placed in a contiguous manner,stackoverflow上的最高赞回答是hexdump, sort再xxd转回来〔链接〕。 有明白人指出这样需要越70G的…

数据采集_2

数据采集_2目录第一题:爬取天气预报核心代码与运行结果:心得体会:第二题:爬取股票信息核心代码与运行结果:心得体会:第三题:爬取软科所有院校信息核心代码与运行结果:心得体会: 第一题:爬取天气预报 核心代码与运行结果…

chatTTS源码版本地部署踩的坑

打包版直接下载release版本后解压点击app.exe运行即可,首次会下载模型,时间会比较久一些,下载完成后就自动打开网站了,没啥难点,讲一下源码部署, 首先在github下载源码:https://github.com/jianchang512/ChatTT…

第一讲机器学习基础

第一讲机器学习基础 1.机器学习≈找一个函数 2.深度学习就是用类神经网络制造函数-->输入可以是:向量、矩阵、序列(语音、文本) 输出可以是:数值(回归任务)、类别(分类)、文本图片 3.机器学习方法 (1)sup…

Linux服务器编程实践20-TCP服务 vs UDP服务:核心差异对比 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

第二十八天

一、核心知识点梳理 1. 图的定义与本质:由顶点(Vertex)和边(Edge)组成的非线性数据结构,用于描述多对多的关联关系(区别于树的父子层级关系)。 2. 关键概念区分:有向图(边带方向,如社交软件的关注关系) vs…

当世人 逐渐将英雄遗忘 我最终展露了疯狂 与烧灼许久的欲望 已无人描绘 我的画像

test37没有大样例。小样例无法复制。没有部分分。题解几句话。证明留作作业。就给个std。三道图论。四题都是问最小代价。交换来的。均分纸牌 猜测上界是 \(n-1\),所以现在希望每个间隔是经过一次,因为间隔左右的和是…