/* program name : 外部中斷程序;
這費(fèi)了我好幾個(gè)小時(shí)的心血!成功的喜悅難以用言語表達(dá)!
概述:
8位流水非精確定時(shí),一秒循環(huán)燈閃爍,等待外部中斷一下降沿中斷觸發(fā)信號(hào),
外部中斷一旦觸發(fā),等待觸發(fā)按鍵彈起(此時(shí)流水燈暫停狀態(tài)),中斷按鍵一旦彈
起,繼續(xù)運(yùn)行上一級(jí)程序(流水燈繼續(xù)運(yùn)行);
accomplish time : 2014-2-7 22:47:15;
*/
#include <avr/io.h>
#include <avr/interrupt.h> //中斷必備的頭文件;
typedef unsigned char uint8;
typedef unsigned int uint16;
void init_io() //所有io口初始化函數(shù);
{
DDRA=0XFF;
PORTA=0X00; //PA口輸出0;
DDRB=0XFF;
PORTB=0X00; //PB口輸出0;
DDRC=0XFF;
PORTC=0X00; //PC口輸出0;
DDRD=~(1<<3); //INT1引腳設(shè)為輸入狀態(tài);
PORTD=0XFF; //INT1引腳內(nèi)部有上拉,其他引腳輸出1;
}
void delay()
{
uint16 u=0 ;
uint8 s=0;
for(s=0;s<200;s++)
{
for(u=0;u<50000;u++); //5毫秒左右;
}
}
void buzz()
{
uint16 s=0;
uint8 i=0;
PORTC|=0X80;
for(i=0;i<10;i++)
{
for(s=0;s<50000;s++);
}
PORTC&=~0X80;
}
int main(void)
{
init_io(); //初始化io口;
//* 1. 先設(shè)置好由那個(gè)引腳來觸發(fā)外部中斷, 和觸發(fā)方式;
// MCUCR 是中斷觸發(fā)模式控制寄存器;
MCUCR|=1<<3; //ISC11 被置一,其他位全部是零,代表 INT1 (外部中斷1)下降沿產(chǎn)生異步中斷;
//一旦 INT1 被拉低,就會(huì)進(jìn)入中斷子程序;
//* 2. 開啟中斷使能位;
GICR |=0X80; // GICR是中斷使能寄存器,最高位被置一,表示外部INT1中斷使能
// (在MCUCR寄存器中,INT1被設(shè)置為下降沿異步中斷觸發(fā)方式);
sei();//全局中斷使能函數(shù).沒有此函數(shù),中斷將無法執(zhí)行.(我不知道為什么!或許是甲魚的屁股--規(guī)定!)
while(1)
{
PORTB|=1<<2; //使能流水燈,此時(shí)PA口為全零(流水燈全亮);
delay(); //非精確延時(shí)1秒左右;
PORTB&=~(1<<2); //關(guān)閉流水燈;
delay(); //非精確延時(shí)1秒左右;
}
}
//==================中斷服務(wù)子程序=============================
SIGNAL(SIG_INTERRUPT1) //外部中斷INT1 中斷服務(wù)子程序函數(shù)(中斷一旦被觸發(fā),cpu將會(huì)進(jìn)入此函數(shù));
{
buzz();
while((PIND&(1<<3))==0);
}