【二】【单片机】有关独立按键的实验
自定义延时函数Delay
分别用Delay.c文件存储Delay函数。用Delay.h声明Delay函数。每次将这两个文件复制到工程中,直接使用。
//Delay.c
void Delay(unsigned int xms) //@11.0592MHz
{while(xms--){unsigned char i, j;i = 2;j = 199;do{while (--j);} while (--i);}}
//Delay.h
void Delay(unsigned int xms); //@11.0592MHz
独立按键控制LED灯亮灭

GND表示是低电平,P31对应K1按键,P30对应K2按键,P32对应K3按键,P33对应K4按键。
K1按键按下去,表示P31为低电平,也就是P31=0。K1按键被弹起,P31为高电平,也就是P31=1。其他的按键以此类推。
#include <REGX52.H>
void main(){while(1){if(P3_1==0){P2_0=0;}else{P2_0=1;}}
}
独立按键控制LED亮灭
独立按键控制LED灯状态
独立按键控制LED灯亮灭实验中,每当我们按下K1按键,灯亮起,如果K1被弹起,灯不亮。我们是否可以控制每当按键按下、抬起一整个阶段结束,灯才完成一次变化,亮到灭或者灭到亮?
独立按键控制LED灯的状态,每当我们按下抬起整个阶段完成,灯发生一次变化,亮到灭或者灭到亮。
#include <REGX52.H>
#include "Delay.h"
void main(){while(1){if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);P2_0=~P2_0;}}}
代码中添加Delay(20)是为了对应按键抖动。

