📄 interrupt.c
字号:
#include<iom128v.h>
#include<macros.h>
#define EXT_INT0 0
#define EXT_INT1 1
#define EXT_INT2 2
#define LED0 0
#define LED1 1
#define LED2 2
#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)
void delay_ms(unsigned char k)
{
unsigned char m,n;
for(m=0;m<k;m++)
for(n=5;n>0;n--);
}
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
CLI();
delay_ms(2);
if((PIND&(1<<EXT_INT0))==0)
LED0_ON();
while(!(PIND&(1<<EXT_INT0)));
delay_ms(2);
SEI();
}
#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{
SEI();
delay_ms(2);
if((PIND&(1<<EXT_INT1))==0)
LED1_ON();
while(!(PIND&(1<<EXT_INT1)));
delay_ms(2);
}
#pragma interrupt_handler int2_isr:4
void int2_isr(void)
{
CLI();
delay_ms(2);
if((PIND&(1<<EXT_INT2))==0)
{
LED0_OFF();
LED1_OFF();
}
while(!(PIND&(1<<EXT_INT2)));
delay_ms(2);
SEI();
}
void main(void)
{
DDRB=(1<<LED2)|(1<<LED1)|(1<<LED0); //输出
PORTB=~((1<<LED2)|(1<<LED1)|(1<<LED0)); //低电平
SFIOR=0xFB; //上拉电阻
DDRD=0xF8; //输入
PORTD=0x07; //置1
EIFR=0x07; //中断标志位清零
EIMSK=0x07; //INT0,INT1,INT2使能
EICRA=0x2A; //下降沿触发中断
SREG|=0x80; //全局中断使能
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -