下面程序在裸機上正常,在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); //增加延時節拍函數
}
}
|