【蓝桥杯-单片机】LED和按键小练习:Led彩灯控制系统

文章目录

  • 【蓝桥杯-单片机】LED和按键小练习:Led彩灯控制系统
    • 01 题目描述
    • 02 题目解答
    • 03 本题总结
      • 整体逻辑框架(详细版)
      • 整体逻辑框架(缩略版)
      • 按键读取模块
      • 按键消抖模块
      • 流水灯显示模式
        • (1)从上向下流(循环左移)
        • (2)从下向上流(循环右移)
        • (3)从外向内流
        • (4)从内向外流

【蓝桥杯-单片机】LED和按键小练习:Led彩灯控制系统

01 题目描述

Led彩灯控制系统
彩灯运行模式:
模式1:Led1 – Led2 – Led3 – Led4 – Led5 – Led6 – Led7 – Led8
模式2:Led8 – Led7 – Led6 – Led5 – Led4 – Led3 – Led2 – Led1
模式3:Led1+Led8 – Led2+Led7 - Led3+Led5 – Led4+Led6
模式4:Led4+Led6 – Led3+Led5 – Led2+Led7 – Led1+Led8
按键功能定义:
S1:彩灯系统启动按键
S2:彩灯系统暂停按键
S3:显示模式调整按键(运行模式+1)(若模式4+1后返回到模式1)
S4:显示模式调整按键(运行模式-1)(若模式1-1后返回到模式4)
初始化状态:
上电时,默认为模式1-启动状态,固定流转时间500ms/次
在这里插入图片描述

02 题目解答

#include <REGX52.H>
#include <intrins.H>

//函数声明区

//按键读取函数
unsigned char Key_Read()
{
	unsigned char temp = 0;
	if(P3_4 == 0) temp = 1;
	if(P3_5 == 0) temp = 2;
	if(P3_6 == 0) temp = 3;
	if(P3_7 == 0) temp = 4;
	return temp;
}

//自定义延时函数
void Delay(unsigned int x)		//@12.000MHz
{
	unsigned char i, j;

	while(x--)
	{
		i = 2;
		j = 239;
		do{
			while(--j);
		}while(--i);
	}
}


//声明变量区
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;
unsigned char Led_Data = 0xfe;
//0xfe->11111110
unsigned char Led_34_Data[4] = {0x7e,0xbd,0xdb,0xe7};//模式3和模式4数据
//0x7e->01111110 1、8亮
//0xbd->10111101 2、7亮
//0xdb->11011011 3、6亮
//0x70->11100111 4、5亮
unsigned char Led_Mode = 0;//流水灯显示模式
unsigned char Led_34_Data_Index;//数组索引
bit Led_Flag = 1;//流水灯是否启动标志位,上电默认启动


int main()
{
	while(1)
	{
		//按键消抖
		Key_Val = Key_Read();
		Key_Down = Key_Val & (Key_Val ^ Key_Old);
		Key_Up = ~Key_Val & (Key_Val ^ Key_Old);
		Key_Old = Key_Val;
		

		switch(Key_Down)
		{
			case 1://彩灯系统启动按键
				Led_Flag = 1;
			break;
			
			case 2://彩灯系统暂停按键
				Led_Flag = 0;
			break;
			
			case 3://显示模式调整按键(moed+1)
				Led_Mode++;
				if(Led_Mode == 4) Led_Mode=0;
			break;
			
			case 4://显示模式调整按键(mode-1)
				Led_Mode--;
				if(Led_Mode == 255) Led_Mode = 3;
			break;
		}
		
		if(Led_Flag==1)
		{
			switch(Led_Mode)
			{
				case 0:
					P1 = Led_Data;
					Delay(500);
					Led_Data = _crol_(Led_Data,1);//Led_Data向左移位
				break;
				
				case 1:
					P1 = Led_Data;
				  Delay(500);
				  Led_Data = _cror_(Led_Data,1);//Led_Data向右移位
				break;
				
				case 2:
					P1 = Led_34_Data[Led_34_Data_Index];
					Delay(500);
					Led_34_Data_Index++;
					if(Led_34_Data_Index==4) Led_34_Data_Index = 0;
				break;
				
				case 3:
					P1 = Led_34_Data[Led_34_Data_Index];
					Delay(500);
					Led_34_Data_Index--;
					if(Led_34_Data_Index==255) Led_34_Data_Index = 3;
				break;
					
			}
		}
	}
}

