51单片机矩阵键盘

 矩阵键盘

矩阵键盘是一种常用于电子设备中的输入设备,其原理是利用行和列的交叉点来识别按键输入。矩阵键盘通常由多个按键排列成行和列的形式组成,通过按下某个按键可以在对应的行和列交叉点上产生电路连接。

在矩阵键盘中,每个按键都被安排在一个矩阵的交叉点上,按下某个按键会使得对应行和列之间的电路连接。因此,通过扫描矩阵键盘的每一行和列,可以检测到哪个按键被按下。这种扫描过程可以通过微处理器或控制器来完成,一旦检测到按键输入,就可以进行相应的操作或数据采集。

总的来说,矩阵键盘的原理是基于行和列的交叉点上的电路连接来识别按键输入,通过扫描矩阵键盘的行和列可以检测到按键的输入,从而实现数据输入和控制操作。

按钮的工作原理

51单片机上矩阵键盘的原理图

矩阵键盘使用的是并行的IO口,独立键盘使用的是单个的IO口

读取通过的电压:当按键按下的IO口会的电平会被拉低,当检测到电压为0V的时候判断键盘被按下,当我们的手松开的时候检测键盘没有按下电平回到5V。

按键的抖动问题:需要在段选的后面加延时

eg1:按单片机第一个按键实现数字自加效果,按第二个按键的时候实现数字自减效果

