MCU独立按键单控LED实现

##江科大视频学习,并且对具体的一些小细节进行更详细的分析。

什么是独立按键?

轻触按键:相当于是一种电子开关,按下开头接通,松开时开头断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。

注意:GND为负极,按下按键时相当于连通负极,传到给寄存器时反馈为0V,低电平。

        松开独立按键则为高电平---5V。

K1对应的是P3_1  K2对应的是P3_0 注意一下。

如图所示:

//P3为独立按键处所控制的寄存器if(P3_1==0) //当k1按键被按下时if(P3_1==1) // 当k1按键被松开时

以上便是我们这篇文章所要用到的基本原理。

【3-1】 独立按键控制LED亮灭

#include <REGX52.H>void main()
{while(1){if(P3_1==0) //判断独立按键是否被按下{P2_0=0;//打开第一个LED灯 }else{P2_0=1; //关上LED灯}}
/* LED是正极接正极 ,负极接负极才可以亮
此时的LED右边已经是正极VCC了,那么左边就得
为低电平0V才可亮.*/

记得将文件转为HEX文件。

【3-2】 独立按键控制LED状态

1.什么是按键的抖动?

对于机械开关,当机械触点断开,闭合时,由于机械触电的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时,也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。其实我们有两种解决方案:

  1. 硬件防止抖动(对于我们实现来说,比较困难)
  2. 软件防抖 (比较轻松实现)

回忆一下,我们有个延迟操作,刚好可以用延迟的时间来覆盖这个抖动时间。

如果忘记怎么操作了,可以看这个---点击[1-2] LED灯闪烁.

2.实现独立按键控制LED状态

#include <REGX52.H>void Delay(unsigned int xms)		//@12.000MHz
{unsigned char i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}}void main()
{while(1){//p3_1指的是k1按键if(P3_1==0){Delay(20);//20ms刚好覆盖抖动while(P3_1==0); //检测按键是否被松开Delay(20);//松开抖动 覆盖//正式操作P2_0=~P2_0;//按位取反//P2_0的L端口默认为高电频,那么就为1,按位取反后便为0}}}

本来的D1的状态为熄灭的是高电平为1,则按位取反后变为低电平为0,则D1灯亮起。

【3-3】独立按键控制LED显示二进制

插入一个知识点:

在MCU编制中,我们通常喜欢用unsigned char 变量名 ,来表示寄存器

因为unsigned char 为八位,符合寄存器大小,其大小范围为0~255。

#include <REGX52.H>
void Delay(unsigned int xms)		//@12.000MHz
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}void main()
{//八位二进制 表示一个寄存器unsigned char LEDNum=0;while(1){if(P3_1==0){Delay(20);//软件消抖while(P3_1==0);//检测松手Delay(20);//消抖LEDNum++;P2=~LEDNum; //按位取反,并赋值给P2}}}

为何要这么写?因为,常识是对于单片机上的所有L端口,初始都默认为高电平,所以都为寄存器里都为1.那么对于P2寄存器也是如此。

如果我们直接对P2进行--->P2++; 则得到0000 0000;对吧

那么然后,我们在按位取反会发生什么;---> 1111 1111;P2寄存器又回到初始状态了,然后一直这么循环下去,直接卡死在这里。所以,我们就用unsigned char LEDNum来代替寄存器,然它进行++,然后按位取反赋值给P2,便可以实现二进制位移了。

【3-4】独立按键控制LED移位.

#include <REGX52.H>
void Delay(unsigned int xms)		//@12.000MHz
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}//定义一个全局变量
unsigned char LEDNum; //一个寄存器定义void main()
{P2=~0x01;//初始化,让第一个灯亮起来if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);
//完成抖动防控后LEDNum++;if(LEDNum>=8){LEDNum=0;//回到首位置}P2=~(0x01<<LEDNum);}
//LED灯右移成功//使用k2按键控制左移if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);
//完成抖动防控后 防止越界if(LEDNum==0){LEDNum=7;//回到最右边}else{LEDNum--;}//进行位移操作P2=~(0x01<<LEDNum);}}

对于 << 这个位计算符号,大家可能有所陌生,请看下图。

请亲自动手来实现以上操作,进行加深印象。 

今天的内容便是这么多。感谢您的观看

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

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

相关文章

亿道丨三防平板也有国产,六大特点你知道多少?

国产三防平板是指由国内厂商自主研发和生产的具有防水、防尘和防摔等特性的平板电脑产品。与一般的平板电脑相比&#xff0c;国产三防平板有以下特点&#xff1a; 防护性能更好&#xff1a;国产三防平板采用的材料、密封性能以及相关的防护设计都经过严格测试和认证&#xff0c…

经典枚举算法

解析&#xff1a; 首先答案肯定是字符串的某个前缀&#xff0c;然后简单直观的想法就是枚举所有的前缀来判断&#xff0c;我们设这个前缀串长度为 lenx &#xff0c;str1 的长度为 len1&#xff0c;str2 的长度为 len2&#xff0c;则我们知道前缀串的长度必然要是两个字符串长…

AI语音系统电销机器人系统搭建,电话机器人源码是干嘛的?

电话机器人是干嘛的&#xff1f;电话机器人有用吗&#xff1f;自从电话机器人的出现&#xff0c;大家对电话销售有了新的认识。是什么黑科技竟然如此厉害&#xff0c;在没有员工操作的情况下&#xff0c;能够快速地筛选意向客户。与此同时&#xff0c;还能将客户的信息整理好。…

SpringBoot源码解读与原理分析(三十二)SpringBoot整合JDBC(一)JDBC组件的自动装配

文章目录 前言第10章 SpringBoot整合JDBC10.1 SpringBoot整合JDBC的项目搭建10.1.1 初始化数据库10.1.2 整合项目10.1.2.1 导入JDBC和MySQL驱动依赖10.1.2.2 配置数据源 10.1.3 编写业务代码10.1.3.1 编写与t_user表对应的实体类User10.1.3.2 编写Dao层代码10.1.3.3 编写Servic…

golang实现一个BasicAuth的HTTP server

之前写的《golang实现一个简单的HTTP server》没有包含认证部分 本例给出了支持BasicAuth的实现&#xff0c;以及如何在一个项目中导入自己定义的package 编写代码 创建项目所在文件夹 adminhpc-1:~/go$ mkdir auth_http adminhpc-1:~/go$ cd auth_http adminhpc-1:~/go/auth…

Oracle内存计算应用模式

前言 内存计算是利用内存来加速数据访问和应用的性能&#xff0c;并降低应用开发复杂度的技术。近十年来&#xff0c;随着软硬件技术的发展和用户需求的成熟&#xff0c;内存计算技术已经得到了广泛地应用。 Oracle在内存计算领域具有非常重要的地位&#xff0c;这主要得益于…

spring(六):事务(概念介绍、基于注解使用、事务属性介绍)

1. 事务基本概念 1.1 什么是事务 数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列&#xff0c;这些操作要么全部执行,要么全部不执行&#xff0c;是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。 1.2 事务的特…

如果我有一台服务器的话

如果我拥有一台服务器&#xff0c;我可以设想几种不同且具有创新价值的用途&#xff0c;每种用途都充分利用了服务器的计算能力和网络连接优势。 1. 部署个人创意项目 机器学习/数据分析平台&#xff1a; 我可能会选择搭建一个基于服务器的机器学习服务平台&#xff0c;用于训…

数据库应用:Windows 部署 MySQL 8.0.36

目录 一、实验 1.环境 2.Windows 部署 MySQL 8.0.36 3.Windows配置环境变量 4.Navicat链接MySQL 二、问题 1.安装MySQL 报错 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机软件版本IP备注WindowsMySQL8.0.36localhost 2.Windows 部署 MySQL 8.0.…

最新Sora人工智能视频资源网址分享

1&#xff0c;了解什么是Sora * 什么是 OpenAI Sora&#xff1f; Sora 是由 OpenAI 开发的文本到视频模型。它可以按照用户的提示生成长达一分钟的高质量和一致的视频。 * 如何使用 OpenAI Sora 模型&#xff1f; 目前&#xff0c;OpenAI Sora 模型处于内测阶段&#xff0c;并将…

Linux软件高级编程-进程基本概念--day6

1.进程&#xff1a; 程序&#xff1a; 存放在外存的一段数据组成的文件 进程&#xff1a; 是一个程序动态执行的过程&#xff0c;包括进程的创建、进程的调度、进程的消亡 2.进程相关命令&#xff1a; 1&#xff09;top&#xff1a; 动态查看当前系统中所有进程信息&#xff08…

Linux的系统错误

strerror()函数是用于获取指定错误码对应的错误信息字符串的函数。它的声明为&#xff1a; #include <string.h> char *strerror(int errnum);该函数接收一个整型参数errnum&#xff0c;表示错误码&#xff0c;然后返回一个指向错误信息字符串的指针。 使用strerror()函…

STM32程序(移植)中头文件的路径

例:#include "./BSP/LCD/lcd.h"为什么有的头文件加了路径? 先看AI的回答: 在C和C编程中&#xff0c;当我们在源文件中包含&#xff08;或称为“引入”或“导入”&#xff09;一个头文件时&#xff0c;编译器需要知道这个头文件的位置。通常&#xff0c;编译器会在…

FariyGUI × Cocos Creator 3.x 弹窗制作

在fgui里制作一个弹窗 新建一个按钮&#xff0c;作为返回按钮 新建一个标签 做成这个样子 其中包含两个节点&#xff0c;名称分别为title和closeButton 可以阅读fgui的源码window.js得到&#xff0c;closeButton按钮只需要输入名称即可在contentPane设置时自动绑定。 且会…

【C++ QT项目5】——基于HTTP与JSON数据流的天气预报界面设计

【C QT项目5】——基于HTTP与JSON数据流的天气预报界面设计 一、项目概述二、UI设计与stylesheet样式表三、天气预报数据接口四、JSON数据4.1 概述4.2 QT生成JSON数据4.3 QT解析JSON数据4.4 将JSON数据解析到QMap中 五、软件开发网络通信架构5.1 BS架构/CS架构5.2 HTTP基本概念…

Object转List

1.背景 工作中经常会遇到一个map存key为string类型 value存object&#xff0c;方便我们下文代码获取数据 2.例如 Map<String, Object> result new HashMap<>(); List<Map<String, Object>> sheet1Result new ArrayList<>(); List<String&…

二、系统知识笔记-系统架构概述

一、系统架构定义 系统架构是指对一个系统的整体结构和组成部分进行描述和规划的过程。系统架构定义决定了系统的设计、开发和实施过程中的关键方向和决策。是系统的骨架和根基&#xff0c;支撑和链接各个部分&#xff0c;包括组件、连接件、约束规范以及指导这些内容设计与演…

go语言的切片理解

var numbers4 [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}myslice : numbers4[4:6]//这打印出来长度为2fmt.Printf("myslice为 %d, 其长度为: %d\n", myslice, len(myslice))myslice myslice[:cap(myslice)]//为什么 myslice 的长度为2&#xff0c;却能访问到第四个元…

MyBatis使⽤PageHelper(MySQL)

MyBatis使⽤PageHelper&#xff08;MySQL&#xff09; 一、 limit分⻚二、PageHelper插件第⼀步&#xff1a;引⼊依赖第⼆步&#xff1a;在mybatis-config.xml⽂件中配置插件第三步&#xff1a;编写Java代码第四步&#xff1a;格式化结果查看 三、SpringBoot3 集成 PageHelper …

自动驾驶---Motion Planning之Path Boundary

1 背景 在上文《自动驾驶---Motion Planning之LaneChange》中,笔者提到过两种LaneChange的思路,这里再简单回顾一下:(1)利用Routing和周围环境的信息,决定是否进行换道的决策;(2)采用的博弈思想(蒙特卡洛树搜索---MCTS)决定是否进行换道的决策。不管是变道,避让还是…