所以我们延时20毫秒,此时按键一定处于稳定的状态。因为前后抖动加起来的时间不超过20毫秒。
所以延时20毫秒后,按键的状态可以是按下或者抬起。此时都是处于稳定的状态。
如果此时按键一直处于按下的状态,也就是P3_1=0,一直让程序空跑,直到按键被抬起,才使灯发生改变。
因为我们要使某个LED灯状态改变,所以只需要对对应二进制数进行取反即可。
独立按键控制LED灯状态
独立按键控制LED灯显示二进制
独立按键控制LED灯呈现二进制数显示。我们模拟二进制数的计算过程即可,每次进行++操作。比如说十进制的5,对应的二进制数是101,我需要让显示1的亮,显示0的不亮,所以我们还需要对二进制数进行取反。
检测范围,八个灯,全部亮是1111 1111对应的十进制数是2^8-1=255。而unsigned char的范围就是0~255。因此我们可以用unsigned char 作为二进制数的模拟数据类型。
模拟按键是完成一整个操作,状态发生一次改变。
#include <REGX52.H>
#include "Delay.h"void main(){unsigned char LEDNum=0;while(1){if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);LEDNum++;P2=~LEDNum;}}}
独立按键控制LED二进制显示
独立按键控制LED灯移位
独立按键控制LED灯移位,K1按键控制LED灯左移,K2按键控制LED灯右移。
#include <REGX52.H>
#include "Delay.h"void main(){unsigned char LEDNum=0;P2=~0x01;while(1){if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);if(LEDNum==0){LEDNum=7;}else{LEDNum--;}P2=~(0x01<<LEDNum);}if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);LEDNum++;if(LEDNum>=8){LEDNum=0;}P2=~(0x01<<LEDNum);} }}
这段代码是用来控制一个8位LED灯的亮灭和切换的程序,编写在51单片机上,利用了外部的两个按钮来控制LED灯的左右移动。
#include <REGX52.H>这一行代码是包含一个特定的头文件REGX52.H,这个文件中定义了使用51单片机系列中某个型号(如REGX52)时需要的一些特定功能和寄存器的地址。这是为了方便编程而直接使用单片机中的资源。
#include "Delay.h"这里包含了一个叫Delay.h的头文件,这个文件应该定义了一些延时函数,用于在程序中创建延迟。延迟在这种硬件控制程序中非常常见,用来等待硬件响应或者创建定时任务。
unsigned char LEDNum=0;定义了一个无符号字符变量LEDNum,并初始化为0。这个变量用来记录当前点亮的LED灯的编号(0-7)。
P2=~0x01;这行代码是将P2端口的值设置为~0x01(即11111110),使得第一个LED灯亮起。这里用到了位操作,~是位取反操作符,0x01是二进制的00000001,取反后变为11111110。
while(1){这是一个无限循环,意味着下面的代码会不断重复执行。
if(P3_1==0){这行代码检查P3端口的第二个引脚(P3_1)的状态是否为0(即是否被按下)。
Delay(20);调用Delay函数进行20ms的延时,用于消抖。消抖是因为当按键按下时,会有一个短暂的不稳定期,这时按键的电平可能会不断跳变。
while(P3_1==0);这是一个空的循环体,如果P3_1仍然为0,则一直在这里等待,直到按钮被释放。
Delay(20);再次调用Delay函数进行20ms的延时,进一步确保消抖完成,避免误操作。
if(LEDNum==0){ LEDNum=7; }else{ LEDNum--; }这部分逻辑是用于当P3_1被按下时,如果当前点亮的是第一个LED(LEDNum为0),则将LEDNum设置为7,即跳转到最后一个LED。否则,LEDNum减1,即向左移动一个LED。
P2=~(0x01<<LEDNum);这行代码是将P2端口的值设置为~(0x01<<LEDNum),通过左移操作和取反操作,来控制对应编号的LED灯亮起。
剩余的部分代码是处理另一个按钮(P3_0)的按下事件,逻辑与处理P3_1的按下类似,只是它是用于控制LED灯向右移动。
独立按键控制LED灯移位
结尾
最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。
同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。
谢谢您的支持,期待与您在下一篇文章中再次相遇!
相关文章:
【二】【单片机】有关独立按键的实验
自定义延时函数Delay 分别用Delay.c文件存储Delay函数。用Delay.h声明Delay函数。每次将这两个文件复制到工程中,直接使用。 //Delay.c void Delay(unsigned int xms) //11.0592MHz {while(xms--){unsigned char i, j;i 2;j 199;do{while (--j);}…...
AJAX踩坑指南(知识点补充)
JWT JSON Web Token是目前最为流行的跨域认证解决方案 如何获取:在使用JWT身份验证中,当用户使用其凭据成功登录时,将返回JSON Web Token(令牌) Token本质就是一个包含了信息的字符串 如何获取Token:登录成功之后,服务…...
备战蓝桥杯Day29 - 拼接最大数字问题
问题描述 有n个非负整数,将其按照字符串拼接的方式拼接为一个整数如何拼接可以使得得到的整数最大? 例: 32,94,128,1286,6,71可以拼接除的最大整数为 94716321286128。 问题思路 1.比较两个字符串的第一个数字,数值大的在前面,数值小的在…...
基于springboot的mysql实现读写分离
前言: 首先思考一个问题:在高并发的场景中,关于数据库都有哪些优化的手段?常用的有以下的实现方法:读写分离、加缓存、主从架构集群、分库分表等,在互联网应用中,大部分都是读多写少的场景,设置两个库,主库和读库,主库的职能是负责写,从库主要是负责读…...
Python爬虫之Scrapy框架系列(24)——分布式爬虫scrapy_redis完整实战【XXTop250完整爬取】
目录: 每篇前言:1.使用分布式爬取豆瓣电影信息(1)settings.py文件中的配置:(2)spider文件的更改:(3)items.py文件(两个项目一致!&…...
提升效率,稳定可靠:亚信安慧AntDB的企业价值
亚信安慧AntDB分布式数据库凭借平滑扩展、高可用性和低成本三大核心优势,在业界获得了极高的评价和认可。这些优点不仅为AntDB提供了巨大的市场发展潜力,也使其成为众多企业在数据管理上的首选解决方案。 AntDB的平滑扩展特性极大地提升了企业的灵活性和…...
洛谷入门——P1567 统计天数
统计天数 题目描述 炎热的夏日,KC 非常的不爽。他宁可忍受北极的寒冷,也不愿忍受厦门的夏天。最近,他开始研究天气的变化。他希望用研究的结果预测未来的天气。 经历千辛万苦,他收集了连续 N ( 1 ≤ N ≤ 1 0 6 ) N(1 \leq N …...
C++概述
目录 一、C关键字(63个) 二、C几个关键点: 三、C语言缺陷一:命名冲突 四、C新概念:命名空间(namespace) 五、命名空间的嵌套: 六、展开命名空间:(using …...
Linux学习笔记16 - 系统命令
1. Linux 常见系统管理命令 命令含义格式su切换用户su [选项] [用户名]ps显示系统由该用户运行的进程列表ps [选项]top动态显示系统中运行的程序(一般为每隔 5s)topkill输出特定的信号给指定 PID(进程号)的进程,并根据…...
读书笔记--阅读华为数据治理之旅有感
通过阅读华为的数据治理之旅,了解到华为公司作为高科技企业的引领者,在数据治理工作、数字化智能化转型方面的确有许许多多值得大家学习的地方,华为公司的业务范围广泛,市场竞争压力大,迫切需要用一些高效的手段来减轻员工的工作量,让员工各司其职,在各自承担的主营业务…...
网络安全协议基本问题
Http和Https协议的端口号: Http:80 Https:443 网络监听: 网络监听是一种监视网络状态、数据流程以及网络上信息传输的工具,它可以将网络界面设定成监听模式,并且可以截获网络上所传输的信息。但是网络监…...
面试(一)
一. 说一下进程和线程的区别? (1)进程是资源分配的最小单位,线程是CPU调度的最小单位。 (2)线程是进程的一部分,一个线程只能属于一个进程,一个进程可以有多个线程,但至少有一个线程。 (3)进程有自己独立地址空间&a…...
libVLC windows开发环境搭建
1.简介 LibVLC是一个强大的开源库,它构成了VLC媒体播放器的核心部分。 LibVLC提供了一系列的功能接口,使得VLC能够处理流媒体的接入、音频和视频输出、插件管理以及线程系统等核心任务。 跨平台性:VLC作为一个跨平台的多媒体播放器&#x…...
【Netty】Netty的使用和常用组件详解
目录 一、简述 1.1 什么是Netty 1.2 Netty 的优势 1.3 为什么不用 Netty5? 1.4 为什么 Netty 使用 NIO 而不是 AIO? 1.5 为什么不用 Mina? 二、第一个 Netty 程序 2.1 Bootstrap、EventLoop(Group) 、Channel 2.1.1 Bootstrap 2.1.…...
Legacy|电脑Windows系统如何迁移到新安装的硬盘?系统迁移详细教程!
前言 前面讲了很多很多关于安装系统、重装系统的教程。但唯独没有讲到电脑换了新的硬盘之后,怎么把旧系统迁移到新的硬盘上。 今天小白就来跟各位小伙伴详细唠唠: 开始之前需要把系统迁移的条件准备好,意思就是在WinPE系统下,可…...
Windows 11 安装 Scoop
[Windows 11 安装 Scoop](Windows 11 安装 Scoop) 0. 引言 Scoop 从命令行安装您熟悉和喜爱的程序,差异最小。 它的主要功能如下: 消除权限弹出窗口 隐藏 GUI 向导样式的安装程序 防止PATH污染安装大量程序 避免安装和卸载程序的意外副作用 自动查…...
新能源汽车小三电系统
小三电系统 新能源电动汽车的"小三电"系统,一般指车载充电机(OBC)、车载 DC/DC 变换器,和高压直流配电盒(PDU)。一辆纯电动汽车一般配备一台OBC 和一台车载 DC/DC 变换器。OBC将外部输入的交流电转化为直流电输出给电池,DC/DC衔接…...
面试问答示范
文章目录 请做个自我介绍您的学历是统招吗?可以在学信网查询吗是全日制吗是双证吗?请介绍一下你上家公司的情况。介绍一下你们公司的服务器架构(网络架构)。说说你在工作中处理过的最棘手的技术问题讲一讲上家公司做过的项目为什么…...
嵌入式3-22
4.输入一个秒数,输出几时几分几秒 eg:输入3670 1小时1分钟10秒 5,输入一个数,使用条件运算符实现,如果是水仙花则赋值1否则赋值0 6.终端输入一个年份,使用条件运算符实现,如果是润年则赋值1否则赋值0 …...
JAVA Synchronized对象锁和类锁区别(牛逼)
一个类就像一个四合院,四合院的大门叫做构造方法,盖房子必须经过大门,每new一个对象,就表示在四合院里再盖一间新房子,大门上面的锁,叫做构造锁,里面每一间房子就是一个实例,每间房子…...
ModbusRTU读取报文调试实战:用C#和Modbus Poll/Slave仿真器一步步抓包分析
ModbusRTU报文调试实战:从抓包分析到C#代码验证 当你第一次面对ModbusRTU协议时,那些十六进制数字组成的报文可能看起来像天书。但别担心,每个工业通信专家都曾经历过这个阶段。本文将带你用最直观的方式——抓包分析,来彻底理解M…...
2026年精选OK镜推荐榜单,三款高口碑安全品牌助您护眼新体验
在这篇文章中,我们将深入探讨OK镜的安全性以及推荐的高口碑品牌。尤其是梦戴维(Dream Vision)、小调皮和梦小新这三款品牌,通过结合用户反馈和实际评测,帮助大家更好地了解各自的特点与优势。值得一提的是,这些品牌的AP185和DV185…...
龙芯PMON USB驱动实现解析
这个目录看起来是龙芯 PMON (Processor Monitor) 固件中 USB 栈的实现。PMON 通常是一个轻量级的引导加载程序或固件环境,其 USB 驱动的实现方式可能与完整的 Linux 内核驱动有所不同,更倾向于直接硬件操作和简化的设备发现机制。 我将按照以下步骤详细解释这些文件的作用、…...
Roboto字体架构深度解析:现代无衬线字体的工程实现
Roboto字体架构深度解析:现代无衬线字体的工程实现 【免费下载链接】roboto The Roboto family of fonts 项目地址: https://gitcode.com/gh_mirrors/ro/roboto Roboto作为Google Material Design体系的核心字体,其技术架构体现了现代字体设计的工…...
3步轻松备份QQ空间回忆:GetQzonehistory让青春记忆永不丢失
3步轻松备份QQ空间回忆:GetQzonehistory让青春记忆永不丢失 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾担心QQ空间里的青春记忆会随着时间流逝而消失࿱…...
Vivado里用Block Memory Generator搞个双端口RAM,这5个坑我帮你踩过了
Vivado双端口RAM配置实战:Block Memory Generator避坑指南 在FPGA开发中,高效利用片上存储资源是提升系统性能的关键。Xilinx Vivado提供的Block Memory Generator(BMG)IP核能够快速生成优化的存储结构,但其中双端口RA…...
3分钟快速上手:多平台资源下载神器res-downloader终极指南
3分钟快速上手:多平台资源下载神器res-downloader终极指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 在当今…...
10分钟快速上手:一站式AI变声神器RVC全平台部署终极指南
10分钟快速上手:一站式AI变声神器RVC全平台部署终极指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Conve…...
CUDA driver error: invalid argument问题修改
训练qwen2时遇到了这个报错,只需要清理缓存即可。rm -rf ~/.cache/torch/kernels/...
别再死磕A*了!用MATLAB从零实现RRT*路径规划(附完整代码与避坑指南)
从A到RRT:MATLAB实战高维空间路径规划全解析 当传统栅格搜索算法在机器人关节空间或复杂三维环境中捉襟见肘时,概率采样方法正成为新一代路径规划的核心利器。本文将带您深入理解RRT算法相对于A的突破性优势,并通过MATLAB完整实现过程&#…...
