【51单片机】独立按键控制LED灯

news2024/11/15 22:51:54

不同于上篇文章只用代码控制,这次我们要再加上独立按键一同控制LED灯

目录

  • 独立按键控制LED亮灭:
    • 代码实现:
  • 独立按键控制LED状态:
    • 代码实现:
  • 独立按键实现二进制LED显示:
    • 代码实现:
  • 独立按键控制LED移位:
    • 代码实现:

独立按键控制LED亮灭:

由题可知,按下的时候是亮,松开时是灭

数电中我们接触过寄存器的概念,是由触发器构成的串/并输入输出构成的各种不同的寄存器,寄存器可以写也可以读取。

我们上次是在P2寄存器中写,进而控制LED灯,这次我们要与独立按键联动进行控制,在这里插入图片描述
在这里插入图片描述
有原理图可知,我们是根据P3寄存器来进行控制,这里要先普及一个概念,当我们按下独立按键后,寄存器读取为0,因为是线与状态(有一个为0就是0,独立按键接GND),学习过单片机原理后会更清楚一点,故我们可以通过P3_1来判断K1是否按下。
这里你可能又会有疑惑,我们之前用的都是P2这样的一整个寄存器,但是我们加个_就可以使用其中一个,前提是包含#include <REGX52.H>在这里插入图片描述

代码实现:

#include <REGX52.H>

void main()
{
	while(1)
	{
		if(P3_1 == 0)
			P2_0 = 0;
		else
			P2_0 = 1;		
	}
}

独立按键控制LED状态:

既然要使用按键,那么还要了解按键的特性在这里插入图片描述
由图可知,按键会造成一定的影响,那我们如何消除这个影响呢?
用到我们之前学习的延时函数Delay延时函数的使用,设置完之后我们可以延时20ms,虽然他的影响最大只有10ms。

如下代码就是按键防抖代码,要熟记于心噢

	if(P3_1 == 0)
	{
		Delay(20);
		while(P3_1 == 0);
		if(P3_1 == 1)
			Delay(20);
		
		//我们要执行的操作
	}

代码实现:

#include <REGX52.H>

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

void main()
{
	while(1)
	{
		if(P3_1 == 0)
		{
			Delay(20);
			while(P3_1 == 0);
			if(P3_1 == 1)
				Delay(20);
			
			P2_0 = ~P2_0;
		}
	}
}

独立按键实现二进制LED显示:

我们先来看这样一段代码:

void main()
{
	while(1)
	{
		if(P3_1 == 0)
		{
			Delay(20);
			while(P3_1 == 0);
			if(P3_1 == 1)
				Delay(20);
			
			P2++;
			
		}
	}
}

因为P2寄存器初始状态都为1111 1111,++后会溢出,因此最后会成为该亮的不亮,不该亮的亮,但是我们可以借鉴这个思路,巧妙取反

代码实现:

void main()
{
	unsigned char LEDNum = 1;
	while(1)
	{
		if(P3_1 == 0)
		{
			Delay(20);
			while(P3_1 == 0);
			if(P3_1 == 1)
				Delay(20);
			
			P2 = ~(LEDNum++);
			
		}
	}
}

独立按键控制LED移位:

由于博主用的开发板的LED灯顺序与江科大使用的相反,所以江科大的右移反而是博主的左移,下图就是江科大的代码实现。
在这里插入图片描述
但是博主也想搞一个K1键就是向左,K2键就是向右,于是就搞了一个适配自己板子的代码。
在这里插入图片描述

先来讲一下博主的思路:
由于灯的顺序是反的,所以用二进制看的比较别扭。
所以我们选择先使用不按8421码编排的,随后改成8421码(倒序即可)

注意:假设1为亮,故代码实现时要取反

我们先让D1亮,即为1000 0000,
随后按下K1向左移,即为0000 0001
左移时只有这一种情况需要特判,其他情况使用>>操作符(因为我们是反序)即可
继续: ::::::::0000 0010
继续: ::::::::0000 0100
. … … … … … …
循环: ::::::::1000 0000

