51单片机之按键驱动

1.按键简介

  按键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时, 开关断开。开发板上使用的按键及内部简易图如下图所示:
在这里插入图片描述
  按键管脚两端距离长的表示默认是导通状态,距离短的默认是断开状态, 如果按键按下,初始导通状态变为断开,初始断开状态变为导通。通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号如下图所示:
在这里插入图片描述
  由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开,因而在闭合和断开的瞬间均伴随着一连串的抖动。抖动时间的长短由按键的机械特性决定的,一般为 5ms 到 10ms。按键稳定闭合时间的长短则由操作人员的按键动作决定的,一般为零点几秒至数秒。按键抖动会引起按键被误读多次。为了确保 CPU 对按键的一次闭合仅作一次处理,必须进行消抖。
  消抖方法可以通过软件方式实现,通过延时二次检测的释放,即能很好的优化抖动误触的问题。操作步骤如下:

  1. 先设置 IO 口为高电平(由于开发板 IO 都有上拉电阻,所以默认 IO 为高 电平)。
  2. 读取 IO 口电平确认是否有按键按下。
  3. 如有 IO 电平为低电平后,延时几个毫秒。
  4. 再读取该 IO 电平,如果仍然为低电平,说明按键按下。

2.硬件接口

在这里插入图片描述
  根据原理图可知,板子上有4个独立按键K1K4,分别对应IO端口的P3^0P3^3;当按键按下时引脚输出低电平。因此,若要检测按键是否按下和松开,需要将引脚初始化电平设置为高电平。

3.软件设计

3.1按键初始化

  定义按键硬件引脚端口,设置初始化电平。

sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
void key_Init(void)
{k1=k2=k3=k4=1;//上拉
}

3.2 按键检测函数实现

  通过判k1~k4是否为低电平,来确定是否有按键按键;延时实现按键消抖,再进行二次判断,确定具体是哪一个按键按下。

u8 Key_GetValue(void)
{static u8 flag=0;if((!k1 || !k2 || !k3 || !k4) && flag==0){flag=1;Delay_Ms(10);if(!k1)return 1;else if(!k2)return 2;else if(!k3)return 3;else if(!k4)return 4;else return 0;}else if(k1 && k2 && k3 && k4){flag=0;}return 0;
}

  在main函数中循环检测按键,当有按键按下时开启蜂鸣器作为按键提示音,并实现对LED的开关控制。

int main()
{u8 i=0;u8 key;key_Init();while(1){key=Key_GetValue();if(key){BEEP_Ctl(100);Delay_Ms(20);BEEP_Ctl(0);LED=~LED;}}	
}

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

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

相关文章

如何用示波器测实时时钟信号和主时钟信号

使用示波器测量实时时钟信号(RTC)和主时钟信号(Main Clock Signal)的步骤如下: 1. 准备工作 选择合适的探头:使用高品质的示波器探头,通常10X衰减探头适合大部分情况。校准探头:确…

端口号和ip地址一样吗?区别是什么

在网络通信的世界里,端口号和IP地址是两个不可或缺的概念,它们各自扮演着独特的角色,共同维系着数据在网络中的有序传输。然而,对于许多初学者而言,这两者往往容易被混淆,认为它们是同一事物的不同表述。那…

【Linux】nohup 命令

