⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interrupt.c

📁 这是利用atmega对interrupt的程序设计
💻 C
字号:
#include <iom64.h>
#include <intrinsics.h>
//定义延时程序
#define F_CPU  1		//1MHz时钟频率
#define delay_ns(t_nus)	__delay_cycles(t_nus*F_CPU)
#define delay_ms(t_mus) __delay_cycles(t_mus*F_CPU*1000)
//管脚定义
#define EXT_INT0	0	//PD0
#define EXT_INT1	1	//PD1
#define EXT_INT2	2	//PD2

#define LED0	0	//PB0
#define LED1	1	//PB1
#define LED2	2	//PB2
//宏定义
#define LED0_ON()	PORTB|=(1<<LED0)
#define LED0_OFF()	PORTB&=~(1<<LED0)
#define LED1_ON()	PORTB|=(1<<LED1)
#define LED1_OFF()	PORTB&=~(1<<LED1)
#define LED2_ON()	PORTB|=(1<<LED2)
#define LED2_OFF()	PORTB&=~(1<<LED2)

static unsigned char flag;	//全局变量

#pragma vector=INT0_vect
__interrupt void int0()		//INT0中断服务程序
{
  delay_ms(10);
  if((PIND&(1<<EXT_INT0))==0)
	LED0_ON();
  while(!(PIND&(1<<EXT_INT0)));
  delay_ms(10);
}

#pragma vector=INT1_vect
__interrupt void int1()		//INT1中断服务程序
{
  delay_ms(10);
  if((PIND&(1<<EXT_INT1))==0)
	LED1_ON();
  SREG&=0x7F;
  while(!(PIND&(1<<EXT_INT1)));
  delay_ms(10);
  SREG|=0x80;
}

#pragma vector=INT2_vect
__interrupt void int2()		//INT2中断服务程序
{
  delay_ms(10);
  if((PIND&(1<<EXT_INT2))==0)
  {
	LED0_OFF();
	LED1_OFF();
  }
  while(!(PIND&(1<<EXT_INT2)));
  flag=!flag;
  delay_ms(100);
}

int main(void)
{
  SFIOR&=0xFB;
  PORTA=0xFF;
  PORTB=0xFF;
  PORTC=0xFF;
  PORTD=0xFF;
  PORTE=0xFF;
  PORTF=0xFF;
  PORTG=0xFF;
  PORTB=~((1<<LED0)|(1<<LED1)|(1<<LED2));
  DDRB=(1<<LED0)|(1<<LED1)|(1<<LED2);
  DDRD&=0xF8;
  PORTD|=0x07;
  EICRA|=0x2A;
  EIFR=(1<<INTF1)|(1<<INTF0)|(1<<INTF2);
  EIMSK|=0x07;
  flag=0;
  SREG=0x80;
  while(1)
  {
	while(flag==0)
	  LED2_ON();
	while(flag!=0)
	  LED2_OFF();
  }
} 



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -