AVR_Interrupt

https://blog.csdn.net/dandri/article/details/54799300

 

 

 

 

 

 

/**
*作者:Dandri
*时间:2017/01/31
*MCU:ATMega16
*频率:8MHz
*功能:按下两次按键,LED灯亮一次
*/

#include <avr/io.h>
#include <avr/interrupt.h>

unsigned char count = 0;//用于计数按下按键的次数
unsigned char flag = 0; //用于启动点灯的标志

//中断向量地址里的程序
#pragma interrupt_handler int0_isr:2 //首先使用#pragma interrupt_handler int0_isr:2声明中断,2表示中断向量号
void int0_isr(void)
{
count++;
if (count >= 2)
{
flag = 1;
count = 0; //计数器清0
}
}

//外部中断相关的寄存器初始化,因为接的是PD2,使用的是INT0
void int0_init()
{
GIFR = 0x40; //INTF0 标志位清零
MCUCR = 0X02; //INT0下降沿触发
GICR = 0X40; //INT0触发允许
}

//引脚初始化
void port_init()
{
DDRC = 0X01;
PORTC = 0X00;
}

//亮灯程序
void led()
{
if (flag == 1)
{
PORTC = 0X01;
flag = 0;
}
else
PORTC = 0X00;
}

int main()
{
port_init();
int0_init();

asm("sei"); //启用全局中断

while(1)
{
led();
}
return 0;
}

原文地址:https://www.cnblogs.com/forever5325/p/11727721.html