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

不同于上篇文章只用代码控制,这次我们要再加上独立按键一同控制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;elseP2_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 leftif(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 rightif(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.hqwc.cn/news/329544.html

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

相关文章

1_工程设计模式-简单工厂设计

工程设计模式 一.简单工程设计模式 1.概念 简单工厂模式( Simple Factory Pattern )是指由一个工厂对象决定创建出哪一种产品类的实例。 但它不属于 GOF 23 种设计模式。简单工厂适用于工厂类负责创建的对象较少的场景&#xff0c;且客户端只需要传入工厂类的参数&#xff…

Qt/QML编程学习之心得:Linux下USB接口使用(25)

很多linux嵌入式系统都有USB接口,那么如何使用USB接口呢? 首先,linux的底层驱动要支持,在linux kernal目录下可以找到对应的dts文件,(device tree) usb0: usb@ee520000{compatible = "myusb,musb";status = "disabled";reg = <0xEE520000 0x100…

【两阶段鲁棒】计及需求响应的多能互补微网两阶段鲁棒优化matlab

目录 1 主要内容 算例模型 目标函数 第一阶段 第二阶段 求解流程图 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《多能互补微网两阶段鲁棒优化调度研究》&#xff0c;在考虑风光不确定集的基础上提出采用计及DR响应的多能互补微网两阶段鲁棒备用调度模…

thinkphp6实现简单定时任务

thinkphp6实现定时任务 创建定时任务文件定义指令编写Test.php代码运行测试 创建定时任务文件 Test类名根据自己的需要修改 php think make:command Test testcommand文件夹在app目录下没有需要自己创建 运行上面的命令后会在command下 多一个Test.php文件 定义指令 在conf…

Java多线程技术11——ThreadPoolExecutor类的使用2

1 isShutdown()方法 public boolean isShutdown()方法的作用是判断线程池是否已经关闭 public class Run1 {public static void main(String[] args) {Runnable runnable new Runnable() {Overridepublic void run() {try {System.out.println("开始: " Thread.c…

如何信任机器学习模型的预测结果?

在本篇中&#xff0c;我将通过一个例子演示在 MATLAB 如何使用 LIME 进行复杂机器学习模型预测结果的解释。 我使用数据集 carbig&#xff08;MATLAB 自带的数据集&#xff09;训练一个回归模型&#xff0c;用于预测汽车的燃油效率。数据集 carbig 是 70 年代到 80 年代生产的汽…

ros2在启动前准备工作:

ros2的准备工作就是&#xff1a;setup.bash内容等价于setup.sh 文件存放路径&#xff1a;/opt/ros/humble/ # generated from ament_package/template/prefix_level/local_setup.sh.in# since a plain shell script cant determine its own path when being sourced # either…

Dockerfile的ENV

文章目录 环境总结测试测试1测试2测试3测试4测试5测试6 参考 环境 RHEL 9.3Docker Community 24.0.7 总结 如果懒得看测试的详细信息&#xff0c;可以直接看结果&#xff1a; 一条 ENV 指令可以定义多个环境变量。Dockerfile里可以包含多条 ENV 指令。环境变量的值不需要用…

游戏开发中,你的游戏图片压缩格式使用ASTC了吗

文章目录 ASTC原理&#xff1a;使用要求 ASTC&#xff08;Adaptive Scalable Texture Compression&#xff0c;自适应可伸缩纹理压缩&#xff09;是一种高级的纹理压缩技术&#xff0c;由ARM公司开发并推广。它在图形处理领域中因其出色的压缩效率和灵活性而受到广泛关注。 AST…

[Linux] 一文理解HTTPS协议:什么是HTTPS协议、HTTPS协议如何加密数据、什么是CA证书(数字证书)...

之前的文章中, 已经分析介绍过了HTTP协议. HTTP协议在网络中是以明文的形式传输的. 无论是GET还是POST方法都是不安全的. 为什么不安全呢? 因为: HTTP协议以明文的形式传输数据, 缺乏对信息的保护. 如果在网络中传输数据以明文的形式传输, 网络中的任何人都可以轻松的获取数据…

软件装一送三了!还附带弹窗资讯,你确定不试一下?

前言 前几天一个朋友向我吐槽&#xff0c;说电脑太卡了。自己好像都没安装什么软件&#xff0c;怎么就那么多弹窗广告。 我看了一下他的电脑&#xff0c;笑了一下说&#xff1a;你的电脑真好&#xff0c;都会只能给你推荐美女看&#xff0c;这资讯来之不易啊&#xff0c;好好享…

20240105-工作安排的最大收益

题目要求 我们有 n 份工作&#xff0c;每份工作都安排在 startTime[i] 至 endTime[i] 期间完成&#xff0c;从而获得 profit[i] 的利润。 给你 startTime、endTime 和 profit 数组&#xff0c;返回你能获得的最大利润&#xff0c;使得子集中没有两个时间范围重叠的工作。 如…