赞
踩
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/次
#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; } } } }
获取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;//流水灯是否启动标志位,上电默认启动
P1 = Led_Data;
Delay(500);
Led_Data = _crol_(Led_Data,1);//Led_Data向左移位
P1 = Led_Data;
Delay(500);
Led_Data = _cror_(Led_Data,1);//Led_Data向右移位
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;
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。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。