文章目录
- 【蓝桥杯-单片机】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 本题总结
整体逻辑框架(详细版)
整体逻辑框架(缩略版)
按键读取模块
获取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。