右移也同理。

代码实现:

void main()
{	
	P2_0 = 0;

	while(1)
	{
		//move left
		if(P3_1 == 0)
		{
			//防抖动
			Delay(20);
			while(P3_1 == 0);
			if(P3_1 == 1)
				Delay(20);
			
			if(P2 == ~(0x01))
			{
				P2 = ~(0x80);
			}
			else
			{
				P2 = ~((~P2)>>1);
			}
		}
		//move right
		if(P3_0 == 0)
		{
			Delay(20);
			while(P3_0 == 0);
			if(P3_0 == 1)
				Delay(20);
			
			if(P2 == 0x7F)
			{
				P2 = 0xFE;
			}
			else
			{
				P2 = ~((~P2)<<1);
			}
		}
		
	}
}

欢迎交流。

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

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

相关文章

【C++】几种常用的类型转换

类型转换 c语言中的类型转换C的类型转换static_castreinterpret_castconst_castdynamic_cast c语言中的类型转换 在C语言中我们经常会遇到类型转化的问题&#xff0c;主要分为两种&#xff1a;显式类型转换和隐式类型转换。 显式类型转换&#xff1a;就是程序员使用强制类型转…

二叉树算法题(一)

根据二叉树创建字符串 根据二叉树创建字符串 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对 "()" 表示&#xff0c;转化后需要省…

SpringBoot全局Controller返回值格式统一处理

一、Controller返回值格式统一 1、WebResult类 在 Controller对外提供服务的时候&#xff0c;我们都需要统一返回值格式。一般定义一个 WebResult类。 统一返回值&#xff08;WebResult类&#xff09;格式如下&#xff1a; {"success": true,"code": 2…

PID各种算法的基本优缺点

PID时间系数对PID本身的影响 积分时间过小积分作用增强。 微分时间过大&#xff0c;微分控制作用过强&#xff0c;容易产生振荡。 在这里的时间系统&#xff0c;一般指的是采样的时间&#xff0c;也就是PID控制的周期。在无人机当中一般采用10ms控制一次。 一般来说采样周期越小…

PMP过了就是中级职称?

&#x1f33b;PMP项目管理专业人士认证在全球范围内受到广泛认可&#xff0c;许多人就误以为获得PMP证书就等同于获得中级职称。但是&#xff0c;事实真的如此吗❓ 1️⃣PMP不属于职称认证 ✅PMP证书&#xff1a; 是由美国项目管理协会(PMI)颁发的专业认证&#xff0c;旨在证明…

GeoServer发布地图服务(WMS、WFS)

文章目录 1. 概述2. 矢量数据源3. 栅格数据源 1. 概述 我们知道将GIS数据大致分成矢量数据和栅格数据&#xff08;地形和三维模型都是兼具矢量和栅格数据的特性&#xff09;。但是如果用来Web环境中&#xff0c;那么使用图片这个栅格形式的数据载体无疑是最为方便的&#xff0…

入库和出库的成本对不上如果如何解决

入库是前期手工录入的车价是对的&#xff0c;出库是根据销售出库单生成的 入库成本和出库成本不一致的解决方法 解决方法&#xff1a; 整车管理——正车库存——库存核算——整车出库 成本核算

FC SAN光纤交换机维护介绍

一、什么是FC SAN &#xff1f; ​存储区域网络&#xff08;Storage Area Network&#xff0c;SAN&#xff09;采用网状通道&#xff08;Fibre Channel &#xff0c;简称FC&#xff0c;区别与Fiber Channel光纤通道&#xff09;技术&#xff0c;通过FC交换机连接存储阵列和服务…

