单片机学习笔记---独立按键控制LED状态

news2024/11/18 20:02:46

上一节学习的是独立按键控制LED亮灭

这一节我们先来讲一下按键的抖动:

对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。

看一下下面这个波形,按键没有按下的时候,它就是高电平1,然后突然按下按键,就变成低电平0并且由于机械触点,它会弹开,然后上下抖动一下,之后才稳定得变成0。这个抖动的时间大概是5-10ms,不同的开关抖动的时间是不一样的。

当抖动消失的时候,它就是进入一个稳定的低电平0状态。

松手的时候它也产生抖动,大概也是5-10ms。最后稳定地变成1。

那么我们知道这个抖动对按键的检测进行一些干扰,这就涉及一个东西,叫做消抖。

消抖有两种方法,一种是硬件的消抖,就是加个电路,把这些线通过这个电路里面经过一些触发器等等一些电路来进行操作,把这个抖动进行过滤,这个波形就变成直的,然后点亮LED。但是这种比较麻烦,需要硬件资源。

还有一种方法就是通过软件来处理,就是写程序。怎么办?

当检测到按键按下的时候,来个Delay,直接延时个20ms,而抖动产生的时间大概也才5-10ms,我们延时20ms,就足够覆盖这个抖动时间了。当抖动过去的时候,我们再继续操作,松手的时候我们也Delay 20ms,然后再继续操作。

那么这个程序怎么写呢?

我们要延时20ms的话,要先在STC生成一个延时1ms的程序

注意:系统频率和指令集一定要改成和自己的单片机一致的。

然后复制过来改造一下,完整的代码如下:

编译无错误后下载下来测试一下,重启板子看看效果

我们看到D1的确是在以1秒为周期在闪烁(500ms为半秒)。这就证明我们的Delay函数写的没有错。

那么我们继续往下写

接下来我们要写一个按键判断的程序,昨天我们学过了,是用if语句来判断按键

按键操作有3步:

  1. 按下按键要消抖
  2. 判断松手
  3. 松开按键要消抖

最后要记得LED的状态取反

完整代码如下:

#include <REGX52.H>

void Delay(unsigned int xms)
{
		unsigned char i, j;
    while(xms)
		{
			//以下这段代码是Delay1ms的代码
			i = 2;
			j = 239;
			do
			{
					while (--j);
			} while (--i);
			
			//每次延时1ms结束后,xms就减1
			xms--;
			//直到减到0的时候就会跳出while循环
			//如此就可以实现给xms传多少秒,Delay函数就延时了多少毫秒
		}
}
		
void main()
{
	while(1)
	{
		//判断按键有3步
		if(P3_1==0)//K1按键连接的是P3的1口
		{
			//1.按下按键消抖
			Delay(20);//延时20ms
			
			//2.判断松手
			//延时20ms后,到了稳定状态
			//接下来要检测是否松手
			//因为我们要实现的是当按下的时候,没有亮,只有当松手的时候才亮
			//用while语句判断并循环
			//如果K1还是按下的状态,它就一直循环
			//一旦松手即P3_1==1,就跳出循环
			while(P3_1==0);
			
			//3.松开按键消抖
			Delay(20);//延时20ms
			
			//LED状态取反:
			//为什么要取反?
			//是因为上面判断松手那一步,当P3_1==1时跳出循环了
			//此时P3_1==1,则P2_0也等于1,想要P2_0==0,就得取反,1变成0,灯就亮了
		    P2_0=~P2_0;
		}
	}
}

编译无错误,看看效果

按下K1的时候没有反映

松手后的效果:

只有检测到松手的时候才变亮了。

以上即这节要实现的效果!

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

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

相关文章

go slice 基本用法

slice&#xff08;切片&#xff09;是 go 里面非常常用的一种数据结构&#xff0c;它代表了一个变长的序列&#xff0c;序列中的每个元素都有相同的数据类型。 一个 slice 类型一般写作 []T&#xff0c;其中 T 代表 slice 中元素的类型&#xff1b;slice 的语法和数组很像&…

