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);}}
}

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

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

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

相关文章

10 款最佳 Mac 数据恢复软件,在为时已晚之前值得尝试

查看 10 年适用于 Mac 的 2024 款最佳免费数据恢复软件&#xff0c;可在大多数在线搜索中找到。精选列表将帮助您做出明智的决定并节省您的时间和精力。 10 款最佳 Mac 数据恢复软件 很明显&#xff0c;您此后将面临数据丢失事件。理所当然地&#xff0c;您期待一款可靠、与您…

【MATLAB源码-第30期】基于matlab的内边界边缘检测算法。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 在计算机视觉领域&#xff0c;图像分割&#xff08;segmentation&#xff09;指的是将数字图像细分为多个图像子区域&#xff08;像素的集合&#xff09;&#xff08;也被称作超像素&#xff09;的过程。图像分割的目的是简化…

SAP HCM 多成本中心薪酬过账标准程序解读

SAP HCM薪酬过账会涉及到CO对象&#xff0c;CO对象主要是成本中心、WBS、内部订单、订单等&#xff0c;成本中心有多个维护地方0001信息类型0027信息类型等&#xff0c;那么成本中心多个地方维护&#xff0c;优先级是如何&#xff0c;0027>1018>0001,也就是说人身上的优先…

Mysql故障和优化

一、MySQL故障 二、MySQL优化 1.硬件优化&#xff1a; 2.数据库设计与规划 1.提前估计数据量&#xff0c;使用什么存储引擎 2.数据库服务器专机专用&#xff0c;避免额外的服务可能导致的性能下降和不稳定性 3.增加多台服务器&#xff0c;以达到稳定、高效的效果。主从同步、…

http模块 设置资源类型(mime类型)

虽然浏览器自带websocket功能它会根据响应回来的内容自动去判断资源类型&#xff0c;但是我们加上了mime类型判断代码会更加规范些 一、mime类型概念&#xff1a; 媒体类型是一种标准&#xff0c;它用来表示文档。文件、字节流的性质和格式。HTTP服务可以设置响应头Content-T…

金三银四面试题(十四):Java基础问题(5)

这部分面试题多用于面试的热身运动&#xff0c;对很多找实习和准备毕业找工作的小伙伴至关重要。 避免序列化 可以使用transient 关键字修饰不想进行序列化的变量。 transient 关键字的作用是&#xff1a;阻止实例中那些用此关键字修饰的变量序列化&#xff1b;当对象被反序列…

【Linux】error: Failed to initialize NSS library

【Linux】error: Failed to initialize NSS library 原因&#xff1a;卸载了sqlite [rootnode1 ~]# rpm -qa|grep sql sqlite-3.7.17-8.el7.x86_64 rpm -e --nodeps sqlite-3.7.17-8.el7.x86_64 百度搜索 sqlite-3.7.17-8.el7.x86_64 下载此rpm包 cd /usr/local/download …

阿里云弹性计算通用算力型u1实例性能评测,性价比高

阿里云服务器u1是通用算力型云服务器&#xff0c;CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器&#xff0c;ECS通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xf…

Web实例_报表开发01-基于HTML进行报表呈现

Web实例_报表开发01-基于HTML进行报表呈现 报表开发是一种在利用了软件的基础上, 针对不同类型的报表, 进行开放的工作。 而以报表的方式, 将相关的内容、数值呈现出来的话, 则会起到更好的概况作用。 再加上, 报表开发工作是依托于计算机来完成的, 因此在效率、完整性等方面…

职场口才提升之道

职场口才提升之道 在职场中&#xff0c;口才的重要性不言而喻。无论是与同事沟通协作&#xff0c;还是向上级汇报工作&#xff0c;亦或是与客户洽谈业务&#xff0c;都需要具备良好的口才能力。一个出色的职场人&#xff0c;除了拥有扎实的专业技能外&#xff0c;还应具备出色…

探索----------------阿里云

