野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2912|回复: 1

下面程序在裸机上正常,在OS任务中只能识别短按,无法得到长按值

[复制链接]
发表于 2020-3-6 11:15:20 | 显示全部楼层 |阅读模式
下面程序在裸机上正常,在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)
{
          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);  //增加延时节拍函数
        }
}


回复

使用道具 举报

发表于 2020-3-6 22:07:16 | 显示全部楼层
用OS的话建议考虑按下后创建个软件定时器,等若干ms后再去读取按键电平
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 04:03 , Processed in 0.028152 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表