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

这节我们来实现独立按键的第三个功能,独立按键控制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 0000while(1){if(P3_1==0){//按键判断Delay(20);//按下要消抖while(P3_1==0);//判断是否松手,松手变成==1Delay(20);//松开要消抖//状态取反LEDnum++;//0000 0001P2=~LEDnum;//1111 1110}
}

编译无错误下载查看效果

按第一次,D1亮

按第二次,D2亮

按第二次,D1,D2亮

......

按第254次时才是全亮

按第255次时全灭

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

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

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

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

相关文章

解锁高效打字新境界:为何打字侠比金山打字通更好用?

大家好&#xff01;在数字化时代&#xff0c;高效的打字技能不仅是办公室工作的必备条件&#xff0c;也是提升学业和职业竞争力的重要一环。很多人熟悉金山打字通&#xff0c;但我今天要向大家介绍一个更为强大、更易用的打字练习网站——打字侠。 1. 用户界面简洁直观 打字侠…

重构改善既有代码的设计-学习(三):重新组织数据

1、拆分变量&#xff08;Split Variable&#xff09; 有些变量用于保存一段冗长代码的运算结果&#xff0c;以便稍后使用。这种变量应该只被赋值一次。 如果它们被赋值超过一次&#xff0c;就意味它们在函数中承担了一个以上的责任。如果变量承担多个责任&#xff0c;它就应该被…

信捷XD3系列PLC程序远程上下载怎么做?

准备工作 一台可联网操作的电脑一台单网口的远程透传网关及博达远程透传配置工具网线一条&#xff0c;用于实现网络连接及连接PLC一台信捷XD3 PLC及其编程软件一根232转换线、232转换头及连接线一张4G卡或WIFI天线实现通讯(使用4G联网则插入4G SIM卡&#xff0c;WIFI联网则将W…

MC3172 初探

感芯科技第一款32位 RISC处理器MC3172&#xff0c;业内首个64线程同步并行运行&#xff0c;线程资源可按需配置&#xff0c; 共享代码段空间与数据段空间&#xff0c;硬件级实时响应&#xff0c;无需中断服务程序&#xff0c;无需实时操作系统。 基于RISC-V RV32IMC 指令集&…

Redis 实际项目中的整合,记录各种用法

Redis缓存餐厅数据 我们来看主要的流程 很简单,就是在数据库和接口之间加了一层缓冲,在redis之前其实还可以加其他的缓存 例如 nginx的缓存 接下来,就是结合我的业务,来做缓存 我这里的业务逻辑是,按了分类的按钮,分别以不同的 分类为一组缓存数据 所以,这里的缓存粒度是分类…

Jmeter性能测试: 基于JDK 21 安装 Jmeter 5.6.3

目录 一、实验 1.环境 2.JDK下载 3.Jmeter下载 4.Windows安装JDK 21 5.Windows安装Jmeter 5.6.3 6.Linux安装JDK 21 7.Linux安装Jmeter 5.6.3 二、问题 1. Linux 的profile、bashrc、bash_profile文件有哪些区别 一、实验 1.环境 &#xff08;1&#xff09;主机 表…

huggingface高速下载模型的实战代码

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

Maven讲解

介绍 Maven是一个流行的构建工具和项目管理工具&#xff0c;它主要用于Java项目的构建、依赖管理和项目报告生成。Maven通过提供一致的项目结构、自动化的构建过程和强大的依赖管理&#xff0c;简化了项目的开发和维护过程。 下面是一些Maven的主要特点和用途&#xff1a; 项…

java servlet果蔬产业监管系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web果蔬产业监管系统是一套完善的java web信息管理系统 serlvetdaobean mvc 模式开发 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主 要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5…

FreeRtos Queue (二)

本篇主要讲Queue的prvLockQueue和prvUnlockQueue 一、前言 1、prvLockQueue和prvUnlockQueue是FreeRtos内核函数&#xff0c;只能供内核调用&#xff0c;应用层无法call。 2、cTxLock和cRxLock为中断上锁计数器&#xff0c;cTxLock记录了队列上锁期间在中断里入队的数量&#…

真香一个团队协作工具部署

部署 version: "3.4"services:mongo:image: mongocontainer_name: twake-dbvolumes:- /opt/Twake/data:/data/dbnode:image: twaketech/twake-node:latestcontainer_name: twake-webports:- 3345:3000# - 8000:3000environment:- DEVproduction- SEARCH_DRIVERmong…

React16源码: React中commitAllHostEffects内部的commitDeletion的源码实现

commitDeletion 1 &#xff09;概述 在 react commit 阶段的 commitRoot 第二个while循环中调用了 commitAllHostEffects&#xff0c;这个函数不仅仅处理了新增节点&#xff0c;更新节点最后一个操作&#xff0c;就是删除节点&#xff0c;就需要调用 commitDeletion&#xff0…