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;提供多样化的交互设计方案…

PHP 数组面试题

如何创建一个空数组和一个带有初始值的数组&#xff1f; 创建一个空数组可以使用以下方式&#xff1a; $array array();或者使用简化的语法&#xff1a; $array [];创建一个带有初始值的数组可以使用以下方式&#xff1a; $array array(1, 2, 3); // 带有初始值的索引数…

无法找到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]<<","<<…

第十五篇【传奇开心果系列】Ant Design Mobile开发移动应用:聊天应用

博文目录 传奇开心果博文系列目录Ant Design Mobile of React 开发移动应用示例博文系列博文正文一、项目目标二、项目雏形实现示例代码三、扩展完善功能美化界面的思路四、实现添加消息接收功能的示例代码五、实现样式和布局的示例代码六、实现消息分组和时间戳的功能的示例代…

57 C++ promise 在某一个线程中给A = 赋值,然后其他线程中可以获得这个A 的赋值

零 场景分析&#xff1a; 假设我们需要有一个线程是搞算法的&#xff0c;且每次需要场景的不同去算一次&#xff0c;这个算法花费的时间比较长。 一 promise C中文档的说明 std::promise在标头 <future> 定义template< class R > class promise;(1) (C11 起) temp…

[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/…

墨菲定律治好了我的焦虑

墨菲定律&#xff1a;越怕什么&#xff0c;越发生什么 推论&#xff1a;越害怕什么&#xff1f;就越准备什么&#xff0c;那样发生什么都不需要害怕。 墨菲定律确实揭示了一种有趣的现象&#xff0c;即对某事的过度担忧可能会吸引这个事情发生。这一观点促使我们考虑如何通过…

Mongo集群入门

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

24秋招总结-抓住每一次可能的机会

漫长而又煎熬的秋招从1月11日签约后正式落下了帷幕&#xff0c;在长达近六个月的时间里&#xff0c;每个月都是不同的心态&#xff0c;以此篇总结记录下我的秋招。 首先概述一下秋招的最终结果&#xff0c;我是在七月份开始投递的&#xff0c;正式结束秋招在一月初&#xff0c…

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

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