【Linux】nohup 命令 1. 语法格式2. 实例3. 查找后台进程 nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。 nohup 命令,在默认情况下(非重定向时&#x…

NVR批量管理软件/平台EasyNVR多个NVR同时管理支持UDP和TCP传输协议

随着科技的飞速发展,视频技术已成为现代社会不可或缺的一部分,广泛应用于安防监控、娱乐传播、在线教育、电商直播等多个领域。在这一背景下,NVR管理平台EasyNVR作为一款高效、灵活的视频监控管理系统,正经历着前所未有的发展机遇…

【传知代码】短期电力负荷(论文复现)

🍑个人主页:Jupiter. 🚀 所属专栏:传知代码 欢迎大家点赞收藏评论😊 目录 备注前言介绍问题背景复现:一. 多维特征提取的提取框架:二. 论文中进行性能测试的MultiTag2Vec-STLF模型:三…

【ceral】c++轻量的序列化库

背景 在开发硬件产品时,会有一些参数配置文件,为了保密性或者传输,需要对其序列化处理,待到产品读取文件时,进行反序列化解码转化为设定的参数类型。 简介 ceral是一个仅包含头文件的C序列化库,可以将任…

分组数据的交叉验证方法【Python代码汇总】

分组数据的交叉验证方法 如果生成过程产生了依赖样本的组,那么独立同分布(i.i.d.)假设就会失效。 . 这种数据分组是特定于领域的。例如,医疗数据通常从多位患者中收集,每位患者可能包含多个样本,而这些样本…

Stable Diffusion 3.5发布:图像生成新纪元,多模态AI的突破!

在人工智能的图像生成领域,我们刚刚迎来了一位新的明星——Stable Diffusion 3.5。这是一款由多模态扩散Transformer(MMDiT)驱动的文本到图像模型,它在图像质量、字体处理、复杂提示理解以及资源效率方面都实现了显著提升。今天&a…

云原生笔记

#1024程序员节|征文# 单页应用(Single-Page Application,SPA) 云原生基础 云原生全景内容宽泛,以至于刚开始就极具挑战性。 云原生应用是高度分布式系统,它们存在于云中,并且能够对变化保持韧性。系统是由多个服务组成的&#…

三维测量与建模笔记 - 2.1 坐标转换基础

2D坐标变换 平移可以看做是对原始的x和y加上了一个偏移,也可以理解为按照给定的平移向量进行移动。 缩放变换,本质是对x,y乘上一个缩放系数。 综合缩放、旋转、平移 矩阵乘法的顺序会对结果有影响,需要注意。 2D欧氏变换 2D欧式…

IDM下载器 (Internet Download Manager) v6.42.2 中文免激活绿色版

Internet Download Manager (IDM下载器) 是一款先进的下载工具,可以提升您的下载速度高达5倍,支持续传,IDM可以让用户自动下载某些类型的文件,它可将文件划分为多个下载点以更快速度下载,并列出最近的下载,方便访问文件。相对于其…

RAGChecker:显著超越RAGAS,一个精细化评估和诊断 RAG 系统的创新框架

RAG应用已经是当下利用大模型能力的典型应用代表,也获得了极大的推广,各种提升RAG性能的技术层出不穷。然而,如何全面、准确地评估 RAG 系统一直是一个挑战。传统评估方法存在诸多局限性:无法有效评估长文本回复、难以区分检索和生成模块的错误来源、与人…

大文件秒传,分片上传,断点续传

大文件分片上传 一 功能描述 1.文件通过web端分片多线程上传到服务端,然后web端发起分片合并,完成大文件分片上传功能 2.上传过的大文件,实现秒传 3.上传过程中,服务异常退出,实现断点续传 二 流程图 三 代码运行…

php怎么并发处理

PHP的并发处理是指在同一时间能够处理多个请求,提高系统的吞吐量和响应速度。下面介绍几种PHP的并发处理方法。 一、多线程 多线程是指在一个进程中启动多个线程同时执行任务。在PHP中,可以使用pthreads扩展来实现多线程编程。pthreads提供了Thread、W…

MySQL快速入门——库的操作

MySQL快速入门——库的操作 1. 创建数据库2. 创建数据库案例3. 字符集和校验规则3.1 查看字符集和校验规则3.2 验证不同校验编码的影响 4. 操作数据库4.1 查看数据库4.2 修改数据库4.3 数据库删除4.4 备份和恢复 5. 查看连接情况 1. 创建数据库 1. 语法: CREATE DA…

Rust编程与项目实战-元组

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 8.2.1 元组的定义 元组是Rust的内置复合数据类型。Rust支持元组,而且元…

Linux服务器运维宝典(一)

基础命令: ls:列出目录下的内容 ls [ -a -l -h] Linux路径当不使用选项和参数,直接使用 ls 命令本体,表示:以平铺形式,列出当前工作目录下的内容选项: -a:all 的意思,…

如何在Linux下安装和配置Docker

文章目录 安装前的准备在Debian/Ubuntu上安装Docker添加Docker仓库安装Docker验证安装 在CentOS/RHEL上安装Docker安装必要的软件包设置Docker仓库安装Docker启动Docker服务 Docker的基本使用拉取一个镜像运行一个容器 配置Docker创建Docker目录使用非root用户运行Docker 结语 …

山西农业大学20241029

08-VUE 一. 组件化开发项目1. 准备工作2. 开发思路3. 拆分页面图4. App.vue5. 项目优化 - 全局注册两个小组件 二. 组件三大组成部分细节1. 样式设置2. data必须是一个函数2.1 原因 一. 组件化开发项目 1. 准备工作 将准备好的App.vue中的内容复制到项目中将图片保存到assets下…

【Spring Boot】元注解

元注解 1.元注解1.1 Target1.2 Retention1.3 Inherited1.4 Documented1.5 interface 2.自定义注解2.1 创建自定义注解类2.2 实现业务逻辑2.3 使用自定义注解 1.元注解 元注解就是定义注解的注解,是 Java 提供的用于定义注解的基本注解。 注解 说明 Retention是注解…