单击函数
int s_key()
{
if(!K)
{
delay(10);
if(!K)
{
while(!K);
return 1;
}
}
return 0;
}
双击函数
int d_key()
{
if(s_key()==1)
{
times=0;
while(times<2)
{
if(s_key()==1)
{
return 2;
}
}
return 1;
}
return 0;
}
主函数和中断服务函数
void main(void)
{
halBoardInit();
init();
while(1)
{
switch(d_key())
{
case 1:
L1=!L1;
break;
case 2:
L2=!L2;
}
}
}
HAL_ISR_FUNCTION(T1_ISR, T1_VECTOR)
{
T1STAT &=~0x20;
times++;
}
延时函数呼吸灯 双击呼吸/暂停 暂停后触发按键重置呼吸灯
void keep_b(uint16 a,uint16 i)//保持亮度函数
{
while(flag)
{
L1=1;
bdelay(a-i);
L1=0;
bdelay(i);
if(!K)
{
flag=0;
}
}
}
void breath(uint16 a)//延时函数呼吸灯
{
L2=0;
for(uint16 i=0;i<a;i++)
{
L1=1;
bdelay(a-i);
if(d_key()==2)
{
keep_b(a,i);
}
L1=0;
bdelay(i);
if(d_key()==2)
{
keep_b(a,i);
}
}
for(uint16 i=a;i>0;i--)
{
L1=1;
bdelay(a-i);
if(d_key()==2)
{
keep_b(a,i);
}
L1=0;
bdelay(i);
if(d_key()==2)
{
keep_b(a,i);
}
}
}
/********************MAIN************************/
void main(void)
{
halBoardInit();
init();
while(1)
{
if(d_key()==2)
{
break_flag=0;
flag=1;
}
while(flag)
{
breath(1000);
}
}
}
HAL_ISR_FUNCTION(T1_ISR, T1_VECTOR)
{
T1STAT &=~0x20;
times++;
}
上面的修改版,双击呼吸/暂停,暂停后双击恢复呼吸灯,可重复实现功能,只用修改保持呼吸函数
void keep_b(uint16 a,uint16 i)
{
while(flag)
{
L1=1;
bdelay(a-i);
L1=0;
bdelay(i);
if(d_key()==2) //把按键触发的!K,改成双击判断
{
flag=0;
}
}
flag=1; //再加个这个,让它继续跑呼吸循环
}
单双击长按三个效果,单击L1亮/灭,双击呼吸灯,再双击暂停,第三次双击退出,长按L1亮,L2灭,松开L1L2都亮
int s_key()//单击
{
if(!K)
{
delay(10);
if(!K)
{
L1=!L1; //单击开关L1,不能用while(!K)兜住,不然长按不好判断
return 1;
}
}
return 0;
}
int d_key()
{
if(s_key()==1)
{
times=0;
while(!K)
{
if(times>5)
{
return 3;
}
}
times=0;
while(times<2)
{
if(s_key()==1)
{
return 2;
}
}
return 1;
}
return 0;
}
void bdelay(uint16 t)
{
while(t--)
{
if(break_flag==1||flag==0)
{
flag=0;
break;
}
}
}
void keep_b(uint16 a,uint16 i)
{
while(flag)
{
L1=1;
bdelay(a-i);
L1=0;
bdelay(i);
if(d_key()==2)
{
flag=0;
}
}
//flag=1;
}
void breath(uint16 a)
{
L2=0;
for(uint16 i=0;i<a;i++)
{
L1=1;
bdelay(a-i);
if(d_key()==2)
{
keep_b(a,i);
}
L1=0;
bdelay(i);
if(d_key()==2)
{
keep_b(a,i);
}
}
for(uint16 i=a;i>0;i--)
{
L1=1;
bdelay(a-i);
if(d_key()==2)
{
keep_b(a,i);
}
L1=0;
bdelay(i);
if(d_key()==2)
{
keep_b(a,i);
}
}
}
/********************MAIN************************/
void main(void)
{
halBoardInit();
init();
while(1)
{
switch(d_key())
{
case 2:
L2=0;
break_flag=0;
flag=1;
break;
case 3:
while(!K)
{
L1=1;
L2=0;
}
L1=1;L2=1;
break;
default:
break;
}
if(d_key()==2)
{
break_flag=0;
flag=1;
}
while(flag)
{
breath(1000);
}
}
}
HAL_ISR_FUNCTION(T1_ISR, T1_VECTOR)
{
T1STAT &=~0x20;
times++;
}
按键改进,一个函数单双击长按
int s_key()
{
if(!K)
{
times=0;
while(!K)
{
if(times>5)
{
return 3;
}
}
times=0;
while(times<2)
{
if(!K)
{
return 2;
}
}
L1=!L1;
}
return 0;
}
再改,单,双,三,长按,1是单击,2是双击,3是三击,4是长按
按键按下用一个while兜住,时间超过0.5s视为长按,否则视为单击,清空计时变量times,如果在0.3秒内检测到按键按下,并在0.3秒内没有再次按下,视为双击,否则视为三连击。单击的判断是在所有按键效果之后,如果没有触发其他效果自然而然就是单击,因为最开始的if(!K)
int s_key()
{
if(!K)
{
times=0; //清空计时变量
while(!K)//长按,并作为兜住单击
{
if(times>5)
{
return 4;
}
}
times=0;//清空计时变量
while(times<3)//0.3秒的循环来判断双击
{
if(!K)//判断双击,否则视为单击
{
while(!K);//兜住按键
times=0;//清空计时变量
while(times<3)//0.3秒的循环判断三连击
{
if(!K)//判断三击,否则视为双击
{
while(!K);
return 3;//三连击
}
}
return 2;//双击
}
}
return 1;//单击
}
return 0;
}