单片机学习笔记---独立按键控制LED显示二进制

news2024/9/27 7:25:35

这节我们来实现独立按键的第三个功能,独立按键控制LED显示二进制

新创建一个工程文件,然后上来我们就要把基本框架写好,这是基本的习惯

老规矩,然后把Delay 1ms的代码复制过来

复制过来后改造一下:

把1ms删掉,然后给Delay函数传个参数unsigned int xms

把延时1ms的那段代码移到一个while(xms--)里面

Delay函数定义后之后,先写程序点亮测试一下

编译无错误下载程序,重启板子看看效果

点亮

延时500ms

灭掉

延时500ms

此时它正在以1秒为周期闪烁,证明程序写的没错

把测试程序的这段代码删掉

换成上一节的按键判断程序

这节主要讲解状态取反的新形式

上一节我们只是对P2的0口取反(P2_0=~P2_0)

那如果我们想要对P2的8个口都取反怎么办?

我们要引入一个变量,变量名为LEDnum,类型是unsigned char(因为char类型占1个字节,8个比特位,刚好等于寄存器的一组,寄存器以8个为一组)

我们可以先让LEDnum++然后再让它取反,赋值给P2的8个口

代码如下:

代码逻辑如下:

LEDnum原本是0,即0000 0000

第一次循环后:

LEDnum++;//0000 0001

~LEDnum;//1111 1110 (D1亮)

第二次循环后:

LEDnum++;//0000 0010

~LEDnum;//1111 1101 (D2亮)

第三次循环后:

LEDnum++;//0000 0011

~LEDnum;//1111 1100 (D1,D2亮)

第四次循环后:

LEDnum++;//0000 0100

~LEDnum;//1111 1011

第五次循环后:

LEDnum++;//0000 0101

~LEDnum;//1111 1010

第六次循环后:

LEDnum++;//0000 0110

~LEDnum;//1111 1001

第七次循环后:

LEDnum++;//0000 0111

~LEDnum;//1111 1000

第八次循环后:

LEDnum++;//0000 1000

~LEDnum;//1111 0111

第九次循环后:

LEDnum++;//0000 1001

~LEDnum;//1111 0110

第十次循环后:

LEDnum++;//0000 1010

~LEDnum;//1111 0101

第十一次循环后:

LEDnum++;//0000 1011

~LEDnum;//1111 0100

第十二次循环后:

LEDnum++;//0000 1100

~LEDnum;//1111 0011

第十三次循环后:

LEDnum++;//0000 1101

~LEDnum;//1111 0010

第十四次循环后:

LEDnum++;//0000 1110

~LEDnum;//1111 0001

第十五次循环后:

LEDnum++;//0000 1111

~LEDnum;//1111 0000

第十六次循环后:

LEDnum++;//0001 0000

~LEDnum;//1110 1111

第十七次循环后:

LEDnum++;//0001 0001

~LEDnum;//1110 1110

第十八次循环后:

LEDnum++;//0001 0010

~LEDnum;//1110 1101 

......

第255次循环后:

LEDnum++;//1111 1111

~LEDnum;//0000 0000 (全灭)

完整代码如下

#include <REGX52.H>

void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)//后置--操作完之后给xms减1
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