QT上位机开发(会员充值软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 所有的控件当中&#xff0c;除了label、edit、radio、combobox和button之外&#xff0c;另外一个用的比较多的控件就是grid&#xff0c;也可称之为…

李沐-《动手学深度学习-02-目标检测

一 、目标检测算法 1. R-CNN a . 算法步骤 使用启发式搜索算法来选择锚框&#xff08;选出多个锚框大小可能不一&#xff0c;需要使用Rol pooling&#xff09;使用预训练好的模型&#xff08;去掉分类层&#xff09;对每个锚框进行特征抽取&#xff08;如VGG,AlexNet…)训练…

CAD安装教程

CAD安装教程 目录 一&#xff0e; 下载CAD二&#xff0e; 安装CAD 一&#xff0e; 下载CAD 如果需要CAD安装包请私信。 二&#xff0e; 安装CAD 解压压缩包AutoCAD2022中文版&#xff0c;以管理员身份运行AutoCAD_2022_Simplified_Chinese_Win_64bit_dlm.sfx。 选择解压路径。…

DockerUI本地如何部署并结合内网穿透实现远程访问管理界面

文章目录 前言1. 安装部署DockerUI2. 安装cpolar内网穿透3. 配置DockerUI公网访问地址4. 公网远程访问DockerUI5. 固定DockerUI公网地址 前言 DockerUI是一个docker容器镜像的可视化图形化管理工具。DockerUI可以用来轻松构建、管理和维护docker环境。它是完全开源且免费的。基…

NACHI机器人虚拟示教器报I2101异常

前言 机器人示教器报&#xff1a;I2101 异常停止按钮或外部停止信号被输入 无法再示教模式下进行程序的运行&#xff01; 解决方法 结果 最后测试可以正常的运行程序

大模型实战营Day2 轻松玩转书生·浦语大模型趣味Demo

大模型&#xff1a;参数数量巨大&#xff0c;拥有庞大计算能力和参数规模的模型 InternLM &#xff1a;是一个开源的轻量级训练框架&#xff0c;旨在支持模型预训练&#xff0c;而无需广泛的依赖关系。通过单一代码库&#xff0c;它支持在具有数千个 GPU 的大规模集群上进行预训…

Spark回归分析与特征工程

回归分析是统计学和机器学习中的一个重要分支&#xff0c;用于建立因变量与自变量之间的关系模型。在大数据领域&#xff0c;Apache Spark为回归分析提供了强大的工具和库&#xff0c;以处理大规模数据集。本文将深入探讨如何使用Spark进行回归分析以及如何进行特征工程&#x…

论文阅读记录SuMa SuMa++

首先是关于SuMa的阅读&#xff0c;SuMa是一个完整的激光SLAM框架&#xff0c;核心在于“基于面元(surfel)”的过程&#xff0c;利用3d点云转换出来的深度图和法向量图来作为输入进行SLAM的过程&#xff0c;此外还改进了后端回环检测的过程&#xff0c;利用提出的面元的概念和使…

软件测试|Windows系统安装Cypress教程

前言 每当提起web自动化测试&#xff0c;大家首先想到的就是selenium&#xff0c;最近这两年时间&#xff0c;出现了playwright和cypress这两款新的工具&#xff0c;不过现在应用范围还是不如selenium&#xff0c;之前我们介绍了playwright的使用&#xff0c;现在开始&#xf…

【c++】list的特性及使用

目录 一、list的介绍 二、list的深度剖析与模拟实现 1、list图解 2、list增删查改模拟实现 三、list与vector的对比 一、list的介绍 STL中的list指的是带头双向循环链表。list是可以在常数范围内任意位置进行插入和删除的序列式容器&#xff0c;并且可以前后双向迭代。lis…

【AI视野·今日CV 计算机视觉论文速览 第283期】Thu, 4 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Thu, 4 Jan 2024 Totally 85 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers LEAP-VO: Long-term Effective Any Point Tracking for Visual Odometry Authors Weirong Chen, Le Chen, Rui Wang, Marc P…

大数据可视化Web框架——飞致云Dataease在Windows端的安装指南(多图说明版)V2.2最新版

DataEase开源代码在Windows系统开发环境搭建与调试指南_怎么部署dataease 2.0-CSDN博客https://blog.csdn.net/tllhc01/article/details/135220598?spm1001.2014.3001.5502参考这一篇&#xff0c;基于dataease2.2源码进行构建 需要先下载三个文件&#xff0c;且版本一一对应均…