网络分层和网络原理之UDP和TCP

温故而知新 目录 网络分层 应用层 http协议 传输层 介绍 UDP协议 TCP协议 网络层 数据链路层 物理层 网络分层 一. 应用层 应用程序 现成的应用层协议有超文本协议http(不仅仅有文本&#xff09;. http协议 http://t.csdnimg.cn/e0e8khttp://t.csdnimg.cn/e0e8k 自定义应…

Linux 挂载读取、卸载 ntfs格式硬盘

windows常用的ntfs硬盘分区格式&#xff0c;在linux通常不能直接读取&#xff0c;不过挂载也是非常容易 一、挂载ntfs分区 1.安装 apt-get install ntfs-3g2.查看现在接上的硬盘 fdisk -l可以找到类似如下的&#xff0c;会显示microsoft basic data 3.创建挂载的目录 创…

Android P 背光机制流程分析

在android 9.0中&#xff0c;相比android 8.1而言&#xff0c;背光部分逻辑有较大的调整&#xff0c;这里就对android P背光机制进行完整的分析。 1.手动调节亮度 1.1.在SystemUI、Settings中手动调节 在界面(SystemUI)和Settings中拖动进度条调节亮度时&#xff0c;调节入口…

Topaz Video AI:无损放大,让你的视频更清晰!

在当今的数字时代&#xff0c;视频内容的重要性越来越受到人们的关注。无论是在社交媒体上分享生活片段&#xff0c;还是在商业领域中制作宣传视频&#xff0c;人们都希望能够展现出更高质量的视频内容。 然而&#xff0c;由于各种原因&#xff0c;我们经常会面临一个问题&…

MongoDB日期存储与查询、@Query、嵌套字段查询实战总结

缘由 MongoDB数据库如下&#xff1a; 如上截图&#xff0c;使用MongoDB客户端工具DataGrip&#xff0c;在filter过滤框输入{ profiles.alias: 逆天子, profiles.channel: }&#xff0c;即可实现昵称和渠道多个嵌套字段过滤查询。 现有业务需求&#xff1a;用Java代码来查询…

mysql 存储过程学习

存储过程介绍 1.1 SQL指令执行过程 从SQL执行的流程中我们分析存在的问题: 1.如果我们需要重复多次执行相同的SQL&#xff0c;SQL执行都需要通过连接传递到MySQL&#xff0c;并且需要经过编译和执行的步骤; 2.如果我们需要执行多个SQL指令&#xff0c;并且第二个SQL指令需要…

哪吒汽车与经纬恒润合作升级,中央域控+区域域控将于2024年落地

近日&#xff0c;在2024哪吒汽车价值链大会上&#xff0c;哪吒汽车与经纬恒润联合宣布合作升级&#xff0c;就中央域控制器和区域域控制器展开合作&#xff0c;合作成果将在山海平台新一代车型上发布。 哪吒汽车首席技术官戴大力、经纬恒润副总裁李伟 经纬恒润在智能驾驶领域拥…

数据结构(绪论+算法的基本概念)

文章目录 一、绪论1.1、数据结构的基本概念1.2、数据结构三要素1.2.1、逻辑结构1.2.2、数据的运算1.2.3、物理结构&#xff08;存储结构&#xff09;1.2.4、数据类型和抽象数据类型 二、算法的基本概念2.1、算法的特性2.2、“好”算法的特质2.2.1、算法时间复杂度2.2.2、算法空…

一款强大的矢量图形设计软件:Adobe Illustrator 2023 (AI2023)软件介绍

Adobe Illustrator 2023 (AI2023) 是一款强大的矢量图形设计软件&#xff0c;为设计师提供了无限创意和畅行无阻的设计体验。AI2023具备丰富的功能和工具&#xff0c;让用户可以轻松创建精美的矢量图形、插图、徽标和其他设计作品。 AI2023在界面和用户体验方面进行了全面升级…

【GTK】GtkApplicationWindow/GtkApplication

一、GtkApplicationWindow 在GTK&#xff08;GIMP Toolkit&#xff09;应用程序开发中&#xff0c;并不是每个GTK程序都必须有一个GtkApplicationWindow&#xff0c;但大多数基于GTK的图形界面应用程序都会使用GtkApplicationWindow&#xff0c;因为它是一个方便的类&#xff…

幻兽帕鲁搭建私服,一键更新方法

看着帕鲁这么火&#xff0c;估计更新会变为常态了&#xff0c;如果有自己搭建私服的话&#xff0c;跟着我下面的方法去进行更新吧&#xff01; 如果你还没有自己的私服&#xff0c;快去三五十搞一个吧&#xff0c;只需三五分钟&#xff0c;叫上你的小伙伴一起去搞起来吧 只需3分…

EXCEL VBA抓取网页JSON数据并解析

EXCEL VBA抓取网页JSON数据并解析 链接地址&#xff1a; https://api.api68.com/CQShiCai/getBaseCQShiCaiList.do?lotCode10036&date2024-01-26 Sub test() On Error Resume Next Sheet.Select Sheet1.Cells.ClearContents [a1:g1] Split("preDrawIssue|preDrawTi…

呼叫中心语音质检解决方案-苏州磐石云

呼叫中心语音质检解决方案是一种利用自动语音识别&#xff08;ASR&#xff09;和自然语言处理&#xff08;NLP&#xff09;技术来分析和评估呼叫录音的工具。它可以帮助呼叫中心监控和改进客户服务质量&#xff0c;提供以下功能和特点&#xff1a; 语音转文本&#xff1a;利用A…

dd 命令创建10G大小的文件

您可以使用Linux命令行工具dd来创建10GB大小的文件。以下是创建10GB文件的命令&#xff1a;dd if/dev/zero offile.img bs1G count10 在上述命令中&#xff0c;if参数指定输入文件为/dev/zero&#xff0c;这是一个特殊的文件&#xff0c;读取它会返回空字符&#xff08;即零&am…

通过CanvasRenderer.SetColor和Image.color修改UI组件颜色的区别

1&#xff09;通过CanvasRenderer.SetColor和Image.color修改UI组件颜色的区别 2&#xff09;OPPO相关机型没法在Unity启用90或120FPS 3&#xff09;手机输入法中的emoji 4&#xff09;Unity Application Patching怎么用 这是第369篇UWA技术知识分享的推送&#xff0c;精选了UW…

Linux常见指令汇总

目录 pwd√ ls√ cd√ 对文件的理解√ which√ alias√ touch√ linux系统目录结构√ mkdir / tree √ rmdir / rm √ man√ nano√ cp√ mv√ cat√ echo√ linux设计理念和三种重定向总结√ more/less√ head/tail√ wc√ uniq√ date / cal√ find√…

Qt Design Studio+Pyside项目

Qt Design Studio设计出的项目结构有多个层级的目录&#xff0c;我们直接用类似Qt Creator工具的方式加载main.qml文件时会报错提示module "content" is not installed&#xff0c;将content加入importPath后还是报同样的错误。 Qt Design Studio生成的文件包含了.qm…

传统图像处理算法的缺点是什么?

问题描述&#xff1a;传统图像处理算法的缺点是什么&#xff1f; 问题解答&#xff1a; 传统图像处理方法是基于一组参数&#xff0c;这些参数是在特定条件下对获取到的图像进行手动调整的。这些条件的任何变化&#xff0c;例如照明&#xff0c;都可能影响这些方法的可检测效…

element+vue 之 v-limit 按钮操作权限

1.新建一个permission.js文件 import store from /storeexport default {inserted: function (el, binding) {const { perms: limits } store.state.userconst { value: params } bindingif (!limits.length) returnif (params && Array.isArray(params)) {if (!limi…