小工具知识网

当前位置: 首页 > 行业知识 > 【蓝桥杯-单片机】LED和按键小练习:Led彩灯控制系统

行业知识

【蓝桥杯-单片机】LED和按键小练习:Led彩灯控制系统

2026-11-14 15:23:17 来源:互联网转载

文章目录

  • 【蓝桥杯-单片机】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 #include //函数声明区//按键读取函数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->11111110unsigned 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->11111110unsigned 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。

上一篇:联想服务器怎么bios看内存?

下一篇:服务器显卡怎么取出来?