【51单片机入门】矩阵键盘

文章目录

  • 前言
  • 矩阵键盘介绍与检测原理
  • 原理图
  • 代码讲解
  • 总结


前言

在嵌入式系统设计中,键盘输入是一种常见的人机交互方式。其中,矩阵键盘因其简单、方便和易于扩展的特性,被广泛应用于各种设备中。本文将介绍如何使用51单片机来实现矩阵键盘的设计,包括硬件连接、键盘扫描算法以及按键处理等内容。希望通过本文的学习,读者能够掌握矩阵键盘的基本原理和设计方法,为自己的项目提供强大的输入功能。


矩阵键盘介绍与检测原理

矩阵键盘是一种常见的输入设备,它由多个按键组成,通常是以矩阵的形式排列。每个按键都有一个唯一的行和列位置,通过检测行和列的电平变化来确定按下的是哪个按键。

在嵌入式系统设计中,矩阵键盘是一种常见的人机交互方式。矩阵键盘的本质是使用8个IO口来进行16个按键的控制读取,可以减小IO口的使用。它用4条I/O线作为行线,4条I/O线作为列线组成的键盘。在行线和列线的每个交叉点上,设置一个按键。这样键盘中按键的个数是4×4个。这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。

其工作原理是:先从P1口的高四位(四个行)输出高电平,低四位(四个列)输出低电平,假设有按键按下,从P1口的高四位读取键盘状态。判断高四位的四行哪一行变成了低电平,就知道是第几行,再从P1口的低四位(四个列)输出高电平,高四位(四个行)输出低电平,从P1口的低四位读取键盘状态。判断低四位的四列哪一行变成了低电平,就知道是第几列,将两次读取结果组合起来就可以得到当前按键的特征编码。

矩阵键盘通常用于嵌入式系统中,例如家用电器、手机、计算器等设备。希望这个介绍能帮助你更好地理解矩阵键盘的工作原理和应用。

比如下面的这个也是矩阵键盘:
在这里插入图片描述

原理图

矩阵键盘的元件名称:KEY-PAD-PHONE
在这里插入图片描述

在这里插入图片描述

代码讲解

总体代码如下所示:

