【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,一经查实,立即删除!

相关文章

U盘/移动硬盘安装插拔式Ubuntu系统,并将Docker目录挂载到NTFS硬盘

Windows10的WSL2的确给开发人员带来了很多方便&#xff0c;但是仍然有很多缺点。比如&#xff1a;太占系统内存&#xff1b;有些软件无法在WSL2中编译成功&#xff1b;相当于虚拟机&#xff0c;性能不如原装系统。 装双系统&#xff0c;相信大家都不陌生&#xff0c;但它会占用…

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

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

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

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

什么是封装?为什么要封装?

什么是封装&#xff1f; 封装是计算机科学中的一个重要概念&#xff0c;尤其在面向对象编程&#xff08;OOP&#xff09;中占据核心地位。封装主要指的是将数据&#xff08;属性&#xff09;和对这些数据的操作&#xff08;方法&#xff09;组合在一个单元中&#xff08;我们称…

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

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

Android中常见的线程池

日常开发中我们常常使用到线程池&#xff0c;其能有效管理线程资源&#xff0c;避免过多线程导致系统资源浪费、又能复用线程资源&#xff0c;避免频繁的创建/销毁线程。在Android中线程池的实现为ThreadPoolExecutor类&#xff0c;本文主要记录该类相关的知识点。 线程池的六…

详述Python环境下配置AI大模型Qwen-72B的步骤

随着人工智能技术的发展&#xff0c;大规模预训练模型如Qwen-72B等逐渐成为研究和应用的重点。本篇博客旨在提供一份详细的指南&#xff0c;帮助Python开发者们在自己的环境中顺利配置并使用Qwen-72B大模型。 请注意&#xff1a;由于Qwen-72B这一模型目前并未公开存在&#xf…

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

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

【面试系列】网络工程师 高频面试题及详细解答

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

如何深刻理解Redis的底层原理?Redis的运行机制是什么?如何优化Redis提供更高效服务

要深刻理解Redis的底层原理和运行机制&#xff0c;可以从以下几个方面入手&#xff1a; 1. 单线程模型&#xff1a;Redis采用单线程模型&#xff0c;所有的操作都在同一个线程中执行。这种设计可以减少线程切换带来的开销&#xff0c;从而提高性能 。 2. 虽然Redis是单线程的&…

Python日志库logging

日志级别 级别对应的数值: NOTSET&#xff08;0&#xff09;、DEBUG&#xff08;10&#xff09;、INFO&#xff08;20&#xff09;、WARNING&#xff08;30&#xff09;、ERROR&#xff08;40&#xff09;、CRITICAL&#xff08;50&#xff09; INFO、WARNING、ERROR、CRITICA…

华为---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 是一个用于录…

驱动保险业高质量发展 金融壹账通“保险+科技”输出“数字化红利

近日&#xff0c;金融监管总局局长李云泽在陆家嘴论坛指出&#xff0c;将推动保险业坚持内涵式发展、特色化经营和精细化管理&#xff0c;加快由追求速度和规模&#xff0c;向以价值和效益为中心转变&#xff1b;引导保险机构树立正确的经营观、业绩观、风险观&#xff0c;完善…

出现 ORA-00923: FROM keyword not found where expected 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 服务驱动的时候,一开始弹出这个Bug,找了很久才找到问题所在 2024-06-25 18:39:13.809 | ERROR 1926765 | Druid-ConnectionPool-Create-1203111075

pbootcms提交留言成功后跳转到指定的网址

pbootcms在线留言表单提交成功后&#xff0c;如何跳转到指定的网址&#xff0c;默认提交留言后留在原来的页面&#xff0c;如果提交后需要跳转到指定网址&#xff0c;我们需要对文件进行修改。首先我们打开/core-/function/helper.php文件找到第162行左右代码&#xff1a; ech…

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

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

JavaScript小记_如何获取对象的属性?

1. 什么是对象? 多个数据的封装体用来保存多个数据的容器一个对象代表现实中的一个事物 2. 对象的组成 属性: 属性名(字符串)和属性值(任意)组成方法: 一种特别的属性(属性值是函数) 3. 如何访问对象内部数据? .属性名: 编码简单, 属性名由特殊符号组成时不能用[属性名]…