4522|9

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

怎么判断按键已经弹起 [复制链接]

就是我想用一个按钮控制51单片机的一个中断(低电平触法),中断执行完后就根据中断程序去执行其他的程序。但是在这里遇到一个问题:就是我的中断程序很短(几微秒就执行完),我按下按钮的时候瞬间就执行完了。但是由于此时我的按钮还是处于按下状态所以执行完中断程序过后马上又会参生中断。这样就导致了中断的重复执行。如果我的中断程序是把一个数取反的话,这样就会导致我不能确定到底这个数是多少了。
我问了别人,然后自己也想了一下得出了一下几种解决方案,但是我觉得都不好,所以来这里向大家请教:
1.中断程序加一个延时。延时的时间大于我按键的时间。(缺点:效率低)
2.中断用下降沿触发。可能大家刚看到这个问题的时候就想到了这个。对啊!为什么不用下降沿触法呢?我的理由是:按键有抖动,没按一个键就会参生键抖动,也就是有很多下降沿在几毫秒内产生。这样也会重复产生多个中断。(我的中断程序只有几微秒)。不知道这里可不可以用延时来消抖动?好像可以吧。。。但延时了还有下降沿吗?
3:不用中断,用键盘。可同样会有这个问题,如果我第二次键扫描程序是在我的按键没有放开之前来的。那么键扫描程序就会认为我又按下了一个键。当然,也有人说可以加一个判断啊,如果两次键扫描程序得到的键值一样则判断为没有新键按下。但是如果我根据键得到的键值去执行的程序比较长的话那么第二次键扫描程序扫描到的相同键值也许真是我第二次按下的·


可能是我自己吧问题想复杂了,希望哪位用一个比较简单的方法来解决这个问题。

最新回复

用下降沿触发法,当触发中断是,进入中断处理程序,在中断处理程序开始先关中断,然后隔个几十毫秒再检测按键状态,如果还是处于按下状态则进行相应的操作,否则认为是误触发,不予处理.在中断处理子程序的最后在开中断.这样同时还对消抖进行了软件处理.同时满足了你的要求.  详情 回复 发表于 2007-9-4 17:57
点赞 关注

回复
举报

67

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
恐怕要浪费点工作效率了!不知道在适当的地方加一个:
while(key==0);
行不行!就是说按键没有抬起程序会停在此处!
仅供参考!
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
谢谢。我不知道你这个当按键抬起时给key赋值0的这个程序怎么写。而且,对于中断来说,它是不会管你是否在执行死循环的。只有你键是按下的,那么中断程序一执行完它就又会进入中断·
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

4
 
中断产生之后就将中断关掉disable,直到变成高电平之后再enable中断
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

5
 
sterrys(sterrys) ( ) 信誉:100  2007-8-30 17:11:26  得分: 0  


   
中断产生之后就将中断关掉disable,直到变成高电平之后再enable中断

  

================================================
怎么知道已经变成了高电平 ?
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

6
 
产生低电平中断时,关闭总中断源,把该按键对应IO口的中断改为电平由低到高跳变触发,当按键放开时产生中断,再把中断方式还原即可
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

7
 
cilixc() ( ) 信誉:100  2007-08-31 09:00:24  得分: 0  


   产生低电平中断时,关闭总中断源,把该按键对应IO口的中断改为电平由低到高跳变触发,当按键放开时产生中断,再把中断方式还原即可
  

====================================================================
没懂你的意思··难道要用两个中断来控制?而且51单片机的中断只有低电平触发或着下降沿触发。接个非门?也不好控制啊··
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

8
 
你好好看看去抖动的一些文章,无论你的功能就多复杂,总可以实现
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

9
 
牺牲一个定时器,再定义全局变量存储键值和按键状态,使用定时中断扫描按键,间隔时间ms级,连续读到n次低电平,认为有按键并处理且标记按键已经处理,需要连续读到m次高电平才清除按键已经处理的标记,才可以继续计数下次按键。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

10
 
用下降沿触发法,当触发中断是,进入中断处理程序,在中断处理程序开始先关中断,然后隔个几十毫秒再检测按键状态,如果还是处于按下状态则进行相应的操作,否则认为是误触发,不予处理.在中断处理子程序的最后在开中断.这样同时还对消抖进行了软件处理.同时满足了你的要求.
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表