/*programname : 外部中止程序;
这费了我好几个小时的汗水!成功的高兴难以用言语表达!
概述:
8位流水非准确守时,一秒循环灯闪耀,等候外部中止一下降沿中止触发信号,
外部中止一旦触发,等候触发按键弹起(此刻流水灯暂停状况),中止按键一旦弹
起,持续运转上一级程序(流水灯持续运转);
accomplish time : 2014-2-7 22:47:15;
*/
#include <avr/io.h>
#include interrupt.h> //中止必备的头文件;
typedef unsigned char uint8;
typedef unsigned int uint16;
void init_io() //一切io口初始化函数;
{
DDRA=0XFF;
PORTA=0X00; //PA口输出0;
DDRB=0XFF;
PORTB=0X00; //PB口输出0;
DDRC=0XFF;
PORTC=0X00; //PC口输出0;
DDRD=~(1<<3); //INT1引脚设为输入状况;
PORTD=0XFF; //INT1引脚内部有上拉,其他引脚输出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. 先设置好由那个引脚来触发外部中止, 和触发方法;
// MCUCR 是中止触发形式操控寄存器;
MCUCR|=1<<3; //ISC11 被置一,其他位全部是零,代表 INT1 (外部中止1)下降沿发生异步中止;
//一旦 INT1 被拉低,就会进入中止子程序;
//* 2. 敞开中止使能位;
GICR |=0X80; // GICR是中止使能寄存器,最高位被置一,表明外部INT1中止使能
// (在MCUCR寄存器中,INT1被设置为下降沿异步中止触发方法);
sei();//大局中止使能函数.没有此函数,中止将无法履行.(我不知道为什么!或许是王八的屁股–规则!)
while(1)
{
PORTB|=1<<2; //使能流水灯,此刻PA口为全零(流水灯全亮);
delay(); //非准确延时1秒左右;
PORTB&=~(1<<2); //封闭流水灯;
delay(); //非准确延时1秒左右;
}
}
//==================中止服务子程序=============================
SIGNAL(SIG_INTERRUPT1) //外部中止INT1 中止服务子程序函数(中止一旦被触发,cpu将会进入此函数);
{
buzz();
while((PIND&(1<<3))==0);
}