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

普中51单片机学习笔记-矩阵按键

目录

写在前面

矩阵键盘扫描方法对比

按键消抖处理

硬件电路

示例代码


写在前面

矩阵键盘采用行列交叉的结构。按键位于行线和列线的交叉点上:

  • 4×4矩阵键盘:由4根行线和4根列线交叉构成,形成16个按键。

  • 减少I/O占用:16个按键仅需8个I/O口,远少于独立按键。

矩阵键盘扫描方法对比

方法原理优点缺点适用场景
逐行扫描法每次将一行拉低,读取列线状态逻辑直观,易于理解代码较长,CPU利用率低初学者学习,实时性要求不高的系统
行列扫描法先所有列输出低电平读行线,再所有行输出低电平读列线代码简洁,执行效率高逻辑相对复杂实际项目,需要高效扫描的场合

按键消抖处理

按键在按下和释放时会产生机械抖动,导致电平不稳定。处理方法:

  • 软件消抖:检测到按键按下后延时10-20ms,再次检测确认。

  • 硬件消抖(可选):在按键两端并联0.1μF电容。

硬件电路

示例代码

#include <reg51.h>// ================================
// 硬件端口宏定义
// ================================// 数码管显示端口定义
#define SMG_PORT P0  // 数码管数据线连接的端口// 矩阵键盘端口定义  
#define KEY_PORT P1  // 矩阵键盘连接的端口// ================================
// 数码管显示编码(共阴)
// ================================
unsigned char code seg_table[16] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,  // 0-70x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71   // 8-15 (A-F)
};// ================================
// 延时函数
// ================================
void delay_ms(unsigned int ms)
{unsigned int i, j;for(i = 0; i < ms; i++)for(j = 0; j < 123; j++);
}// ================================
// 键盘扫描函数
// ================================
unsigned char key_scan()
{unsigned char x, y, key_value = 0;// 第一步:所有列输出低电平,行作为输入KEY_PORT = 0xF0;  // 列输出0,行输入1if(KEY_PORT != 0xF0){  delay_ms(10);  // 延时消抖if(KEY_PORT != 0xF0){x = KEY_PORT & 0xF0;  // 保存行状态// 第二步:所有行输出低电平,列作为输入KEY_PORT = 0x0F;  // 行输出0,列输入1y = KEY_PORT & 0x0F;  // 保存列状态// 组合行和列状态确定键值switch(x | y){case 0xEE: key_value = 1; break;   // 第0行第0列case 0xDE: key_value = 2; break;   // 第0行第1列case 0xBE: key_value = 3; break;   // 第0行第2列case 0x7E: key_value = 4; break;   // 第0行第3列case 0xED: key_value = 5; break;   // 第1行第0列case 0xDD: key_value = 6; break;   // 第1行第1列case 0xBD: key_value = 7; break;   // 第1行第2列case 0x7D: key_value = 8; break;   // 第1行第3列case 0xEB: key_value = 9; break;   // 第2行第0列case 0xDB: key_value = 10; break;  // 第2行第1列case 0xBB: key_value = 11; break;  // 第2行第2列case 0x7B: key_value = 12; break;  // 第2行第3列case 0xE7: key_value = 13; break;  // 第3行第0列case 0xD7: key_value = 14; break;  // 第3行第1列case 0xB7: key_value = 15; break;  // 第3行第2列case 0x77: key_value = 16; break;  // 第3行第3列default: key_value = 0;  // 无效按键break;}if(key_value != 0) {// 等待按键释放,增加消抖delay_ms(10);while((KEY_PORT & 0x0F) != 0x0F) {delay_ms(1);  // 短延时避免忙等待}delay_ms(10);  // 释放消抖}}}return key_value;
}// ================================
// 主函数
// ================================
void main()
{unsigned char key_val;// 系统初始化SMG_PORT = 0x00;   // 数码管初始不显示KEY_PORT = 0xFF;   // 键盘端口初始化为高电平while(1){key_val = key_scan();if(key_val != 0){// 在数码管上显示按键编号(1-16对应0-F)SMG_PORT = seg_table[key_val - 1];// 添加响应延时,避免重复检测delay_ms(200);}}
}

完结,撒花~

http://www.dtcms.com/a/605330.html

相关文章:

  • 视觉语言模型新突破!开源项目解读
  • 深圳南山区住房和建设局网站官网天天向上做图网站
  • 微算法科技(NASDAQ MLGO)通过容量证明(PoC)构建全球存储资源池,为Web3应用提供低成本、抗审查的数据存储服务
  • 08-微服务原理篇(Canal-Redis)
  • 填写网站备案信息深圳建设材料价格网站
  • 【Spring Boot 报错已解决】Spring Boot开发避坑指南:Hibernate实体类主键配置详解与异常修复
  • 【CSS】cursor: auto, default, none 有什么区别?
  • 网站备案负责人三网合一营销型全网站
  • 7.2 Dify核心功能与技术架构:前后端分离、API接口、数据存储
  • 观察Springboot AI-Function Tools 执行过程
  • 信贷风控建设的多维意义解析
  • 如何在产品已上线后发现需求遗漏进行补救
  • 重卡充电桩平台支持针对不同车队单独配置计费规则
  • 美丽寮步网站建设高性能广州公关公司有哪些
  • Linux告别搜索卡顿:解决“Argument list too long”与实现文件内容秒搜
  • .NET驾驭Excel之力:工作簿与工作表操作基础
  • 基于 C++ OpenCV 生成小视频
  • 个人网站审批网站防止采集
  • 5.6 Multiple region interfaces
  • 聊聊缓存测试用例设计方案
  • IU5516T低功耗,1M@2.0A降压稳压器
  • Arbess从初级到进阶(3) - 使用Arbess+GitLab+SonarQube搭建Java项目自动化部署
  • 外贸的网站有哪些网站开发心得体会
  • Spring Boot参数校验全流程解析
  • C++进阶:(十)深度解析哈希表:原理、实现与实战
  • 6.3 代码自动生成Agent:程序员的AI副驾驶
  • 最好的网站开发系统网站设计介绍怎么写
  • 如何丰富网站内容在本地搭建wordpress
  • MySQL: 存储引擎深度解析:Memory与Federated的特性与应用场景
  • Java+Leaflet:湖南省道路长度WebGIS的构建与实践