基于51单片机的矩阵按键扫描的proteus仿真

文章目录

  • 一、按键
    • 按键
    • 按键消抖
  • 二、独立按键
    • 仿真图
    • 仿真程序
  • 三、矩阵按键
    • 仿真图
    • 仿真程序
  • 四、总结


一、按键

按键

按键通常指的是电子设备上的一种输入装置,用于在按下时发送信号,以便设备执行相应的操作。按键可以分为独立按键和矩阵按键两种类型。

先来简单说一下独立按键,独立按键是指每一个按键都独立连接到单片机或者其他处理器的一个引脚上,每个按键都有自己的引脚,通过检测这个引脚的电平变化来确定按键是否被按下,常用于需要少量按键且按键数量有限的场合,比如遥控器、小型仪器等。

这里放几种按键的实物图,它们的区别在于封装,形状等。

在这里插入图片描述

接下来简单说一下矩阵按键,矩阵按键则是独立按键的组合,是指将多个按键组织成一个矩阵的形式连接到单片机或者其他处理器的引脚上,通过在行和列之间扫描判断,可以确定按键按下的位置。矩阵按键节省了引脚资源,使得可以通过少量引脚连接大量按键。常用于需要大量按键且按键数量较多的场合,比如键盘、数字输入器等。

在这里插入图片描述

按键消抖

既然谈到了按键,那也简单说一下按键的抖动以及如何做消抖。

按键的抖动是由于按键开关的机械弹性特性,在按键按下或松开时,触点闭合或断开的瞬间会产生接触不稳定,导致输出电平不稳定,从而出现键抖动现象。这种抖动可能会导致CPU对一次按键操作进行多次处理,产生错误的操作,因此需要消除抖动的不良后果。

消抖的方式主要有两种:硬件消抖和软件消抖。

硬件消抖主要是用RC滤波去抖电路,RC滤波电路由电阻(R)和电容(C)组成,在按键按下或释放的过程中,由于电容的充放电过程,输入信号会经过平滑处理,抑制抖动信号,从而使得输出信号相对稳定。

但是要注意:电容和电阻的数值会影响RC滤波电路的响应时间和抖动抑制效果。通常情况下,选择较大的电容和较大的电阻可以实现更好的抖动抑制效果,但同时会增加响应时间。因此需要在稳定性和响应速度之间进行权衡。

软件消抖主要包括延时消抖和状态检测消抖。延时消抖顾名思义就是在检测到按键按下后,通过延时一段时间来等待按键的抖动过程结束,然后再进行状态的确认。这种方法简单易行,但需要根据具体情况设置合适的延时时间。而状态检测消抖主要是针对在检测到按键按下或释放时,通过连续检测一定时间内按键的状态,只有当按键的状态保持一段时间后才确认按键操作有效。这种方法相对较精确,能够有效地避免误判。

二、独立按键

仿真图

独立按键的仿真图相对简单,就是通过一个按键按下来将一个和指示灯的状态取反。

Individual key

仿真程序

/**************************************************************************************
*		              独立按键实验												  *
实现现象:下载程序后按下K1按键可以对D1小灯状态取反。
注意事项:无																				  
***************************************************************************************/
#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;sbit k1=P3^5;	 //定义P31口是k1
sbit led=P3^1;	 //定义P20口是led
/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);	
}/*******************************************************************************
* 函 数 名         : keypros
* 函数功能		   : 按键处理函数,判断按键K1是否按下
*******************************************************************************/
void keypros()
{if(k1==0)		  //检测按键K1是否按下{	delay(1000);   //消除抖动 一般大约10msif(k1==0)	 //再次判断按键是否按下{led=~led;	  //led状态取反}while(!k1);	 //检测按键是否松开}		
}/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	while(1){	keypros();  //按键处理函数	}		
}

三、矩阵按键

仿真图

如下的仿真图初始共阳数码管显示0,有一个4*4的矩阵按键,每一个按键按下,数码管都会显示1个数字,总共显示0~F。

Matrix keying

仿真程序

以下代码实现了一个基本的矩阵按键扫描功能,并在数码管上显示按下的键值对应的数字。

在检测按键时,首先将行设置为低电平,列设置为高电平,然后检测是否有按键按下;接着再次检测按键,但这次将列设置为低电平,行设置为高电平,以此来确定按下的具体按键。在主循环中不断地检测按键,并根据按键的值在数码管上显示对应的数字。

