6353575 发表于 2007-6-22 20:45:51

外部按键中断怎样消抖?

马老师,我现在着急呀,要马上解决这个问题.

如果用按键作为外部中断的接入,不论是抖动还是完整的按键都会触发中断,进入相应的中断程序,回为如果是沿触发,只要检测有沿(抖动也满足条件),就会触发中断,所以只能在中断服务程序里面消抖了,问题是如果用你讲义上的状态机消抖,在中断里面每隔10MS调用read_key函数,但是这时T/C0匹配中断被屏蔽了,自然10MS这个条件永远也满足不了,所以只能用中断嵌套了,让CPU一直执行定时器的中断,这个条件在保证10MS外部中断执行时能得到满足,就是如果两个中断同时满足,先执行定时器的中断,执行完后再响应外部中断,这时也满足10MS了,但是我在外部中断里面开了全局中断,用中断嵌套,仍然不能进行消抖.

 我又用软件延时10MS试了下,也不能在外部中断里面调用read_key函数.

马老师,帮我分析一下,急呀!

zjybest 发表于 2007-6-23 07:57:16

你没有看懂例子,

machao 发表于 2007-6-23 11:57:03

一个中断按键的处理,假定用INT0,外部中断函数这样处理:



1。下降沿触发中断。

2。进入中断后:记录时间,关闭INT0中断允许,设置标志key_ok=1,中断返回。这样本次按键过程不在进中断了。



主程序中采用代码:



if ((key_ok) && (key_scan))

{

    key_scan = 0;

    key_v = PIND.2;    //读按键输入口

    switch (key_state)

    {

      case key_state_0:                               

        if (key_v) key_state = key_state_1;// 键被释放,转换状态

        break;

      

      case key_state_1:

        key_state = key_state_0;

         if (key_v)               // 10ms后,键还释放,该按键过程完毕

        {

            key_ok = 0;

            清INT0中断标志位;

            允许INT0中断;

          }   

        break;

   }

}



key_scan 在定时中断中每10ms被置1。

6353575 发表于 2007-6-23 15:17:22

马老师,我反应慢,也可能我对switch语句不懂,你上面的程序是这样理解的:

 一按按键,进入中断,保存当前值,因为中断允许关了,所以马上跳出中断,到主循环,假设也刚好满足key_scan=1,自然执行你的程序,又假设现在PIND.2上的状态是释放,如果是抖动,则开始一直在key_state_0和key_state_1这两个状态循环执行,10MS进去后肯定还是释放,就结束了你的程序,但是中断还是执行过了,值也保存下来了,一次按键还是能记两个值.

 不知道我这样理解对不对?
-----此内容被6353575于2007-06-23,15:22:15编辑过

6353575 发表于 2007-6-23 15:24:45

1楼,能不能现详细指教一下.

jeffery0736 发表于 2007-7-24 16:03:29

马老师好:

    我是陈哲飞.我用的是keil,虽然写的也是c,但是不是avr.你上面的程序许多头文件定义我不知道.我想您可否把这个程序的原理说说呢?是不是进了外部中断后把中断使能标志关闭呢?其它还有什么?多谢老师了!
页: [1]
查看完整版本: 外部按键中断怎样消抖?