void main()
{
	unsigned char LEDnum=0;//0000 0000
	while(1)
	{
		if(P3_1==0)
		{
			//按键判断
			Delay(20);//按下要消抖
			while(P3_1==0);//判断是否松手,松手变成==1
			Delay(20);//松开要消抖
			
			//状态取反
			LEDnum++;//0000 0001
			P2=~LEDnum;//1111 1110
	}
}

编译无错误下载查看效果

按第一次,D1亮

按第二次,D2亮

按第二次,D1,D2亮

......

按第254次时才是全亮

按第255次时全灭

按256次之后开启第二轮循环

以上就是这节要实现的效果!

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

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

相关文章

类和对象 第四部分:友元

在程序里&#xff0c;有些私有属性&#xff0c;也想让类外特殊的一些函数或者类进行访问&#xff0c;就需要用到友元的技术 友元的目的就是让一个函数或者类&#xff0c;访问另一个类私有成员 友元的关键字为friend 一.友元的三种实现 &#xff08;一&#xff09;全局函数友元 …

【Mybatis的一二级缓存】

缓存是什么&#xff1f; 缓存其实就是存储在内存中的临时数据&#xff0c;这里的数据量会比较小&#xff0c;一般来说&#xff0c;服务器的内存也是有限的&#xff0c;不可能将所有的数据都放到服务器的内存里面&#xff0c;所以&#xff0c; 只会把关键数据放到缓存中&#x…

解决:‘chromedriver’ executable needs to be in PATH

解决&#xff1a;chromedriver’ executable needs to be in PATH 文章目录 解决&#xff1a;chromedriver’ executable needs to be in PATH背景报错问题报错翻译报错位置代码报错原因解决方法方法一&#xff1a;检查python安装路径有没有添加到环境变量里面方法二&#xff1…

C# 命名管道NamedPipeServerStream使用

NamedPipeServerStream 是 .NET Framework 和 .NET Core 中提供的一个类&#xff0c;用于创建和操作命名管道的服务器端。命名管道是一种在同一台计算机上或不同计算机之间进行进程间通信的机制。 命名管道允许两个或多个进程通过共享的管道进行通信。其中一个进程充当服务器&…

JavaSE基础面试题-线程池原理

线程池原理 线程池做的主要工作是控制线程运行的数量&#xff0c;处理过程中将任务放入队列&#xff0c;然后在线程创建后&#xff0c;启动这些任务如果线程数量超过了最大数量&#xff0c;超出数量的线程排队等候&#xff0c;等其它线程执行完成&#xff0c;再从队列中取出执…

Nodejs前端学习Day1_补档

我给day1搞没了&#xff0c;还是觉得该补一个&#xff0c;有用 文章目录 前言一、学习目标二、学习目录三、为什么JavaScript代码可以在浏览器中运行四、为什么JavaScript可以操作DOM和BOM五、浏览器中的JavaScript运行环境总结 前言 补档 一、学习目标 二、学习目录 三、为什…

二分算法模版

二分算法模版 实数二分算法模版实数二分模版题 整数二分算法模版向上取整二分模版向下取整二分模版二分模版的注意点二分模版中check函数的实现能够使用二分的条件 二分主要分两类&#xff0c; 一类是对实数进行二分&#xff0c;一类是对整数进行二分 对整数二分又分成2种&…

ubuntu20.04 安装ROS2 记录

主要参考B站古月居的ROS2入门21讲 和 以下链接&#xff08;基本和视频上一致&#xff09; ubuntu20.04安装ROS2 详细教程_ubuntu20.04 ros2-CSDN博客 但是中间有些需要注意的地方&#xff0c; 1&#xff0c;添加源 步骤中提到 sudo curl -sSL https://raw.githubuserconten…

移动Web——平面转换-旋转

1、平面转换-旋转 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style…

【JavaEE进阶】 数据库连接池与MySQL企业开发规范

文章目录 🌴数据库连接池🎋数据库连接池的使用🎄MySQL企业开发规范⭕总结🌴数据库连接池 数据库连接池负责分配、管理和释放数据库连接,它允许应⽤程序重复使⽤⼀个现有的数据库连接,⽽不是再重新建⽴⼀个. 没有使⽤数据库连接池的情况:每次执⾏SQL语句,要先创建⼀…

【JavaSE篇】——数组的定义与使用

目录 本章的目标&#xff1a; &#x1f388;数组的基本概念 &#x1f36d;创建数组 &#x1f36d;数组的初始化 &#x1f36d;数组的使用 &#x1f449;数组中元素访问 &#x1f449;遍历数组 &#x1f388;数组是引用类型 &#x1f36d;初始JVM的内存分布 &#x1f…

HarmonyOS自定义弹出对话框CustomDialog并传递变量

HarmonyOS定义了一系列弹窗反馈类的组件​ 和前端开发框架VUE3配套生态库element plus中的提供各种组件相比&#xff0c;还是要少一些。可能是手机端操作和PC端操作的差异导致的​ 如果内置的弹窗不满足要求&#xff0c;可以基于CustomDialog自定义出各种个性化的反馈组件。 首…

数据库:根据学校的业务规则画出E-R图以及数据库模型图,并构建一个简单的数据库

目录 序言 一、需求 二、E-R图 E-R图&#xff1a; 三、关系模式 数据库模型图&#xff1a; 四、在MYSQL中创建数据库 4.1 年级表的创建 4.2 科目表的创建 4.3 学生表的创建 4.4 成绩表的创建 结果如下&#xff1a; 序言 本篇文章我将通过一个具体的例子教会大家大家…

Ceph分布式存储自动化运维平台开发实践

文章目录 1. 背景介绍1.1 什么是Ceph&#xff1f;1.1.1 Ceph的核心组件1.1.2 Ceph的优势 1.2 自动化运维的需求目标 2. 平台架构设计和组件版本2.1 平台架构设计2.2 组件版本2.3 模块划分&#xff08;已经脱敏处理&#xff09;2.3.1 当前版本V1.0支持功能2.3.2 前后端代码结构t…

vivado 定义和配置I/O端口、

定义和配置I/O端口 您可以使用Vivado IDE导入、创建和配置I/O端口&#xff0c;如中所述以下部分。 导入I/O端口 根据项目类型&#xff0c;可以使用以下方法导入I/O端口&#xff1a; •I/O规划项目&#xff1a;您可以将XDC和CSV文件导入空的I/O规划项目当您使用文件导入功能…

Jmeter实现造10个账户、单元数据

今天简单介绍Jemeter的入门,Jmeter 的安装这边就跳过,直接讲述如何使用JMETER,如何运用Jmeter进行测试。Jmeter实现造10个账户、单元数据,之后大数据量批量造数据以此类推。 1.下载jmeter软件 2.安装jmeter软件 3.运行\bin\jmeter.bat批处理文件 4.选择脚本文件 5.…

全局视角,搞懂“新零售支付”

文章首发于微信公众号:PenguinPay &#xff0c;欢迎关注。 零售业就是商家将商品或服务在场所中卖给消费者。其中的关键词就是 人&#xff0c;货&#xff0c;场。 一、 初始新零售 1.1 传统零售货找人 传统零售业,只能在固定场所销售商品或服务&#xff0c;以商家店为中心只…

缓存技术—redis

一、redis介绍 1.什么是NoSQL NosQL (Not-Only:sQL)&#xff0c;泛指非关系型的数据库(关系型数据库: 以二维表形式存储数据) 非关系型的数据库现在成了一个极其热门的新领域&#xff0c;发展非常迅速。而传统的关系数据库在应付超大规模和高并发的网站已经显得力不从…

pip安装镜像源设置

01.官方镜像源&#xff1a;资料最新&#xff0c;包最全 https://pypi.python.org/simple 02.国内镜像源&#xff1a;国内访问速度快 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 03. 配置方式1&#xff1a;永久替换 pi…

Spark运行架构以及容错机制

Spark运行架构以及容错机制 1. Spark的角色区分1.1 Driver1.2 Excuter 2. Spark-Cluster模式的任务提交流程2.1 Spark On Yarn的任务提交流程2.1.1 yarn相关概念2.1.2 任务提交流程 2.2 Spark On K8S的任务提交流程2.2.1 k8s相关概念2.2.2 任务提交流程 3. Spark-Cluster模式的…