#include <REGX52.H>
#include "main.h"
#include <INTRINS.H>
#define unit unsigned int
#define uchar unsigned char 
sbit  beep = P2^3;
sbit wei  = P2^7; 		// 位选择器
sbit duan = P2^6;     // 段选择器
sbit key_S2 = P3^0;   // P30的IO口独立按键S2
sbit key_S3 = P3^1;   // 第二个独立按键
uchar number;
//数组的定义
unsigned char code leddata[]={ 0x3F,  //"0"0x06,  //"1"0x5B,  //"2"0x4F,  //"3"0x66,  //"4"0x6D,  //"5"0x7D,  //"6"0x07,  //"7"0x7F,  //"8"0x6F,  //"9"0x00  //自定义};
// 功能函数
void diaplay(uchar i){uchar bai,shi,ge;// 计算个位10位和百位bai = i / 100; // 211 /100 = 2shi = i % 100 / 10; // 211 % 100 / 10 = 1;ge  = i % 10; // 211 % 10				
}
void main(){// 打开位锁存器wei = 1;P0 = 0xFE; // 高电平的16进制位0x06//关闭位锁存器wei = 0;while(1){				if(key_S2 == 0){Delay(20);	// 按键抖动的消除if(key_S2 == 0){number++;if(number == 10){number = 0;duan = 1;P0 = leddata[number]; duan = 0;}// 添加松手检测while(!key_S2){}}		}// 按独立按键相减的代码if(key_S3 == 0){Delay(20);	// 按键抖动的消除if(key_S3 == 0){if(number > 0){number--;}while(!key_S3);}		}//松手之后刷新显示duan = 1;P0 = leddata[number]; duan = 0; // 锁存段选数据				}
}

矩阵键盘的识别

矩阵键盘与独立键盘的识别和扫描

矩阵键盘二进制取值原理图

eg2:矩阵键盘扫描的实现

#include <REGX52.H>
#include "main.h"
#include <INTRINS.H>
#define unit unsigned int
#define uchar unsigned char 
sbit wei  = P2^7; 		// 位选择器
sbit duan = P2^6;     // 段选择器
uchar number;
uchar KeyValue;unsigned char code leddata[]={          0x3F,  //"0"0x06,  //"1"0x5B,  //"2"0x4F,  //"3"0x66,  //"4"0x6D,  //"5"0x7D,  //"6"0x07,  //"7"0x7F,  //"8"0x6F,  //"9"0x77,  //"A"0x7C,  //"B"0x39,  //"C"0x5E,  //"D"0x79,  //"E"0x71,  //"F"0x76,  //"H"0x38,  //"L"0x37,  //"n"0x3E,  //"u"0x73,  //"P"0x5C,  //"o"0x40,  //"-"0x00,  //熄灭0x00  //自定义          };
// 键盘的列扫描
void ketScan(){/*4*4键盘的扫描*/P3 = 0xF0;if(P3 != 0xF0){ // 判断键盘是否被按下Delay(10);  // 软件消除抖动if(P3 != 0xF0){ // 列扫描switch(P3){case 0xE0:KeyValue = 0; // 表示的是第一列被按下break;case 0xD0:KeyValue = 1; // 表示的是第二例被按下break;case 0xB0:KeyValue = 2; // 表示的是第三列被按下break;case 0x70:KeyValue = 3; // 表示的是第四列被按下break;		 }P3 = 0X0f;// 行扫描switch(P3){case 0x0e:KeyValue = KeyValue; // 表示的是第一行被按下break;case 0x0D:KeyValue = KeyValue + 4; //  表示的是第二行被按下break;case 0x0b:KeyValue = KeyValue + 8; // 表示的是第三行被按下break;case 0x07:KeyValue = KeyValue + 12; // 表示的是第四行被按下break;		 }// 松手检测while(P3 != 0X0f){}}		 }// 独立按键键盘的扫描P3 = 0XFF;if(P3 != 0xff){Delay(10); // 软件消抖switch(P3){case 0xfe:KeyValue = 16; // 表示的是S2被按下break;case 0xfD:KeyValue = 17; //  表示的是S3被按下break;case 0xfb:KeyValue = 18; // 表示的是S4被按下break;case 0xf7:KeyValue = 19; // 表示的是S5被按下break;		 }while(P3 != 0xff); // 默认会回到最后的值}}
void main(){// 打开位锁存器wei = 1;// 高电平的16进制位0x06P0 = 0xFE; //关闭位锁存器wei = 0;while(1){ketScan(); // 调用键盘扫描函数duan = 1;P0 = leddata[KeyValue]; // 显示按键的值duan = 0;}}

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

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

相关文章

【Linux】常见指令解析下

目录 前言1. cp指令&#xff08;重要&#xff09;2. mv指令 &#xff08;重要&#xff09;3. cat指令4. more指令5. less指令 &#xff08;重要&#xff09;6. head指令7. tail指令8. 时间相关的指令8.1 data显示8.2 时间戳 9. cal指令10. find指令&#xff08;非常重要&#x…

每日一练【最大连续1的个数】

一、题目描述 给定一个二进制数组 nums 和一个整数 k&#xff0c;如果可以翻转最多 k 个 0 &#xff0c;则返回 数组中连续 1 的最大个数 。 二、题目解析 本题同样是利用滑动窗口的解法。 首先进入窗口&#xff0c;如果是1&#xff0c;就直接让right&#xff0c;但是如果是…

会话跟踪技术(cookiesession)

文章目录 1、什么是会话跟踪技术2、Cookie2.1、Cookie基本使用2.2、Cookie原理2.3、Cookie使用细节 3、Session3.1、Session基本使用3.2、Session原理3.3、Session使用细节 4、Cookie和Session的对比 1、什么是会话跟踪技术 会话 ​ 用户打开浏览器&#xff0c;访问web服务器的…

2024美赛数学建模思路 - 案例:感知机原理剖析及实现

文章目录 1 感知机的直观理解2 感知机的数学角度3 代码实现 4 建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 感知机的直观理解 感知机应该属于机器学习算法中最简单的一种算法&#xff0c;其…

cs231n assignment1——SVM

整体思路 加载CIFAR-10数据集并展示部分数据数据图像归一化&#xff0c;减去均值&#xff08;也可以再除以方差&#xff09;svm_loss_naive和svm_loss_vectorized计算hinge损失&#xff0c;用拉格朗日法列hinge损失函数利用随机梯度下降法优化SVM在训练集和验证集计算准确率&a…

产品经理 | 原型设计必须遵循的视觉设计规范(1)— 设计原则

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本系列原型设计规范教程&#xff0c;主要用于规范系统的原型界面设计&#xff0c;使之具有良好的设计风格&#xff0c;帮助塑造品牌形象。通过定义原型的字体、图标、布局、颜色等信息&#xff0c;提供多样化的交互设计方案…

无法找到mfc100.dll的解决方法分享,如何快速修复mfc100.dll文件

在日常使用电脑时&#xff0c;我们可能会碰到一些系统错误提示&#xff0c;比如“无法找到mfc100.dll”的信息。这种错误通常会阻碍代码的执行或某些应用程序的启动。为了帮助您解决这一问题&#xff0c;本文将深入探讨其成因&#xff0c;并提供几种不同的mfc100.dll解决方案。…

1360. 卒的遍历-深度优先搜索-DFS

代码&#xff1a; #include<bits/stdc.h> using namespace std; int n,m; int r[25][3]; int fx[3]{0,1,0}; int fy[3]{0,0,1}; int a; void print(int k){a;cout<<a<<":";for(int i1;i<k;i){cout<<r[i][1]<<","<<…

[C#]winform部署yolov8图像分类的openvino格式的模型

【官方框架地址】 https://github.com/ultralytics/ultralytics 【openvino介绍】 OpenVINO是一个针对Intel硬件优化的开源工具包&#xff0c;用于优化和部署深度学习模型。以下是OpenVINO部署模型的主要优点&#xff1a; 高性能&#xff1a;OpenVINO提供了一系列性能优化工…

Flask 3.x log全域配置(包含pytest)

最近使用到flask3.x&#xff0c;配置了全域的log&#xff0c;这边记录下 首先需要创建logging的配置文件&#xff0c;我是放在项目根目录的&#xff0c; Logging 配置 logging.json {"version": 1, # 配置文件版本号"formatters": {"default&qu…

HTTP 协议和 TCP/IP 协议之间有什么区别?

HTTP&#xff08;超文本传输协议&#xff09;和TCP/IP&#xff08;传输控制协议/互联网协议&#xff09;是两种在互联网通信中广泛使用的协议&#xff0c;它们之间的区别和联系对许多人来说可能还不是很清晰&#xff0c;今天我们就带大家来一起了解一下HTTP和TCP/IP协议这2者之…

java数据结构与算法刷题-----LeetCode566. 重塑矩阵

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 法一&#xff0c;下标填充2. 法二&#xff1a;数学除法和取余…

MFC 序列化机制

目录 文件操作相关类 序列化机制相关类 序列化机制使用 序列化机制执行过程 序列化类对象 文件操作相关类 CFile&#xff1a;文件操作类&#xff0c;封装了关于文件读写等操作&#xff0c;常见的方法&#xff1a; CFile::Open&#xff1a;打开或者创建文件CFile::Write/…

Mongo集群入门

一、前言 MongoDB 有三种集群架构模式&#xff0c;分别为主从复制&#xff08;Master-Slaver&#xff09;、副本集&#xff08;Replica Set&#xff09;和分片&#xff08;Sharding&#xff09;模式。 Master-Slaver 是一种主从复制的模式&#xff0c;目前已经不推荐使用。 Re…

大模型:我也会自监督学习~

前言 当下大模型的能力已经很强了&#xff0c;但是将来我们想要的是能力更强的大模型&#xff0c;其最好能够处理各种复杂问题也即强对齐模型。 之前大模型训练的监督信号主要来源于人类反馈&#xff0c;但是如果想要训练一个强对齐模型必然就需要一个对应的强监督信号&#…

WebDriverWait太强大

selenium webdriver及wait 1 implicitly包打天下2 Linkedin无法登录返回值很乱&#xff0c;怎么破&#xff1f; 1 implicitly包打天下 有了implicitly之后&#xff0c;基本上不再关注网速之类的影响。 self.driver.implicitly_wait(511)2 Linkedin无法登录返回值很乱&#xf…

探索图像检索:从理论到实战的应用

目录 一、引言二、图像检索技术概述图像检索的基本概念图像检索与文本检索的区别特征提取技术相似度计算索引技术 三、图像检索技术代码示例图像特征提取示例相似度计算索引技术 四、图像搜索流程架构数据采集与预处理特征提取相似度计算与排名结果呈现与优化 五、实际应用图像…

【征服redis11】花了一天,我终于懂了redis的底层数据结构

现在我们可以开始讨论一个硬核问题了—Redis的数据结构。在redis里常见的数据类型有String、Hash、Set、List、Zset五种常用结构&#xff0c;另外还有Hyperloglog、Geo、Streams等结构。这些结构的特征和应用场景我们在前面都介绍过&#xff0c;这里我们来研究一下其内部结构是…

【分布式技术】ELK大型日志收集分析系统

目录 步骤一&#xff1a;完成JAVA环境部署 步骤二&#xff1a;部署ES节点&#xff08;三台主机&#xff09; 步骤三&#xff1a;内核参数修改 步骤四&#xff1a;web端查看验证 步骤五&#xff1a;yum安装nginx 步骤六&#xff1a;完成logstash部署 步骤七&#xff1a;部…

荣誉艾尔迪亚人的题解

目录 原题描述&#xff1a; 题目背景 题目描述 输入格式 输出格式 样例 Input 1 Output 1 Input 2 Output 2 数据范围&#xff1a; 样例解释 主要思路&#xff1a; 代码code&#xff1a; 原题描述&#xff1a; 时间限制: 1000ms 空间限制: 65536kb 题目背景 ​…