03 本题总结

整体逻辑框架(详细版)

循环
循环
模式切换
模式切换
mode=0
mode=1
mode=2
循环
mode=3
循环
上电 默认彩灯系统启动
Key_down=1 彩灯系统启动
Key_down=2 彩灯系统暂停
Key_down=3 彩灯模式+1
Key_down=4 彩灯模式-1
Led_flag=1
Led_flag=0
Led_Mode++
Led_Mode==4
Led_Mode=0
Led_Mode--
Led_Mode==255
Led_Mode=3
Led_Data向左循环移位
Led_Data右循环移位
从左往右遍历Led_34_Data
数组Led_34_Data遍历一遍
Led_34_Data_Index==4
从右往左遍历Led_34_Data
数组Led_34_Data遍历一遍
Led_34_Data_Index==255

整体逻辑框架(缩略版)

循环
循环
模式切换
模式切换
mode=0
mode=1
mode=2
mode=3
上电 默认彩灯系统启动
Key_down=1 彩灯系统启动
Key_down=2 彩灯系统暂停
Key_down=3 彩灯模式+1
Key_down=4 彩灯模式-1
Led_flag=1
Led_flag=0
Led_Mode++
Led_Mode==4
Led_Mode=0
Led_Mode--
Led_Mode==255
Led_Mode=3
Led_Data向左循环移位
Led_Data右循环移位
从左往右遍历Led_34_Data
从右往左遍历Led_34_Data

按键读取模块

获取Key_Down的值用于分支按键功能定义:
S1:彩灯系统启动按键
S2:彩灯系统暂停按键
S3:显示模式调整按键(运行模式+1)(若模式4+1后返回到模式1)
S4:显示模式调整按键(运行模式-1)(若模式1-1后返回到模式4)

unsigned char Key_Read()
{
	unsigned char temp = 0;
	if(P3_4 == 0) temp = 1;
	if(P3_5 == 0) temp = 2;
	if(P3_6 == 0) temp = 3;
	if(P3_7 == 0) temp = 4;
	return temp;
}

按键消抖模块

		Key_Val = Key_Read();
		Key_Down = Key_Val & (Key_Val ^ Key_Old);
		Key_Up = ~Key_Val & (Key_Val ^ Key_Old);
		Key_Old = Key_Val;

流水灯显示模式

//声明变量区
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;
unsigned char Led_Data = 0xfe;
//0xfe->11111110
unsigned char Led_34_Data[4] = {0x7e,0xbd,0xdb,0xe7};//模式3和模式4数据
//0x7e->01111110 1、8亮
//0xbd->10111101 2、7亮
//0xdb->11011011 3、6亮
//0x70->11100111 4、5亮
unsigned char Led_Mode = 0;//流水灯显示模式
unsigned char Led_34_Data_Index;//数组索引
bit Led_Flag = 1;//流水灯是否启动标志位,上电默认启动
(1)从上向下流(循环左移)
					P1 = Led_Data;
					Delay(500);
					Led_Data = _crol_(Led_Data,1);//Led_Data向左移位
(2)从下向上流(循环右移)
				  P1 = Led_Data;
				  Delay(500);
				  Led_Data = _cror_(Led_Data,1);//Led_Data向右移位
(3)从外向内流
				  P1 = Led_34_Data[Led_34_Data_Index];
				  Delay(500);
				  Led_34_Data_Index++;
				  if(Led_34_Data_Index==4) Led_34_Data_Index = 0;
(4)从内向外流
				P1 = Led_34_Data[Led_34_Data_Index];
				Delay(500);
				Led_34_Data_Index--;
				if(Led_34_Data_Index==255) Led_34_Data_Index = 3;

