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

#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

  • 21
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

verse_armour

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值