51单片机入门之独立按键

   

目录

1.按键简介     

2.独立按键控制LED亮灭

3.独立按键控制LED移位


1.按键简介     

        在生活中,我们常常会见到各种按键,我们的开发板上也有按键,就在左下角有四个按键,我们把它们叫做独立按键。

        独立按键的原理比较简单,大概就是按下独立按键,按键就会把电路连通,松开按键,又会恢复原样。

        按键的内部结构是一个有弹性的金属片,按下会连接电路,松开之后又会恢复原样,所以电路又会断开。在单片机中,我们的按键对应的GPIO管口是下面这样的:

        你会发现这里其实有一点不太一样的东西,就是K1和K2对应的GPIO口好像有点不太一样,是反过来的,这个,具体的原因我们不得而知,但是我们使用的时候需要记住我们两个按键对应控制的端口是不一样的就行了。

        这里这里我们按下K1,电路连接,P31管脚就会接收到低电平信号,也就是P31会由默认的高电平1变成0,所以我们使用的时候只需要判断端口的值是1还是0就行了。

        其次,金属按键还有一个性质——按下抖动

        这也是一个按键的弊端,按键按下和松开时的抖动会导致控制的变化,比如我们定义按下按键灯就亮,那么存在抖动的情况下,我们的灯可以在前面的这段抖动的时间里面不断变化,也就是暗亮交替闪烁之后再保持稳定,所以,按键中一大重要的操作就是按键消抖。

2.独立按键控制LED亮灭

        这里,我们使用KEY1来控制LED1的亮灭,按键1对应的端口是P31,LED1对应的端口是P20,我们先考虑一下如何使用按键。

        首先我们使用按键就要检测按键的按下,按键按下的时候把LED1的状态更改,这样就好了,单在细节方面还需要补充,比如我们的按键需要消抖防止出现因为按键抖动导致的差错,所以我们需要在检测到按键按下之后暂停20ms进行消抖处理,在按键松开之后再进行消抖处理,这样就免除了按键抖动对我们操作的干扰了。

        其次,按键按下之后松开之前,会一直处于按下的状态,也就是说,我们如果在这里设置LED变为!LED(即LED由1变0,由0变1),这样的话,我们在按下按键之后松开之前会一直进行判断KEY,而且每次都会成功然后变化LED状态,这并不是我们想要的。所以我们就要使用while循环把按键处于按下状态锁定起来,循环内部不使用任何操作,也就是写一个while(KEY==0);这样我们就可以让按键按下的时候始终处于这个循环里,按键松开之后再执行相应操作。

        然后我们就可以实现我们的代码了:

#include <REGX52.H>
#include <INTRINS.H>

sbit KEY1 = P3^1;
sbit LED1 = P2^0;