tips:unsigned char类型的取值范围是0-255,即这里的0-1=255,当index的值减到255时需要重置index的值为3

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

USB PD快充充电器静电浪涌保护TVS

USB PD快充充电器已经成为生活中无处不在的必备物品&#xff0c;它能够为我们的各种电子设备提供快速而便捷的充电解决方案&#xff0c;比如智能手机和平板电脑&#xff0c;笔记本电脑&#xff0c;可穿戴设备&#xff0c;摄像机和摄像设备&#xff0c;汽车充电器&#xff0c;以…

图片二维码不限扫码次数怎么做?长期有效的图片二维码在线生成技巧

图片制作二维码能长期使用吗&#xff1f;在生活中很多地方都可以看到很多存有图片的二维码&#xff0c;通过扫码后查看图片内容&#xff0c;比如一些公共场所、产品介绍、景区等场所中都有图片转二维码的应用。那么怎么做出可以长期扫码展示图片二维码呢&#xff0c;其实方法很…

Awesome-Backbones-main——alexnet模型分析

AlexNet作为骨干网络相对较老&#xff0c;可能在复杂数据集上的表现不如一些最新的深度网络结构&#xff0c;如ResNet、EfficientNet等&#xff0c;学习率调整策略中采用了阶梯式学习率更新器&#xff0c;可能并不总是适合所有数据集和模型&#xff0c;需要根据具体情况调整学习…

【办公类-21-09】三级育婴师 视频转音频Python

背景需求&#xff1a; 用AI对话工具试试能否Python将MP4视频转成音频&#xff0c;再转成文字docx&#xff08;不用格式工厂转&#xff09; 结果&#xff1a; 视频MP4转音频wav 视频MP4转音频wav 作者&#xff1a;AI对话大师&#xff0c; 时间&#xff1a;2024年3月8日 impo…

开源的Java报表库JasperReports介绍

JasperReports 是一个流行的开源 Java 报表库&#xff0c;它允许开发人员创建丰富的、基于 Java 的报表&#xff0c;这些报表可以与多种数据源交互&#xff0c;并且可以很容易地集成到 Java 应用程序中。JasperReports 提供了丰富的功能&#xff0c;包括数据可视化、图表、子报…

【Vue+ElementUI】Table表格实现自定义表头展示+表头拖拽排序(附源码)

效果图 因项目采用的是Vue2&#xff0c;所以这个功能目前采用的是Vue2的写法。 Vue3请自行修改扩展代码&#xff1b;或收藏关注帖子&#xff0c;后续Vue3项目如有用到会在本帖子更新修改。 安装vuedraggable&#xff08;拖拽插件&#xff09; cnpm i vuedraggable先说用法&…

github Commits must have verified signatures

1.首先确认是否有权限&#xff0c;如有权限的情况下那就是配置有问题了 我的情况是&#xff0c;能拉取代码&#xff0c;提交的时候出现这种情况&#xff1a;Commits must have verified signatures 这里是生成证书&#xff0c;如果已经生成过的&#xff0c;就不用生成了 ssh…

GIS之深度学习08:安装GPU环境下的pytorch

环境&#xff1a; cuda&#xff1a;12.1.1 cudnn&#xff1a;12.x pytorch&#xff1a;2.2.0 torchvision&#xff1a;0.17.0 Python&#xff1a;3.8 操作系统&#xff1a;win &#xff08;本文安装一半才发现pytorch与cuda未对应&#xff0c;重新安装了cuda后才开始的&a…

超声波清洗机哪个品牌好?四款热度高超声波清洗机力荐

在当今社会&#xff0c;随着生活节奏的加快&#xff0c;年轻人越来越多地依赖眼镜来纠正视力或保护眼睛。无论是为了时尚搭配&#xff0c;还是因为长时间面对电脑和手机屏幕导致的视力问题&#xff0c;眼镜已经成为许多年轻人日常生活中不可或缺的配件。然而&#xff0c;就在我…

SSH安全协议介绍

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; SSH&#xff08;Secure Shell&#xff0c;安全外壳&#xff09;是一种网络安全协议&#xff0c;通过加密和认证机制实现安全的访问和文件传输等业…