#include <REGX51.H>// ????????
#define KEYPAD_ROW P1
#define KEYPAD_COL P3void delay(unsigned int ms) {unsigned int i, j;for(i = ms; i > 0; i--)for(j = 120; j > 0; j--);
}// ??????
char keys[4][3] = {{'1', '2', '3'},{'4', '5', '6'},{'7', '8', '9'},{'*', '0', '#'}
};// ????
char scan_keypad(void);void main() {char key;while(1) {key = scan_keypad();  // ????????if(key != 0xFF) {     // ????????// ?????????????????// ??:?????????LCD??}}
}char scan_keypad(void) {int row, col;KEYPAD_COL = 0xFF;for(row = 0; row < 4; row++) {KEYPAD_ROW = ~(1 << row);for(col = 0; col < 3; col++) {if(!(KEYPAD_COL & (1 << col))) {while(!(KEYPAD_COL & (1 << (col))));return keys[row][col];}}}return 0xFF;
}

这段代码的实现基于矩阵键盘的工作原理。矩阵键盘是由行和列组成的,每个按键位于特定的行和列的交叉点。当某个按键被按下时,对应的行和列就会被连接起来。

在这段代码中,我们首先将所有的行设置为输出,并将所有的列设置为输入。然后,我们逐行扫描键盘:将当前行设置为低电平,其他行保持高电平。然后读取所有的列,如果某一列的电平为低,那么就说明当前行的这一列的按键被按下。

这样,我们就可以通过行号和列号确定哪个按键被按下。在代码中,我们使用一个二维数组keys来存储每个按键的值,通过行号和列号就可以从数组中取出对应的按键值。

核心代码:

char scan_keypad(void) {int row, col;KEYPAD_COL = 0xFF;for(row = 0; row < 4; row++) {KEYPAD_ROW = ~(1 << row);for(col = 0; col < 3; col++) {if(!(KEYPAD_COL & (1 << col))) {while(!(KEYPAD_COL & (1 << (col))));return keys[row][col];}}}return 0xFF;
}

这段代码的主要目标是扫描矩阵键盘并返回被按下的键。下面是这段代码的二进制解释:

  1. KEYPAD_COL = 0xFF;:这行代码将所有列设置为输入。在二进制中,0xFF表示1111 1111,这意味着所有的列线都被设置为高电平。

  2. KEYPAD_ROW = ~(1 << row);:这行代码将当前行设置为低电平,其他行保持高电平。1 << row将1向左移动row位,然后~操作符取反。例如,如果row为2,那么1 << row就是0000 0100,取反后就变成1111 1011,这就将第2行设置为低电平,其他行保持高电平。

  3. !(KEYPAD_COL & (1 << col))这段代码我们通过下面二进制解释:

===没有按下
col = 0
1 << col =>0000,0001
1111,1111
0000,0001
&
0000,0001
!
1111,1110===按下
col = 0
1 << col =>0000,0001
1111,1110
0000,0000
&
0000,0000
!
1111,1111
  1. return keys[row][col];:这行代码返回被按下的键的值。keys是一个二维数组,存储了每个按键的值,通过行号和列号就可以从数组中取出对应的按键值。

  2. return 0xFF;:如果没有按键被按下,那么函数就返回0xFF。在二进制中,0xFF表示1111 1111


总结

通过本文的学习,我们了解了矩阵键盘的工作原理,学习了如何使用51单片机实现矩阵键盘的硬件连接和软件设计。我们还探讨了一些常见的问题,如按键抖动和多键按下的处理。希望这些知识能够帮助你在实际的项目中更好地使用矩阵键盘。记住,理论知识的学习是重要的,但实践才能使理论知识得以应用。因此,我鼓励你动手实践,尝试设计和制作自己的矩阵键盘,通过实践来提高自己的技能和理解。

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

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

相关文章

若依 ruoyi 分离版 vue 简单的行内编辑实现

需要实现的效果&#xff1a;双击文本 - 修改文本 - 保存修改。 原码&#xff1a;仅文本显示文字内容 <el-table-column label"商品" align"center" prop"goodsName" width"200" v-if"columns[1].visible" /> 实现…

气膜仓库的优势与应用—轻空间

随着现代物流和存储需求的不断增长&#xff0c;传统仓库的建设和运营成本日益增加&#xff0c;企业需要寻找更加灵活、高效和经济的解决方案。在这种背景下&#xff0c;气膜仓库作为一种新型仓储形式&#xff0c;以其独特的优势和广泛的应用前景&#xff0c;逐渐受到市场的青睐…

打开数据结构的大门——顺序表详解

前言&#xff1a; 小编在近日刚开始学顺序表&#xff0c;为了巩固学习&#xff0c;小编先写一篇关于顺序表的文章来加强记忆&#xff0c;写完这一篇我将继续书写C语言相关的文章&#xff0c;那么废话不多说&#xff0c;下面小编将打开数据结构的大门&#xff01;顺序表来喽&…

视频监控业务平台LntonCVS国标视频综合管理平台功能及技术优势

随着安防行业的快速进步&#xff0c;传统的视频监控平台正在与先进的技术和互联网技术融合&#xff0c;包括5G通信、GIS、大数据、云计算、边缘计算、AI识别、智能分析和视频直播等。这些技术的整合形成了综合性视频监控管理平台&#xff0c;具备集中管理、多级联网共享、互联互…

华为---OSPF的DR与BDR(六)

9.6 OSPF的DR与BDR 9.6.1 原理概述 在OSPF的广播类型网络和NBMA类型网络中&#xff0c;如果网络中有n台路由器&#xff0c;若任意两台路由器之间都要建立邻接关系&#xff0c;则需要建立n(n-1)/2个邻接关系&#xff0c;即当路由器很多时&#xff0c;则需要建立和维护的邻接关…

6.优化算法之模拟

1.替换所有的问号 . - 力扣&#xff08;LeetCode&#xff09; class Solution {public String modifyString(String s) {char[] sss.toCharArray();int nss.length;for(int i0;i<n;i){if(ss[i]?){for(char cha;ch<z;ch){if((i0||ss[i-1]!ch)&&(in-1||ss[i1]!c…

Processing入门教程

目录&#xff1a; 课程前言认识PROCESSING 关于像素图形代码色彩与填充练习交互关于setup()和draw()第一次进行移动进一步复杂的交互操作代码实现如下&#xff1a;进一步了解PROCESSING 变量使用变量系统内置变量条件语句逻辑运算符循环语句while循环for循环结构化 函数实参对…

Selenium IDE 的使用指南

Selenium IDE 的使用指南 在自动化测试的领域中&#xff0c;Selenium 是一个广为人知且强大的工具集。而 Selenium IDE 作为其中的一个组件&#xff0c;为测试人员提供了一种便捷且直观的方式来创建和执行自动化测试脚本。 一、Selenium IDE 简介 Selenium IDE 是一个用于录…

基于STM32的简易智能家居设计

一、项目功能概述 1、OLED显示温湿度、空气质量&#xff0c;并可以设置报警阈值 2、设置4个继电器开关&#xff0c;分别控制灯、空调、开关、风扇 3、设计一个离线语音识别系统&#xff0c;可以语音控制打开指定开关、并且可以显示识别命令词到OLED屏上 4、OLED实时显示&#…

ASUS/华硕幻14 2023 GA402X系列 原厂Windows11-22H2系统

安装后恢复到您开箱的体验界面&#xff0c;带原机所有驱动和软件&#xff0c;包括myasus mcafee office 奥创等。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http:…

Camera Raw:编辑 - 曲线

Camera Raw “编辑”模块中的曲线 Curve面板提供了曲线这一强大的工具&#xff0c;通过精确控制亮度和对比度&#xff0c;以及调整红、绿、蓝通道的曲线&#xff0c;可以显著提升图像的视觉效果和色彩表现。这些调整工具为摄影师和图像编辑者提供了丰富的创意可能性&#xff0c…

热管的制作工艺流程

1、什么是热管&#xff0c;热管的起源和发展 热管技术早在1942年前就已出现&#xff0c;当时Perkins发明并改进了热虹吸管&#xff08;一种简单的重力热管&#xff09;。1942年后&#xff0c;Gaugler提出了现代热管的原理&#xff0c;但未实际应用。直到1963年在位于美国的Los…

【AI提升】AI利器Tool Call/Function Call(一):langchain+ollama+llama3/qwen2

1、使用AI的一个常用场景就是&#xff0c;接收人类的语言&#xff0c;识别人类的意图&#xff0c;最终进行相关的业务处理&#xff0c;这就是设计Tool Call / Function Call的初衷。 2、现在一般都说Tool Call&#xff0c;以前常叫Function Call&#xff0c;不要纠结。 一、安…

2-19 基于matlab的薄板弯曲的算例

基于matlab的薄板弯曲的算例&#xff0c;利用有限元方法编制matlab程序。对二维薄板进行单元化&#xff0c;输出薄板结构参数及载荷&#xff0c;输出弯曲情况&#xff0c;并可视化展示。程序已调通&#xff0c;可直接运行。 2-19 薄板弯曲 有限元方法 薄板结构参数 - 小红书 (x…

福昕阅读器再打开PDF文件时,总是单页显示,如何设置打开后就自动显示单页连续的模式呢

希望默认进入连续模式 设置方法 参考链接 如何设置使福昕阅读器每次启动时不是阅读模式 每次启动后都要退出阅读模式 麻烦_百度知道 (baidu.com)https://zhidao.baidu.com/question/346796551.html#:~:text%E5%9C%A8%E3%80%90%E5%B7%A5%E5%85%B7%E3%80%91%E9%87%8C%E6%9C%89%E…

等保测评练习卷14

等级保护初级测评师试题14 姓名&#xff1a; 成绩&#xff1a; 判断题&#xff08;10110分&#xff09; 1. 方案编制活动中测评对象确定、测评指…

Python学习笔记五

1.当循环执行完整后&#xff0c;就会执行else里面的代码 s0 i1 while i<100:sii1 else:print(s) 当循环不完整就会如下 s0 i1 while i<100:sii1if s6:break; else:print(s) 2. 实现密码匹配&#xff0c;可以输入三次&#xff0c;若输入三次错误会退出&#xff0c;或者输…

界面组件DevExpress WinForms v24.1 - 支持DateOnly TimeOnly类型

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…

1976 ssm 营地管理系统开发mysql数据库web结构java编程计算机网页源码Myeclipse项目

一、源码特点 ssm 营地管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开…

Pycharm一些问题解决办法

研究生期间遇到关于Pycharm一些问题报错以及解决办法的汇总 ModuleNotFoundError: No module named sklearn’ 安装机器学习库&#xff0c;需要注意报错的sklearn是scikit-learn缩写。 pip install scikit-learnPyCharm 导包提示 unresolved reference 描述&#xff1a;模块…