AVR单片机外部中断触发的流水灯程序
这费了我好几个小时的心血!成功的喜悦难以用言语表达!
概述:
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);
}
AVR单片机中断触发流水 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)