三、实战应用 某宝各种肩闪灯程序
//浏览器用兼容模式浏览代码
1、长按1S以上开启红蓝闪烁功能,实用中需提醒已经长按有效,即不松手时就有显示
2、开机状态下,短按在 5HZ频闪、8HZ频闪、照明之间切换
3、开机状态下,长按1S以上关机,长按时间到就全关闭显示,这样可提醒可以松手了,松手后2S后进入睡眠模式
bit B_1ms=0;
u16 T_2s=0;
#define Const_Key_Jitter 40 //抖动计数
#define Const_Key_Long 1000 //长按1秒
u16 INT1_Cnt;
bit Short_Click;
bit Long_Click;
bit INT1_Lock;
bit Power_On;
u8 key_num;
bit key_Flag;
#define Const_Flash_5Hz_On 100 // 100ms亮 ,可调整此占空比
#define Const_Flash_5Hz_Off 100 // 100ms灭
#define Const_Flash_8Hz_On 62 // 62ms亮
#define Const_Flash_8Hz_Off 63 // 63ms灭
#define Flash_Times 5 //闪5次
u8 Temp_On; //用于数据交换
u8 Temp_On_Times;
u8 Temp_Off;
u8 Temp_Off_Times;
u8 Temp_Times;
bit FLone,FLtwo,Plon;
/*******************************************************
当短按有效时,继续计数,满足长按条件自锁
松手解锁
短按为松手后判断
长按用于开关机
*******************************************************/
void Key_Scan()
{
if(INT1==1)
{
INT1_Cnt=0; //按下计数清0
if(INT1_Lock==1) //长按锁标志
{
INT1_Lock=0;
}
else if (Short_Click==1&&(Power_On==1)) //短按标志且电源开启
{
Short_Click=0;
if(Power_On)key_Flag=1; //只有开机状态下,短按才有效
}
}
else if(INT1_Lock==0) //有键按下,且自锁标志为0,即第一次按下
{
INT1_Cnt++;
if(INT1_Cnt>=Const_Key_Jitter)
{
Short_Click=1; //短按有效标志
}
if(INT1_Cnt>=Const_Key_Long) //说明是长按,开自锁
{
INT1_Lock=1; //长按锁住
Short_Click=0;
Power_On=~Power_On; //长按开关机切换
if(Power_On==0) //长按关机时,直接关闭显示,实用中提醒
{
RED=0;
BLUE=0;
LED8=0;
}
}
}
}
/*******************************************************
当短按有效时,根据键值,切换频率
*******************************************************/
void KEY_Result()
{
if(key_Flag)
{
key_Flag=0;
key_num++;
if(key_num>=3)key_num=0;
switch(key_num)
{
case 0:
Temp_On_Times=Const_Flash_5Hz_On;
Temp_Off_Times=Const_Flash_5Hz_Off;
Temp_Times=Flash_Times;
LED8=0;
FLone=0; //开启FLASH
FLtwo=0;
break;
case 1:
Temp_On_Times=Const_Flash_8Hz_On;
Temp_Off_Times=Const_Flash_8Hz_Off;
Temp_Times=Flash_Times;
break;
case 2:
LED8=1;
FLone=1; //关闭FLASH
FLtwo=1;
RED=0;
BLUE=0;
break;
}
}
}
/*******************************************************************
标志法写闪烁循环
1、长按开机进入闪烁频率为5Hz:红闪5次,蓝闪5次,红蓝同闪5次
2、短按改变闪烁频率,即在5Hz、8Hz之间切换
3、开机状态下: 两标志位:00 表示红频闪,01表示蓝频闪 10表示红频同闪
11 表示关闭,在照明亮时设置
********************************************************************/
void RED_Flash()
{
if((Power_On)&&(FLone==0)&&(FLtwo==0))
{
if(Plon==0)
{
RED=1;
if((Temp_On--)==0)
{
Temp_On=Temp_On_Times;
Plon=1;
}
}
else
{
RED=0;
if((Temp_Off--)==0)
{
Temp_Off=Temp_Off_Times;
Plon=0;
if((Temp_Times--)==0)
{
Temp_Times=Flash_Times;
FLtwo=1;
}
}
}
}
}
void BLUE_Flash()
{
if((Power_On)&&(FLone==0)&&(FLtwo==1))
{
if(Plon==0)
{
BLUE=1;
if((Temp_On--)==0)
{
Temp_On=Temp_On_Times;
Plon=1;
}
}
else
{
BLUE=0;
if((Temp_Off--)==0)
{
Temp_Off=Temp_Off_Times;
Plon=0;
if((Temp_Times--)==0)
{
Temp_Times=Flash_Times;
FLone=1;
FLtwo=0;
}
}
}
}
}
void ALL_Flash()
{
if((Power_On)&&(FLone==1)&&(FLtwo==0))
{
if(Plon==0)
{
BLUE=1;
RED=1;
if((Temp_On--)==0)
{
Temp_On=Temp_On_Times;
Plon=1;
}
}
else
{
BLUE=0;
RED=0;
if((Temp_Off--)==0)
{
Temp_Off=Temp_Off_Times;
Plon=0;
if((Temp_Times--)==0)
{
Temp_Times=Flash_Times;
FLone=0;
FLtwo=0;
}
}
}
}
}
void Status_Init()
{
Temp_On_Times=Const_Flash_5Hz_On;
Temp_On=Temp_On_Times;
Temp_Off_Times=Const_Flash_5Hz_Off;
Temp_Off=Temp_Off_Times;
Temp_Times=Flash_Times;
BLUE=0;
RED=0;
LED8=0;
key_num=0;
FLone=0;
FLtwo=0;
}
void main( )
{
GPIO_Inilize();
Timer0_Inilize();
Exti_Inilize();
Status_Init();
delay_ms(5);
TR0=1;
EA=1;
while(1)
{
if(B_1ms==1)
{
B_1ms=0;
if(++T_2s>=2000)
{
T_2s=0;
if(INT1&&(Power_On==0))//长按松手后2s,进入睡眠状态
{
TR0=0;
Status_Init();
INT1_Clear(); //清标志 IE1=0
INT1_Enable(); //使能按键中断EX1=1,用于唤醒
MCU_POWER_DOWN(); //进入睡眠 PCON |= 2
NOP7();
}
}
Key_Scan();
RED_Flash();
BLUE_Flash();
ALL_Flash();
KEY_Result();
}
}
}
/********************* Timer0中断函数************************/
void timer0_int (void) interrupt TIMER0_VECTOR
{
TF0=0;
B_1ms=1;
}
void Ext_INT1 (void) interrupt INT1_VECTOR //进中断时已经清除标志
{
INT1_Disable(); //关闭按键中断使能 EX1=0
TR0=1;
}
浙公网安备 33010602011771号