随手写的,就写了1个按键长按短按不同功能,不保证没BUG.注释标得也自认为是清楚了,你对着你想要的修改调试下应该就可以了.
#define Long_Push_Time n //长按功能按键时长(n乘以定时器中断周期)
#define Short_Push_Time m //短按功能按键时间,需注意必须n 大于 m
sbit KEY = Px^x; //按键IO口定义
bit Flag_Short_Push_Funcation = 0; //短按触发标志
bit Flag_Long_Push_Funcation = 0; //长按触发标志
bit Flag_KEY_Pushed = 0; //按键曾经按下标志
void Init_T0() //定时器中断设置
{
.....
}
void Short_Push_Prog()
{
..........
}
void Long_Push_Prog()
{
............
}
void mian()
{
Init_T0();
while(1)
{
if(Flag_Short_Push_Funcation) //如果短按功能被置1
{
Short_Push_Prog(); //执行短按功能对应的函数
Flag_Short_Push_Funcation = 0; //清短按功能标志.
}
if(Flag_Long_Push_Funcation) //长按功能,跟上面类同.
{
Long_Push_Prog();
Flag_Long_Push_Funcation = 0;
}
}
}
void T0_ISR() interrupt 1
{
TH0 = XXXX;
TL0 = XXXX;
if(!KEY) //按键按下
{
KEY_CNT++; //开始计时
Flag_KEY_Pushed= 1; //按键已经按过的标志置1
Flag_Short_Push_Funcation = 0; //短按无效
Flag_Long_Push_Funcation = 0; //长按无效
}
if(KEY && Flag_KEY_Pushed == 1 && KEY_CNT < Short_Push_Time)
/*如果按键没有按下但按键曾经按下,可是按下时间很短,不足以触发短按的设定时间,则认为是干扰*/
{
Flag_KEY_Pushed= 0; //清按键曾经按下标志
KEY_CNT = 0; //清按键按下计时变量
Flag_Short_Push_Funcation = 0; //短按无效
Flag_Long_Push_Funcation = 0; //长按无效
return; //如判断为干扰,则下面的代码无须执行,直接跳出.
}
if(KEY && Flag_KEY_Pushed == 1 && KEY_CNT>=Short_Push_Time &&
KEY_CNT < Long_Push_Time)
/*如果按键没有按下, 但按键已经按过(用来判断按过后弹起),
并且曾经按下时间超过 设定短按时间且不超过长按时间*/
{
Flag_Short_Push_Funcation = 1; //短按功能有效
Flag_Long_Push_Funcation = 0; //长按功能无效
KEY_CNT = 0; //清按键计时变量
Flag_KEY_Pushed= 0; //清按键曾经按下标志
return; //判断完成,直接跳出
}
}
if(KEY && Flag_KEY_Pushed == 1 && KEY_CNT>=Long_Push_Time )
/*如果按键没有按下, 但按键已经按过(用来判断按过后弹起),
且曾经按下时间超过 长按时间*/
{
Flag_Short_Push_Funcation = 0; //短按功能无效
Flag_Long_Push_Funcation = 1; //长按功能有效
KEY_CNT = 0; //清按键计时变量
Flag_KEY_Pushed= 0; //清按键曾经按下标志
}
} |