标题: 求助单片机C语言按键的不同时间长按识别程序 [打印本页]

作者: 1314love    时间: 2023-3-20 14:08
标题: 求助单片机C语言按键的不同时间长按识别程序
请问怎么写3s识别一次长按,Led灯亮,4秒也实现一次长按,Led灯灭。而且不能按键松开才执行效果,不能用任何循环语句(while或者for循环),只能用判断语句来识别.
作者: zhuls    时间: 2023-3-20 14:34
3秒和4秒的差别,一个开一个关,普通人实操时还真掐不准这时间。。。不能用循环,就用定时器计数吧~~
作者: xunzhaod    时间: 2023-3-20 14:38
void keyscan()
{
   if(keydownd)
{
  timercnt++;
  if(timercnt > 3000)
  {
     timercnt  = 0;
     led_on();
  }
}
else
{
timercnt  = 0;
}
}
作者: 188610329    时间: 2023-3-20 16:49
不松开才执行,怎么在三秒的时候知道你不是打算按4秒呢?你不觉得这个要求前后矛盾么?
作者: 天ノ忆    时间: 2023-3-20 17:29
0秒的时候检测按下,
三秒的时候检测松开,如果松开用个标志位记下,
四秒的时候检测松开,如果松开再用个标志位记下,
检测完了根据这两个标志位就知道一共按了三秒还是4秒了。

当然,这个方法即时性不高,你可以提高检测频率从而提高即时性
作者: zhouwang4135463    时间: 2023-3-20 19:57
最好是使用定时器实现会比较方便
作者: wulin    时间: 2023-3-21 07:00
设计按键短按长按本身不是什么难题,问题是逻辑上要能说得通。长按不等按键松开就执行效果也很简单。但你按下时间达3秒,单片机如何判断你想按3秒还是4秒必须有另一个判断条件,否则办不到。比如按下时间达3秒,查询LED状态,LED状态灭则开亮,否则等待到达4秒时关闭。
作者: 人中狼    时间: 2023-3-21 08:01
这是纯粹的偷懒,想通过单一的东西获得多个结果,最后只得到一个大麻烦

作者: coody_sz    时间: 2023-3-21 09:59
检测到按下,计数即可,超级简单
作者: cxxx180    时间: 2023-3-21 11:24
MultiButton你值得拥有github.com/0x1abin/MultiButton
作者: 18680365301    时间: 2023-4-4 17:54
//10ms内处理
if(Key1_IO == 0)
{
    if(Key_Count != 0xffff)
   {
     Key_Count++;
   }
    if(Key_Count == 300)
    {
      Led_IO = ON;
    }
    if(Key_Count == 400)
    {
     Led_IO = OFF;
    }
}
else

{
   Key_Count = 0;

}


作者: rctty    时间: 2023-4-6 14:41
这样吧,直接开一个定时器的输入捕获通道,然后再读捕获到的电平时间,就能判断是3秒还是4秒了;当然,确保你的按键没有抖动,但机械按键没抖动好像不太可能,那就吧抖动忽略,毕竟对于3、4秒来说抖动是很短暂的
作者: rayin    时间: 2023-4-8 08:17
用定时器1ms中断计时, 加状态机就可以实现按键防抖功能以及单按,长按,双击,等功能.
作者: li64331218    时间: 2023-4-8 10:20
不知道要实现什么效果,如果按着一直不动,按你的要求会看到灯亮一下就灭掉。然后就没有了。除非松开 再重新长按。可以开个定时器来实现,10ms中断。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1