分享一个自己适用的按键程序 短按 和长按
自己适用编码器,只有一个按键。做了一个短按和长按程序。首先这个程序放到中断程序中执行(中断定时1毫秒,自己根据定时时间可以调整长按时间)
bit KEYflag,KEYshort_flag,KEYlong_flag; //按键按下标志
u16 KEYdelay;//按键检测延时时间
u8KEY_set;
void keyscan()
{
if(!KEY) // 按键按下
{
if(KEYflag == 0) // 当按下标志为0时(系统启动默认就是0)
{
KEYdelay++;
KEY_set = 1;
if(KEYdelay>=2000) // 按下时间大于4秒以上表示 长按
{
KEYflag = 1; //防止再次进入此中断循环。
KEYlong_flag = 1;
KEYdelay=0;
KEY_set = 0;
}
}
}
if(KEY) // 按键松开以后根据按键时间判断按键状态
{
if(KEY_set)
{
if(KEYdelay<=20) //无效 相当于去抖动
{
KEYflag = 0;
KEYdelay = 0;
KEYlong_flag = 0;
KEYshort_flag =0;
KEY_set = 0;
}
if(KEYdelay>40 && KEYdelay<2000)//短按
{
KEYflag = 0;
KEYdelay = 0;
KEY_set = 0;
KEYshort_flag =1; //根据这个标志执行自己的程序 执行完后将此标志归0
}
}
else//没有按键动作
{
KEYflag = 0;
KEYdelay = 0;
KEYlong_flag = 0;
KEYshort_flag =0;
KEY_set = 0;
}
}
}
if(KEYshort_flag) { KEYshort_flag = 0; 执行自己的短按程序 }
if(KEYlong_flag){KEYlong_flag = 0;执行自己的长按程序 }
我也写过类似代码,用定时器中断里面写状态机实现短按 长按 双击等操作, 这个不使用延时 不拖后腿 {:4_250:}实用 优秀
页:
[1]