void Delay(unsigned int xms)		//@11.0592MHz
{
	while(xms--)
	{
			unsigned char i, j;
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

void main()
{
	LED1 = 1;
	while(1)
	{
		if(KEY1 == 0)
		{
			Delay(20);//消抖
			while(KEY1 == 0);//检测按键松开
			Delay(20);//消抖
			
			LED1 = !LED1;//变化状态
		}
	}
}

        这里我们的代码中使用了 sbit KEY1 = P3^1; 和 sbit LED1 = P2^0;这两句代码定义端口,其实我们也可以直接对两个端口赋值,但是我们的格式就要变了,比如我们使用P3_1和P2_0而不是P3^1和P2^0,因为这两种表示方式在51里是不一样的。

3.独立按键控制LED移位

        这里模仿LED流水灯的效果,我们使用按键检测来让LED移位,思路是KEY1控制左移,KEY2控制右移,初始LED默认在LED1的位置处于亮的状态。

        这样我们就可以实现代码了:

        我们需要控制整个LED串,所以就选择对P2端口直接赋值,初始值需要是只有LED1亮,那么输入的数据就要是1111 1110,也就是初始化P2为0xFE,然后就是LED的左右移动,使用_crol_()和_cror_()函数即可,按键的消抖和KEY1(P31)与KEY2(P30)对应的端口也要注意一下,并且数据输入的是反过来的数据,所以我们的左移右移操作也要相反,即KEY1使用右移函数实现LED左移,KEY2使用左移函数实现LED右移,这样就可以完成我们的操作:

#include <REGX52.H>
#include <INTRINS.H>

sbit KEY1 = P3^1;
sbit KEY2 = P3^0;

void Delay(unsigned int xms)		//@11.0592MHz
{
	while(xms--)
	{
			unsigned char i, j;
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

void main()
{
	P2 = 0xFE;
	while(1)
	{
		if(KEY1 == 0)
		{
			Delay(20);
			while(KEY1 == 0);
			Delay(20);
			
			P2 = _cror_(P2,1);
		}
		if(KEY2 == 0)
		{
			Delay(20);
			while(KEY2 == 0);
			Delay(20);
			
			P2 = _crol_(P2,1);
		}
	}
}

        然后上电测试,就完成了独立按键部分的内容

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【三十三】【算法分析与设计】回溯(1),46. 全排列,78. 子集,没有树结构,但是依旧模拟树结构,回溯,利用全局变量+递归函数模拟树结构

46. 全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1&#xff0c;2&#xff0c;3] 输出&#xff1a;[[1&#xff0c;2&#xff0c;3]&#xff0c;[1&#xff0c;3&a…

WPF中通过自定义Panel实现控件拖动

背景 看到趋时软件的公众号文章&#xff08;WPF自定义Panel&#xff1a;让拖拽变得更简单&#xff09;&#xff0c;发现可以不通过Drag的方法来实现ListBox控件的拖动&#xff0c;而是通过对控件的坐标相加减去实现控件的位移等判断&#xff0c;因此根据文章里面的代码,边理解边…

考题抄错会做也白搭--模版方法模式

1.1 选择题不会做&#xff0c;蒙呗&#xff01; "题目抄错了&#xff0c;那就不是考试题目了&#xff0c;而考试试卷最大的好处就是&#xff0c;大家都是一样的题目&#xff0c;特别是标准化的考试&#xff0c;比如全是选择或判断的题目&#xff0c;那就最大化地限制了答题…

整合Mybatis(Spring学习笔记十二)

一、导入相关的包 junit 包 Mybatis包 mysql数据库包 Spring相关的包 Aop相关的包 Mybatis-Spring包&#xff08;现在就来学这个&#xff09; 提示jdk版本不一致的朋友记得 jdk8只支持spring到5.x 所以如果导入的spring(spring-we…

Linux:进程终止和等待

一、进程终止 main函数的返回值也叫做进程的退出码&#xff0c;一般0表示成功&#xff0c;非零表示失败。我们也可以用不同的数字来表示不同失败的原因。 echo $?//打印最近一次进程执行的退出码 而作为程序猿&#xff0c;我们更需要知道的是错误码所代表的错误信息&#x…

【智能算法】磷虾群算法(KHA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2012年&#xff0c;Gandomi等人受到自然界中磷虾生存行为启发&#xff0c;提出了磷虾群算法&#xff08;Krill Herd Algorithm, KHA&#xff09;。 2.算法原理 2.1算法思想 KHA受南极鳞虾群觅食行…

Java | Leetcode Java题解之第8题字符串转换整数atoi

题目&#xff1a; 题解&#xff1a; class Solution {public int myAtoi(String str) {Automaton automaton new Automaton();int length str.length();for (int i 0; i < length; i) {automaton.get(str.charAt(i));}return (int) (automaton.sign * automaton.ans);} …

Matlab|储能辅助电力系统调峰的容量需求研究

目录 1 主要内容 目标函数 约束条件 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《储能辅助电力系统调峰的容量需求研究》&#xff0c;主要是对火电、风电和储能等电力设备主体进行优化调度&#xff0c;在调峰能力达不到时采用弃负荷&#xff0c;程序以…

无人售货奶柜:开启便捷生活的新篇章

无人售货奶柜&#xff1a;开启便捷生活的新篇章 在这个快节奏的现代生活中&#xff0c;科技的革新不仅为我们带来了前所未有的便利&#xff0c;更在不经意间改变着我们的日常。其中&#xff0c;无人售货技术的出现&#xff0c;尤其是无人售货奶柜&#xff0c;已经成为我们生活…

012:vue3使用vue-i18n实现国际化

文章目录 1. 安装 vue-i18n2. 创建文件存储翻译的语言3. 注册i18n实例4. 在main.ts中引入vue-i18n实例5. 在组件模板中使用6. 在js中使用7. locale.value 实现国际化语言切换8. vue3 中ref里面的国际化值没生效问题 1. 安装 vue-i18n cnpm i --save vue-i18n2. 创建文件存储翻…

树状数组-数据结构

树状数组 t[x] 节点的父节点为 t[x lowbit(x)] 整棵树的深度为 log2n 1 1 . add(x,k) 给指定的节点x加上k — 动态的维护前缀和 需要从x开始&#xff0c;向上找到所有父节点&#xff0c;值都加上k 2. ask(x) 求取节点x之前的前缀和 求取单点之前的前缀和只需要累加即可 …

【算法】单单单单单调栈,接接接接接雨水

【算法】单单单单单调栈&#xff0c;接接接接接雨水 今天没有小故事。 参考以及题单来源&#xff1a; 代码随想录 (programmercarl.com) Part 1 啥是单调栈&#xff1f; 1.啥啥啥是单调栈&#xff1f; 栈的特性想必各位再熟悉不过了&#xff1a;先进后出。栈仅仅有一个出口&a…

算法 day29 回溯5

491 非递减子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作递增序列的一种特殊情…

检测头篇 | 利用RT-DETR模型的检测头去替换YOLOv8中的检测头

前言:Hello大家好,我是小哥谈。RT-DETR号称是打败YOLO的检测模型,其作为一种基于Transformer的检测方法,相较于传统的基于卷积的检测方法,提供了更为全面和深入的特征理解,将RT-DETR检测头融入YOLOv8,我们可以结合YOLO的实时检测能力和RT-DETR的深度特征理解能力,打造出…

业务网关的设计与实践

在过去的两年里&#xff0c;主要在做业务网关的开发。今年春节后选择转岗去做更偏近业务的开发。公司的业务是金融相关&#xff0c;一直觉得金融相关的业务是有一定门槛并且是对职业生涯有帮助的&#xff0c;所以趁这个机会来深入了解这块业务。 仔细回想&#xff0c;在做业务…

【数据处理包Pandas】数据载入与预处理

目录 一、数据载入二、数据清洗&#xff08;一&#xff09;Pandas中缺失值的表示&#xff08;二&#xff09;与缺失值判断和处理相关的方法 三、连续特征离散化四、哑变量处理 准备工作 导入 NumPy 库和 Pandas 库。 import numpy as np import pandas as pd一、数据载入 对…

开机自启动

对win10,给一种开机自启动的设置方法: 1. winr 打开 2. 输入shell:startup打开 开始\程序\启动 3. 把想要自启动的应用的快捷方式放在这里即可 亲测有用

第十一届蓝桥杯物联网试题(省赛)

对于通信方面&#xff0c;还是终端A、B都保持接收状态&#xff0c;当要发送的数组不为空再发送数据&#xff0c;发送完后立即清除&#xff0c;接收数据的数组不为空则处理&#xff0c;处理完后立即清除&#xff0c;分工明确 继电器不亮一般可能是电压不够 将数据加空格再加\r…

RPA自动化小红书自动化写文以及发文!

1、视频演示 RPA自动化小红书自动写作发文 2、核心功能点 采集笔记&#xff1a;采集小红书上点赞量大于1000的爆款笔记 下载素材&#xff1a;下载爆款笔记的主图 爆款改写&#xff1a;根据爆款笔记的标题仿写新的标题以及新的文案 自动发布&#xff1a;将爆款笔记发布到小红…

Oracle RAC One Node,双胞胎变独生子?

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…