查看: 2980|回复: 0
打印 上一主题 下一主题

AVR外部中断怎么解决按键消抖问题?

[复制链接]
跳转到指定楼层
沙发
发表于 2014-7-26 13:45:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*******************************************************
*   程序功能:外部中断触发
*   接线说明:核心板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;
/*******************************************************
//函数名称:delay_ms(uint k)
//函数功能:延时子程序
//入口参数:k,延时时间参数
//返回参数:无
********************************************************/

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

// INT0中断服务程序
#pragma interrupt_handler int0:2
void int0(void)
{
        counter++;
        if(counter >= 16)
        counter = 0;
}

// INT1中断服务程序
#pragma interrupt_handler int1:3
void int1(void)
{
        counter--;
        if(counter <= 0)
        counter = 15;
}

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

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

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

    while (1)
    {
        PORTA = led_7[counter];                // 显示计数单元
    };
}


回复

使用道具 举报

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

本版积分规则

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