三、实战应用 某宝各种肩闪灯程序
作者:互联网
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; }
标签:实战,Off,Temp,Flash,Times,INT1,Const,某宝,肩闪灯 来源: https://www.cnblogs.com/Zyj1739/p/14902284.html