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

文章目录

【蓝桥杯-单片机】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 题目解答

c 复制代码
#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)

c 复制代码
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;
}

按键消抖模块

c 复制代码
		Key_Val = Key_Read();
		Key_Down = Key_Val & (Key_Val ^ Key_Old);
		Key_Up = ~Key_Val & (Key_Val ^ Key_Old);
		Key_Old = Key_Val;

流水灯显示模式

c 复制代码
//声明变量区
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)从上向下流(循环左移)
c 复制代码
					P1 = Led_Data;
					Delay(500);
					Led_Data = _crol_(Led_Data,1);//Led_Data向左移位
(2)从下向上流(循环右移)
c 复制代码
				  P1 = Led_Data;
				  Delay(500);
				  Led_Data = _cror_(Led_Data,1);//Led_Data向右移位
(3)从外向内流
c 复制代码
				  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)从内向外流
c 复制代码
				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

相关推荐
学习路上_write12 分钟前
FPGA/Verilog,Quartus环境下if-else语句和case语句RT视图对比/学习记录
单片机·嵌入式硬件·qt·学习·fpga开发·github·硬件工程
非概念17 分钟前
stm32学习笔记----51单片机和stm32单片机的区别
笔记·stm32·单片机·学习·51单片机
jjjxxxhhh1232 小时前
FPGA,使用场景,相比于单片机的优势
单片机·嵌入式硬件·fpga开发
无敌最俊朗@2 小时前
stm32学习之路——八种GPIO口工作模式
c语言·stm32·单片机·学习
EterNity_TiMe_2 小时前
【论文复现】STM32设计的物联网智能鱼缸
stm32·单片机·嵌入式硬件·物联网·学习·性能优化
changingshow3 小时前
Arduino IDE Windows 系统 离线安装 esp32 开发板 亲测好用。
单片机·嵌入式硬件
编码小袁9 小时前
蓝桥杯:编程爱好者的试炼场
职场和发展·蓝桥杯
Chervin13 小时前
Windows,虚拟机Ubuntu和开发板三者之间的NFS服务器搭建
linux·单片机·ubuntu·arm
白-胖-子15 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-奇数序列排序
c++·算法·蓝桥杯·等考·13级
电子工程师UP学堂15 小时前
用单片机MSP430设计一个太阳能实战项目,能够详细的设计出它的硬件和软件系统
单片机