文章目录
- 【蓝桥杯-单片机】LED和按键小练习:Led彩灯控制系统
-
- [01 题目描述](#01 题目描述)
- [02 题目解答](#02 题目解答)
- [03 本题总结](#03 本题总结)
【蓝桥杯-单片机】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。