[匠人手记] 一个按键的设计

[复制链接]
5459|10
 楼主| 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;

评分

参与人数 1威望 +6 收起 理由
程序匠人 + 6

查看全部评分

程序匠人 发表于 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则是长按。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

15

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部