查看: 1014|回复: 4
打印 上一主题 下一主题

AVR外部中断怎么消抖?求大神支招!!!

[复制链接]
跳转到指定楼层
沙发
发表于 2014-7-24 13:34:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*******************************************************
*   程序功能:外部中断触发
*   接线说明:核心板JP2 PA0-PA7连接到系统底板静态数码管显示电路JP71,PD2,PD3接到JP74上的DK0,DK1
*   实验现象:按下DK0数码管加1,按下DK1数码管减1
*        日    期 : 2014/7/24
*        作    者 : 翟志刚
*******************************************************/
#include <iom16v.h>
#include <macros.h>
#define  uchar unsigned char
#define  uint  unsigned int

uchar led_7[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//数码管从0显示到F
uchar counter = 0,FLAG = 0,FLAG1 = 0;

void delay_1ms(uint k)
{
    uint i,j;
    for(i=0;i<k;i++)
    {
       for(j=0;j<100;j++)
       ;
    }
}

// INT0中断服务程序
#pragma interrupt_handler int0:2
void int0(void)
{
  delay_1ms(30); FLAG = 1;
}

// INT1中断服务程序
#pragma interrupt_handler int1:3
void int1(void)
{
    DDRD = 0x00;delay_1ms(30);FLAG1 = 1;
}

void main(void)
{
    PORTA=0xFF;     //初始化
    DDRA=0xFF;

    SREG=0x80;        // 全局中断允许
    GICR|=0xC0;                // 允许INT0、INT1中断
    MCUCR=0x0A;                // INT0、INT1下降沿触发
    GIFR=0xC0;                // 清除INT0、INT1中断标志位

    counter = 0;        // 计数单元初始化为0



    while (1)
    {
              if(FLAG == 1)
        {

            FLAG = 0;
            counter++;
            if(counter >= 16)counter = 0;
        }
        if(FLAG1 == 1)
        {
            //delay_1ms(2);
            FLAG1 = 0;
            counter--;
            if(counter <= 0)counter = 15;
        }
              PORTA = led_7[counter];                // 显示计数单元
    }
}


回复

使用道具 举报

板凳
发表于 2014-7-25 10:24:10 | 只看该作者
不能理解。求高手
回复 支持 反对

使用道具 举报

地板
发表于 2014-7-27 09:29:19 | 只看该作者
叫你要少用DELAY()函数,知道不,没事多用用中断,中断多好啊,定时准确,这样就不会有那啥啥影子存在,你的问题中断消抖,我不懂耶,谁叫我是水货呢,哈哈哈
回复 支持 反对

使用道具 举报

4#
发表于 2014-7-27 18:57:27 | 只看该作者
本帖最后由 伊海 于 2014-7-27 18:58 编辑

很好,好好想下,加油
回复 支持 反对

使用道具 举报

5#
发表于 2014-7-28 08:50:08 | 只看该作者
搞其他的功能吧,那个其实已经弄的差不多了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表