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

📄 interrupt.c

📁 在atmega128中实现中断
💻 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 + -