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

相关推荐
森旺电子1 小时前
51单片机仿真摇号抽奖机源程序 12864液晶显示
单片机·嵌入式硬件·51单片机
不过四级不改名6773 小时前
蓝桥杯嵌入式备赛教程(1、led,2、lcd,3、key)
stm32·嵌入式硬件·蓝桥杯
TT哇3 小时前
*【每日一题 提高题】[蓝桥杯 2022 国 A] 选素数
java·算法·蓝桥杯
Rorsion3 小时前
各种电机原理介绍
单片机·嵌入式硬件
善 .6 小时前
单片机的内存是指RAM还是ROM
单片机·嵌入式硬件
超级码农ProMax6 小时前
STM32——“SPI Flash”
stm32·单片机·嵌入式硬件
Asa3197 小时前
stm32点灯Hal库
stm32·单片机·嵌入式硬件
TT哇8 小时前
*【每日一题 基础题】 [蓝桥杯 2023 省 B] 飞机降落
算法·蓝桥杯
撞上电子8 小时前
蓝桥杯物联网开发板硬件组成
物联网·职场和发展·蓝桥杯
end_SJ8 小时前
初学stm32 --- 外部中断
stm32·单片机·嵌入式硬件