emot 发表于 2009-4-3 13:17

一个按键的设计

想做一个按键,一个键有3个值,短按,小于5秒的长按,超过5秒后的长按。<br />请各位不吝赐教。

芯行天下 发表于 2009-4-3 17:02

按键程序可以在后台运行

如果不用OS,按键处理程序可以在后台运行,扫描按键,当某一个按键被按下时,做个相应的标记,每一个中断去扫描一次,如果在5S内发现按键一直按下,则认为常按5S,如果超过5S了扫描发现按键还在按下认为是超过5S的常按。<br />当然这个中断要快,比如5ms或者10ms。

andyzhenyu 发表于 2009-4-6 19:38

中断+定时器

用上下沿分别触发的中断,外加定时器一个,搞定!

ningling_21 发表于 2009-5-1 20:16

很不错,学习了

tmstd 发表于 2009-5-15 12:05

标记

可以用不同的键值表示啊,不同的功能

虾军师 发表于 2009-8-8 14:33

本帖最后由 虾军师 于 2009-8-8 14:34 编辑

匠人手记有写关于这样的按键检测 :lol

事先设好50MS定时器中断服务,为中断次数自加指令,先不开计数器;
检查IO口电平,无变化退出;有变化?消抖;
消抖后再检查,无变化退出;
开计数器开关TR;检查IO口电平;
若电平回到无键状态时;
记录中断次数的值;
反复消抖检查;
若电平一直为有键转态电平,则更新放置中断次数的地址的值;
直到IO口电平为无键状态;
关闭计数器开关TR;
记录读取中断次数;
根据中断次数来断定键值;//5S刚好对应100次
短按最多1S吧?那就小于20为短按;
大于20小于100为长按;
大于100为长长按;
如果愿意,还可以再多几个长长···长长按;
//你的中断次数变量别设为unsigned char;

程序匠人 发表于 2009-8-10 12:31

无以回报,送6分,请笑纳

虾军师 发表于 2009-8-10 15:22

7# 程序匠人   谢过匠人

84335262 发表于 2009-8-26 22:38

1.闲着没事干型(就只要处理这三个按键或者按键后来点啥效果,收工):按键起反应 - 等10ms看是不是假按键,假按键则不鸟他 - 一边延时计时一边等按键消失 - 计算,大于4.5秒是短按,小于5.5是长按,其他是长长按。
2.不忙也不闲型(要处理其他事情,但是程序构成小循环,且时间小于1秒):基本按1操作,延时计时改为循环一周后计上相应时间。
3.楼上有说
4.时间异常紧张型(连反复的中断都觉得有影响自己程序的时序):有的单片机能设置引脚中断为上升沿中断还是下降沿中断……
其中12适合资源紧张但是时序、时间要求不高的使用;3是一般用法,4适合资源用的多(中断多且比较重要),时序要求高的地方使用

hb_haitao2009 发表于 2011-2-18 22:48

使用状态机和一个20MS的定时中段

haiping0823 发表于 2011-4-19 18:45

用一个寄存器做计数累加用,在按键有输入的情况下加一 在停止输入的时候将这个值读出来,将此值*每次调用按键扫描程序的时间 = 就是这个键按下的时间。 比如你的一个键有3个值,可以1S时候比较下,大于1S则不是短按, 大于5S则认为是超长按,大于1S 小于5S则是长按。
页: [1]
查看完整版本: 一个按键的设计