📄 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 + -