基于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;它…

简单的图像处理算法

本笔记参考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…

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

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

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…

创建型设计模式

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

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

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

业务复习知识点Oracle查询

业务数据查询-1 单表查询 数据准备 自来水收费系统建表语句.sql 简单条件查询 精确查询 需求 &#xff1a;查询水表编号为 30408 的业主记录 查询语句 &#xff1a; select * from t_owners where watermeter 30408; 查询结果 &#xff1a; 模糊查询 需求 &#xff1a;查询业…

毕业设计注意事项(2024届更新中)

1.开题 根据学院发的开题报告模板完成&#xff0c;其中大纲部分可参考资料 2.毕设 根据资料中的毕设评价标准&#xff0c;对照工作量 3.论文 3.1 格式问题 非常重要&#xff0c;认真对比资料中我发的模板&#xff0c;格式有问题&#xff0c;答辩输一半&#xff01; 以word…

W801学习笔记十四:掌机系统——菜单——尝试打造自己的UI

未来将会有诸多应用&#xff0c;这些应用将通过菜单进行有序组织和管理。因此&#xff0c;我们需要率先打造好菜单。 LCD 驱动通常是直接写屏的&#xff0c;虽然速度较快&#xff0c;但用于界面制作则不太适宜。所以&#xff0c;最好能拥有一套 UI 框架。如前所述&#xff0c;…

【linux】编译器使用

目录 1. gcc &#xff0c;g 编译器使用 a. 有关gcc的指令&#xff08;g同理&#xff09; 2. .o 文件和库的链接方式 a. 链接方式 b. 动态库 和 静态库 优缺点对比 c. debug 版本 和 release 版本 1. gcc &#xff0c;g 编译器使用 a. 有关gcc的指令&#xff08;g同理&…

设计模式-创建型-抽象工厂模式-Abstract Factory

UML类图 工厂接口类 public interface ProductFactory {Phone phoneProduct();//生产手机Router routerProduct();//生产路由器 } 小米工厂实现类 public class XiaomiFactoryImpl implements ProductFactory {Overridepublic Phone phoneProduct() {return new XiaomiPhone…

Node.js -- fs模块

文章目录 1. 写入文件1.1 写入文件1.2 同步和异步1.3 文件追加写入1.4 流式写入1.5 文件写入的场景 2. 读取文件2.1 异步和同步读取2.2 读取文件应用场景2.3 流式读取2.4 fs 练习 -- 文件复制 3. 文件重命名和移动4. 文件删除5. 文件夹操作5.1 创建文件夹5.2 读取文件夹5.3 删除…

crossover和wine哪个好 wine和crossover有什么本质区别 苹果电脑运行Windows crossover24

CrossOver是Wine的延伸产品&#xff0c;CrossOver可以简单的理解为类虚拟机&#xff0c;那么wine是什么&#xff0c;许多小伙伴就可能有些一知半解。CrossOver和wine哪个好&#xff0c;wine和CrossOver有什么本质区别呢&#xff1f;下文将围绕着这两个问题展开。 一、CrossOve…

tcp inflight 守恒算法的几何解释

接上文&#xff1a;tcp inflight 守恒算法背后的哲学 在 tcp inflight 守恒算法正确性 中&#xff0c;E bw / srtt 的公平最优解是算出来的&#xff0c;如果自然可以用数学描述&#xff0c;那能算出来的东西反过来也一定能通过直感看出来&#xff0c;我倾向于用几何和力学描述…