下面程序在裸机上正常,在OS任务中只能识别短按,无法得到长按值,不知为何,请高手指点
#define const_key_time_short1 20 //短按的按键去抖动延时的时间
#define const_key_time_long1 400 //长按的按键去抖动延时的时间
#define const_key_time_short2 20 //短按的按键去抖动延时的时间
#define const_key_time_long2 400 //长按的按键去抖动延时的时间
void task4_task(void * pvParameters) //OS任务
{
static int uiKeyTimeCnt1=0;
static u8 ucKeyLock1=0;
static u8 ucShortTouchFlag1=0;
while(1)
{
if(KEY2==1)//IO是高电平,说明两个按键没有全部被按下,这时要及时清零一些标志位
{
ucKeyLock1=0; //按键自锁标志清零
uiKeyTimeCnt1=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
if(ucShortTouchFlag1==1) //短按触发标志
{
ucShortTouchFlag1=0;
K2Sec_1=1; //触发一号键的短按
}
}
else if(ucKeyLock1==0)//有按键按下,且是第一次被按下
{
uiKeyTimeCnt1++; //累加定时中断次数
if(uiKeyTimeCnt1>const_key_time_short1)
{
ucShortTouchFlag1=1; //激活按键短按的有效标志
}
if(uiKeyTimeCnt1>const_key_time_long1)
{
ucShortTouchFlag1=0; //清除按键短按的有效标志
uiKeyTimeCnt1=0;
ucKeyLock1=1; //自锁按键置位,避免一直触发
K2Sec_1=2; //触发1号键的长按
}
}
printf("task-2:%d\r\n",K2Sec_1);
vTaskDelay(100 / portTICK_RATE_MS); //增加延时节拍函数
}
}
|