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

相关推荐
youcans_32 分钟前
【FOC-MBD】(19)反 Park 坐标变换链路
stm32·单片机·嵌入式硬件·simulink·代码生成
国科安芯1 小时前
面向商业航天的高可靠电机控制系统:从环境约束到芯片实现
单片机·嵌入式硬件·架构·risc-v·安全性测试
零一iTEM1 小时前
PPM通信测试—FS-i6X+FS-A8S接收机+ESP32
单片机·嵌入式硬件·硬件工程·学习方法
Full Stack Developme1 小时前
Java Simple Serial Connector 教程
java·stm32·单片机
youcans_1 小时前
【FOC-MBD】(20)矢量空间脉宽调制 (SVPWM)输出
stm32·单片机·嵌入式硬件·matlab·代码生成
点灯小铭1 小时前
基于单片机的全自动洗衣机控制器设计
单片机·嵌入式硬件
念越2 小时前
蓝桥杯单元测试模拟1期模拟题答案及代码解析
蓝桥杯·单元测试·测试
Strange_Head3 小时前
《Linux系统编程篇》Linux Socket 网络编程03(Linux 进程间通信(IPC))——基础篇
linux·网络·单片机
搁浅小泽3 小时前
大电流焊点补焊要求
单片机·嵌入式硬件·可靠性工程师
Linux猿3 小时前
基于单片机浴室窗帘控制系统 | 附源码
单片机·嵌入式硬件·毕业设计·源码·课程设计·项目·基于单片机于是窗帘控制系统