lalapunk1983 发表于 2013-6-14 10:59:18

怎么实现一个多功能按键和多状态指示?

    项目中要求1个按键具备4种功能,3秒,5秒,7秒,15秒(这个时间是可以修改的),不同功能要求LED灯以不同的方式闪烁,现在是用按键的按下和弹起中断计算按键时间来做的。但是这样做操作很不友好,只有等松开按键LED才会按要求闪烁,会给人很多误解。项目要求的结果就是按键按下时间达到触发某种功能的时候LED就开始按预定的方式闪烁,然后用户就可以松开手指了。但是因为有4个状态,所以假如要实现按15秒的功能,但是到了5秒的时候可能LED就会开始按5S的功能闪烁了,这时候用户可能就会松开手指了,LED就误导了用户。
    说了这么多废话,其实要求就是:怎么在实现15S的功能之前,不让他触发3,5,7S的功能(LED不乱闪烁)。可能是思维定势了,希望大家给点建议。

little_Monkey 发表于 2013-6-14 11:03:14

定时器里面计数,LED继续走

lalapunk1983 发表于 2013-6-14 11:07:21

little_Monkey 发表于 2013-6-14 11:03 static/image/common/back.gif
定时器里面计数,LED继续走

这样子的话LED闪完3S状态,接着闪5S,接着7S,不明白的用户直接就说你的东西有问题了。这个老板就不让过,更不要说客户了。

little_Monkey 发表于 2013-6-14 11:12:15

不能等按键弹起以后再查看按了多久吗!!

lalapunk1983 发表于 2013-6-14 11:16:57

little_Monkey 发表于 2013-6-14 11:12 static/image/common/back.gif
不能等按键弹起以后再查看按了多久吗!!

不能,那样用户就像傻瓜一样了,手指不松LED就无变化,按一小时也是那样。我现在想如果这样做不行的话,就搞什么双击,三击什么的了。

mcu_lover 发表于 2013-6-14 11:28:46

换思路吧,你的要求是没有办法实现的。一个按键四种状态,用短按,长按,连按,和双击就好了。

lalapunk1983 发表于 2013-6-14 11:33:32

mcu_lover 发表于 2013-6-14 11:28 static/image/common/back.gif
换思路吧,你的要求是没有办法实现的。一个按键四种状态,用短按,长按,连按,和双击就好了。 ...

恩,基本上是的,我的案子中短按是无效的,琢磨下换思路了。

armstrong 发表于 2013-6-14 18:15:39

mcu_lover 发表于 2013-6-14 11:28 static/image/common/back.gif
换思路吧,你的要求是没有办法实现的。一个按键四种状态,用短按,长按,连按,和双击就好了。 ...

很好实现的,参考这个文章,我就不重发内容了:
http://www.cnblogs.com/embeddedtech/archive/2012/05/26/2519160.html

armstrong 发表于 2013-6-14 18:19:52

你只要在u8_t KeyProc(u8_t kindex, u8_t ksta, u8_t ktick)函数里处理KEY_STA_KEEP事件,然后根据ktick来进行你需要的时间处理,如果你认为8位ktick不够用,自己修改源代码为16位或者32位吧。

benqme 发表于 2013-6-14 18:25:59

计时器呢

lalapunk1983 发表于 2013-6-14 18:38:15

armstrong 发表于 2013-6-14 18:19 static/image/common/back.gif
你只要在u8_t KeyProc(u8_t kindex, u8_t ksta, u8_t ktick)函数里处理KEY_STA_KEEP事件,然后根据ktick来 ...

我大概看了下。但是问题不一样。我指的是当我处理长按15S之前会出现前面的3个状态,LED状态指示灯,肯定会有闪烁,也就是说在按ED按15S方式闪烁之前,会先按3S的闪烁,再5S的闪烁,再7S的闪烁,最后才会出现按15S的闪烁,当用户看到这情况时他不会像那么多,他就会认为你的设备有问题。

按键时间好算,但是要达到15S的长按状态就必须经过3S,5S,7S的状态。LED就会以几种方式闪烁。不知道我有没有说明白。现在程序改了,短按,长按,双击,三击。效果还行。
页: [1]
查看完整版本: 怎么实现一个多功能按键和多状态指示?