文章目录
- 【蓝桥杯-单片机】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。