/**************************************************************************************
*		              矩阵按键实验												  *
实现现象:下载程序后数码管显示0,按下矩阵按键上的按键显示对应的数字
注意事项:																				  
***************************************************************************************/
#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;#define GPIO_DIG P0
#define GPIO_KEY P3u8 KeyValue;	//用来存放读取到的键值u8 code smgduan_anode[17] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 
0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E}; // 共阳数码管显示0~F的值/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);	
}/*******************************************************************************
* 函 数 名         : KeyDown
* 函数功能		   : 检测有按键按下并读取键值
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void KeyDown(void)
{char a=0;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f)//读取按键是否按下{delay(1000);//延时10ms进行消抖if(GPIO_KEY!=0x0f)//再次检测键盘是否按下{	//测试列GPIO_KEY=0X0F;switch(GPIO_KEY){case(0X07):	KeyValue=0;break;case(0X0b):	KeyValue=1;break;case(0X0d): KeyValue=2;break;case(0X0e):	KeyValue=3;break;}//测试行GPIO_KEY=0XF0;switch(GPIO_KEY){case(0X70):	KeyValue=KeyValue;break;case(0Xb0):	KeyValue=KeyValue+4;break;case(0Xd0): KeyValue=KeyValue+8;break;case(0Xe0):	KeyValue=KeyValue+12;break;}while((a<50)&&(GPIO_KEY!=0xf0))	 //检测按键松手检测{delay(1000);a++;}}}
}/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	while(1){	KeyDown();//按键判断函数GPIO_DIG=smgduan_anode[KeyValue];}		
}

四、总结

今天主要讲了基于51单片机的矩阵按键扫描的proteus仿真。

感谢你的观看!

在这里插入图片描述

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

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

相关文章

TRIZ理论下攀爬机器人的创新设计与研究

随着科技的飞速发展&#xff0c;机器人技术已广泛应用于各个领域。特别是在复杂环境下的作业&#xff0c;如灾难救援、太空探测等&#xff0c;对机器人的移动能力和适应性提出了更高要求。在这样的背景下&#xff0c;基于TRIZ理论的攀爬机器人设计与研究应运而生&#xff0c;它…

代码随想录三刷day46

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣035. 不相交的线二、力扣53. 最大子数组和三、力扣392. 判断子序列 前言 每次当初始化的时候&#xff0c;都要回顾一下dp[i][j]的定义&#xff0c;不要…

简单的图像处理算法

本笔记参考crazy_Bingo 基础&#xff1a; 图像处理都是用卷积矩阵对图像卷积计算&#xff0c;如3X3 的矩阵对640 X 480分辨率的图像卷积&#xff0c;最终会得到638 X 478 的图像。卷积过程是这样的&#xff1a; 一、中值滤波 &#xff1a; 找出矩阵中的最中间值作为像素点 中…

Flink的安装、项目创建、任务打包和部署完整实现,任务实现使用JAVA语言

Flink资源下载地址 Flink安装包下载地址 一、本地模式安装Flink 1、在Linux服务上&#xff0c;创建flink文件夹 mkdir flink 2、上传文件并解压 tar -zxvf flink-1.14.6-bin-scala_2.11.tgz 解压完成后&#xff0c;如图&#xff1a; 3、启动Flink 进入到解压目录下&#x…

樱花下落的速度(区间放缩,思维)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 已知一朵樱花有 n 枚花瓣&#xff0c;每一枚花瓣各不相同。将它们用一个长为 n 的排列编号。 我们根据一朵樱花的编号来认定它的特征&#xff1a; 每一个排列均具有两组特征码 fa&#xff0c;f…

YOLOv9训练损失、精度、mAP绘图功能 | 支持多结果对比,多结果绘在一个图片(消融实验、科研必备)

一、本文介绍 本文给大家带来的是YOLOv9系列的绘图功能&#xff0c;我将向大家介绍YOLO系列的绘图功能。我们在进行实验时&#xff0c;经常需要比较多个结果&#xff0c;针对这一问题&#xff0c;我写了点代码来解决这个问题&#xff0c;它可以根据训练结果绘制损失(loss)和mA…

使用官方代码打印yolov8 PyTorch模型结构

理解模型结构的重要性 在进行深度学习模型的开发时&#xff0c;一个清晰的模型结构有助于理解网络是如何从输入数据中提取特征&#xff0c;并执行分类或回归任务的。对于如YOLOv8这样的复杂模型来说&#xff0c;理解每个层的作用和相互间的连结尤为重要。 下面是我整合的代码…

ORACLE创建表空间及用户

创建用户之前需要先为用户创建表空间。 创建临时表空间&#xff1a;Oracle 临时表空间用于存储数据库操作过程中的临时数据&#xff0c;例如排序、哈希操作或者大查询的中间结果。临时表空间主要用于保证用户会话中的操作不会影响到系统的稳定性。 #用管理员登入数据库。 sq…

React的Key和diff

React的Key 先说说React组件的中Key,在渲染一个列表的时候,都要求设置一个唯一的Key,不然就会提示:Each child in a list should have a unique "key" prop. 意思是列表的每一个子元素都应该需要设置一个唯一的key值。在开发中一搬会以id作为key。比如 const …

Java的八大基本数据类型和 println 的介绍

前言 如果你有C语言的基础&#xff0c;这部分内容就会很简单&#xff0c;但是会有所不同~~ 这是我将要提到的八大基本数据类型&#xff1a; 注意&#xff0c;Java的数据类型是有符号的&#xff01;&#xff01;&#xff01;和C语言不同&#xff0c;Java不存在无符号的数据。 整…

Day:动态规划 LeedCode 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV

123. 买卖股票的最佳时机 III 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意&#xff1a;你不能同时参与多笔交易&#xff08;你必须在再次购买前出售掉之前的股票&a…

安全开发实战(2)---域名反查IP

目录 安全开发专栏 前言 域名与ip的关系 域名反查ip的作用 1.2.1 One 1.2.2 Two 1.2.3 批量监测 ​总结 安全开发专栏 安全开发实战http://t.csdnimg.cn/25N7H 这步是比较关键的一步,一般进行cdn监测后,获取到真实ip地址后,或是域名时,然后进行域名反查IP地址,进行进…

基于Springboot的职称评审管理系统

基于SpringbootVue的职称评审管理系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 评审条件 论坛信息 系统公告 后台登录页面 用户管理 评审员管理 省份…

再谈C语言——理解指针(四)

assert断⾔ assert.h 头⽂件定义了宏 assert() &#xff0c;⽤于在运⾏时确保程序符合指定条件&#xff0c;如果不符合&#xff0c;就报错终⽌运⾏。这个宏常常被称为“断⾔”。 assert(p ! NULL); 上⾯代码在程序运⾏到这⼀⾏语句时&#xff0c;验证变量 p 是否等于 NULL 。…

​LeetCode解法汇总2385. 感染二叉树需要的总时间

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一棵二叉树的根节点 root &#xff0…

Linux-System V共享内存

目录 System V共享内存共享内存概述创建或打开共享内存使用共享内存分离共享内存控制共享内存1、IPC_STAT2、IPC_SET 代码示例 System V共享内存 共享内存概述 共享内存是所有IPC中最快的一种。它之所以快是因为共享内存一旦映射到进程的地址空间&#xff0c;进程之间数据的传…

创建型设计模式

七大原则 1. 开闭原则&#xff08;Open-Closed Principle, OCP&#xff09; 详解&#xff1a;软件实体&#xff08;类、模块、函数等&#xff09;应该易于扩展&#xff0c;但是不易于修改。换句话说&#xff0c;当软件需求变化时&#xff0c;应该通过添加新代码来实现变化&am…

CSP初赛知识精讲--排列组合

第十一节 排列组合 基础知识 排列是指从给定个数的元素中取出指定个数的元素进行排序。  组合是指从给定个数的元素中仅仅取出指定元素个数的元素&#xff0c;不考虑排序。  排列组合问题的关键就是研究给定要求的排列和组合可能出现的情况的总数。 定义与公式  排列&…

销冠必备:高效跟进客户的四个技巧

作为一名销售&#xff0c;高效而精准地跟进客户是取得成功的关键。今天&#xff0c;我将分享四个技巧&#xff0c;让你也能够高效的跟进客户。 1、善于发问 通过多询问客户&#xff0c;你可以更好地了解客户的需求和痛点。在与客户交流时&#xff0c;不要只是简单地回答问题&…

LeetCode 0216.组合总和 III:回溯(剪枝) OR 二进制枚举

【LetMeFly】216.组合总和 III&#xff1a;回溯(剪枝) OR 二进制枚举 力扣题目链接&#xff1a;https://leetcode.cn/problems/combination-sum-iii/ 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返…