/******************************************
功能:演示ATMEGA16的3个外部中断程序
编辑环境:ICCAVR
******************************************/
#include<iom16v.h>
#include<macros.h>
#define uint unsigned int
#define uchar unsigned char
#define beep_0 (PORTD&=~(1<<PD7))
#define beep_1 (PORTD|=(1<<PD7))
//蜂鸣器响
uint count;
/*******************************************
三个外部中断声明,注意中断向量号
*******************************/
#pragma interrupt_handler Exint0:2
#pragma interrupt_handler Exint1:3
#pragma interrupt_handler Exint2:19
/*************************************
系统延时函数
************************************/
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1140;j++);
}
}
/**************************************
端口初始化每个外部中断端口是固定的
****************************************/
void port_init()
{
DDRA=0XFF;
PORTA=0XFF;
DDRB&=(0<<PB2);//INT2
PORTB|=(1<<PB2);
DDRD&=(0<<PD2);//INT0
PORTD|=(1<<PD2);
DDRD&=(0<<PD3);//INT1
PORTD|=(1<<PD3);
}
/***********************************
外部中断初始化
*******************************/
void INT_init()
{
SREG=0X80;//打开全局中断
GICR|=(1<<INT0)|(1<<INT1)|(1<<INT2);//三个中断使能
MCUCR=(1<<ISC11)|(0<<ISC10)|(1<<ISC01)|(0<<ISC00);//INT0,INT1下降沿触发
MCUCSR=(0<<ISC2);//INT2下降沿触发中断
}
/*****************************************
流水灯函数
****************************************/
void LED_1()
{
uchar i;
for(i=0;i<8;i++)
{
PORTA=~BIT(i);
delay(200);
}
}
/***********************************
LED_2函数
**********************************/
void LED_2()
{
PORTA=0X0F;
delay(500);
PORTA=0XF0;
delay(500);
}
/********************************
LED_3函数
************************************/
void LED_3()
{
PORTA=0X81;
delay(500);
PORTA=0X7E;
delay(500);
}
/************************************
外中断0函数
**********************************/
void Exint0()
{
LED_2();
}
/**********************************
外中断1函数
***********************************/
void Exint1()
{
LED_3();
}
/************************
外中断2函数
***********************/
void Exint2()
{
DDRD=(1<<PD7);
for(count=0;count<4;count++)
{
beep_0;delay(200);
beep_1;delay(200);
}
}
/*********************************
主函数
*********************************/
void main()
{
port_init();//端口初始化
INT_init();//中断初始化
while(1)// 当非0值时执行下面函数
{
LED_1();//流水灯函数
}
}