植物病虫害:YOLO水稻虫害识别数据集(6类,五千余张图像,标注完整)

YOLO水稻虫害识别数据集&#xff0c;包含褐飞虱&#xff0c;绿叶蝉&#xff0c;正常叶片&#xff0c;稻虫&#xff0c;二化螟&#xff0c;蝇蛆6个类别&#xff0c;共五千余张图像&#xff0c;yolo标注完整。 适用于CV项目&#xff0c;毕设&#xff0c;科研&#xff0c;实验等 …

uniapp微信小程序获取当前位置

uni-app微信小程序uni.getLocation获取位置&#xff1b;authorize scope.userLocation需要在app.json中声明permission&#xff1b;小程序用户拒绝授权后重新授权-CSDN博客

AIOPS:Zabbix结合讯飞星火做自动化告警+邮件通知并基于人工智能提供解决方案

目前Zabbix官方已经提供Zabbix+ChatGPT的解决方案 ChatGPT一周年,你充分利用了吗?Zabbix+ChatGPT,轻松化解告警! 但是由于需要魔法等其他因素,比较不稳定,遂决定使用国内模型,这里我挑选的是讯飞星火,基于我之前的文档,在此基础上通过Zabbix的告警脚本实现调用AI模型…

安装及管理docker

文章目录 1.Docker介绍2.Docker安装3.免sudo设置4. 使用docker命令5.Images6.运行docker容器7. 管理docker容器8.创建image9.Push Image 1.Docker介绍 Docker 是一个简化在容器中管理应用程序进程的应用程序。容器让你在资源隔离的进程中运行你的应用程序。类似于虚拟机&#…

[LeetCode][102]二叉树的层序遍历——遍历结果中每一层明显区分

题目 102. 二叉树的层序遍历 给定二叉树的根节点 root&#xff0c;返回节点值的层序遍历结果。即逐层地&#xff0c;从左到右访问所有节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] 示例 2&#xff1a; 输入…

HDLBits刷题Day24,3.2.5.9 Design a Moore FSM

3.2.5.9 Design a Moore FSM 问题描述 分析&#xff1a; 1.s000时&#xff0c;打开fr1,fr2,fr3和补充水dfr 2.s001时&#xff0c;打开fr1,fr2 3.s011时&#xff0c;打开fr1 4.s111时&#xff0c;关闭 5.当水位下降时&#xff0c;打开dfr 绘制一下状态转移图 代码&#xff1a…

Qt Creator常见问题解决方法

Qt Creator源文件重命名的正确方法 光改文件名是不够的&#xff0c;还要在.pro文件中的SOURCES中把名字改成之后的。 中文乱码&#xff08;字符集设置&#xff09; 菜单栏-工具-选项-设置为utf-8

“Sora和Claude”大模型突起,普通人在AI人工智能赛道有哪些机遇?

文丨微三云营销总监胡佳东&#xff0c;点击上方“关注”&#xff0c;为你分享市场商业模式电商干货。 - 引言&#xff1a;去年时至今日百模大战&#xff0c;行业大模型一直是焦点的所在&#xff0c;简单来说就是“提供一个问题”或者“发布一个任务”他会根据你的指令&#x…

机器学习--循环神经网络(RNN)1

一、简介 循环神经网络&#xff08;Recurrent Neural Network&#xff09;是深度学习领域中一种非常经典的网络结构&#xff0c;在现实生活中有着广泛的应用。以槽填充&#xff08;slot filling&#xff09;为例&#xff0c;如下图所示&#xff0c;假设订票系统听到用户说&…

PyTorch基础(20)-- torch.gt() / torch.ge() / torch.le() / torch.lt()方法

一、前言 嗯……最近遇到的奇奇怪怪的方法很多了&#xff0c;学无止境啊&#xff01;学不完啊&#xff0c;根本学不完&#xff01;本篇文章介绍四个方法&#xff1a;torch.gt()、torch.ge()、torch.le()和torch.lt()方法&#xff0c;由于这四个方法很相似&#xff0c;所以放到…