打印
[匠人手记]

一个按键的设计

[复制链接]
4383|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
emot|  楼主 | 2009-4-3 13:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
芯行天下| | 2009-4-3 17:02 | 只看该作者

按键程序可以在后台运行

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

使用特权

评论回复
板凳
andyzhenyu| | 2009-4-6 19:38 | 只看该作者

中断+定时器

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

使用特权

评论回复
地板
ningling_21| | 2009-5-1 20:16 | 只看该作者

很不错,学习了

使用特权

评论回复
5
tmstd| | 2009-5-15 12:05 | 只看该作者

标记

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

使用特权

评论回复
6
虾军师| | 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
7
程序匠人| | 2009-8-10 12:31 | 只看该作者
无以回报,送6分,请笑纳

使用特权

评论回复
8
虾军师| | 2009-8-10 15:22 | 只看该作者
7# 程序匠人   谢过匠人

使用特权

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

使用特权

评论回复
10
hb_haitao2009| | 2011-2-18 22:48 | 只看该作者
使用状态机和一个20MS的定时中段

使用特权

评论回复
11
haiping0823| | 2011-4-19 18:45 | 只看该作者
用一个寄存器做计数累加用,在按键有输入的情况下加一 在停止输入的时候将这个值读出来,将此值*每次调用按键扫描程序的时间 = 就是这个键按下的时间。 比如你的一个键有3个值,可以1S时候比较下,大于1S则不是短按, 大于5S则认为是超长按,大于1S 小于5S则是长按。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

15

帖子

0

粉丝