目录 一、阿里云四大件 1、云服务器ECS 2、云数据库RDS 3、负载均衡SLB 4、对象存储OSS 5、其他的云计算产品 1&#xff09;内容分发网络CDN 2&#xff09;专有网络 VPC 二、linux发行版本 三、你平时对系统会怎么优化&#xff08;五大负载&#xff09; 1、cpu 使用率…

在project模式下自定义Implementation Strategies

Implementation Settings定义了默认选项&#xff0c;当要定义新的implementation runs时会使用这些选项&#xff0c;选项的值可以在Vivado IDE中进行配置。 图1展示了“Settings”对话框中的“implementation runs”对话框。要从Vivado IDE打开此对话框&#xff0c;请从主菜单中…

Pygame基础8-碰撞

Collisions 在Pygame中&#xff0c;我们使用矩形来移动物体&#xff0c;并且用矩形检测碰撞。 colliderect检测两个矩形是否碰撞&#xff0c;但是没法确定碰撞的方向。 Rect1.colliderect(Rect2) # collision -> return Ture # else -> return Falsecollidepoint可以…

el-upload上传图片图片、el-load默认图片重新上传、el-upload初始化图片、el-upload编辑时回显图片

问题 我用el-upload上传图片&#xff0c;再上一篇文章已经解决了&#xff0c;el-upload上传图片给SpringBoot后端,但是又发现了新的问题&#xff0c;果然bug是一个个的冒出来的。新的问题是el-upload编辑时回显图片的保存。 问题描述&#xff1a;回显图片需要将默认的 file-lis…

目标检测——车牌数据集

一、重要性及意义 交通安全与管理&#xff1a;车牌检测和识别技术有助于交通管理部门快速、准确地获取车辆信息&#xff0c;从而更有效地进行交通监控和执法。例如&#xff0c;在违规停车、超速行驶等交通违法行为中&#xff0c;该技术可以帮助交警迅速锁定违规车辆&#xff0…

ABAP SHIFT-字符串移位 和 CONDENSE去除空格

文章目录 SHIFT-字符串移位 和 CONDENSE去除空格SHIFT BY n PLACES RIGHT/LEFT运行结果 SHIFT ... UP TO ...运行结果 其他的-变量后面加括号和数字SHIFT c LEFT/RIGHT DELETING运行结果 SHIFT 去除0示例程序1运行结果示例程序2运行结果 CONDENSE示例程序运行结果 SHIFT-字符串…

DHCP实验

要求&#xff1a;全网IP范围为192.168.1.0/24&#xff0c;实现全网可达&#xff0c;HTTP服务器的域名为www.baidu.com&#xff0c;实现可以通过域名访问http 第一步、规划IP地址 按如图分别给路由器、http服务器、dns服务器、客户端配置IP地址&#xff0c;并且给pc设置为DHCP。…

BCLinux-for-Euler配置本地yum源

稍微吐槽一句…… 在这片土地上&#xff0c;国产化软件的大潮正在滚滚而来&#xff0c;虽然都不是真正意义上的国产化&#xff0c;但是至少壳是国产的~~~ 之前使用的Centos7的系统&#xff0c;现在都要求统一换成BCLinux-for-Euler。说实话换了之后不太适应&#xff0c;好多用习…

【测试篇】测试用例

文章目录 前言具体设计测试用例等价类边界值场景设计法判定表&#xff08;因果图&#xff09;正交排列&#xff08;用的非常少&#xff09;错误猜测法 前言 什么是测试用例&#xff1f;&#xff1f; 测试用例是针对软件系统或应用程序的特定功能或场景编写的一组步骤&#xf…

动态规划基础

动态规划 1、动态规划的概念 简称DP,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。常常适用于有重叠子问题和最优子结构性质的问题。 简单来说,就是给定一个问题,把它拆成一个个子问题,查到子问题可以直接解决。然后把子问题答案保存起来,以减少重复计算…