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

📄 m16_int.c

📁 AVR单片机外部中断测试程序
💻 C
字号:
/*===================================================================
			CopyLeft(CL) FORVERE Late Lee 
			   All rights NOT reserved
		     版权所无,翻版不究,但请保留此处信息。
			http://blog.ednchina.com/guiltcool/
			  any problem or suggestion 
			  mail to:  latelee@163.com
*文件名:	M16_INT.c
*文件说明:	外部中断测试
*版本:          v1.0
*芯片:          ATmega16
*晶振:          内部 7.372800Hz晶振
*作者:          Late Lee
*日期:          2009年2月2日 下午	    
*编译环境:      Visual C++ + WinAVR20080610(gcc 4.3.0)
*硬件环境:	INT0和INT1引脚接按钮,触发则有相关LED闪烁	
*结果:		仿真通过 WEFight Team实验板硬件通过!09-3-8
*说明:		无

====================================================================*/
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "my_type.h"

#define LED0 0
#define LED1 1

#define KEY0 2
#define KEY1 3

volatile uint8 g_key = 0;		// 与中断相关的变量,还是加一个volatile比较好

void LED_1(void)
{
	DDRA |= (1<<LED0);
	while (1)
	{
		_delay_ms(500);
		PORTA |= (1<<LED0);
		_delay_ms(500);
		PORTA &= ~(1<<LED0);
		if (g_key)		// 由于这是一个死循环,故要置一跳出语句,
			break;		// 下面调用前先将g_key清零,出现中断后其值不为零,故跳出
	}
}

void LED_2(void)
{
	DDRA |= (1<<LED1);
	while (1)
	{
		_delay_ms(200);
		PORTA |= (1<<LED1);
		_delay_ms(200);
		PORTA &= ~(1<<LED1);
		if (g_key)		// 由于这是一个死循环,故要置一跳出语句,
			break;		// 下面调用前先将g_key清零,出现中断后其值不为零,故跳出
	}
}
	
int main(void)
{
	DDRD &= ~((1<<KEY0) | (1<<KEY1));
	PORTD |= (1<<KEY0) | (1<<KEY1);

	DDRA |= (1<<LED0) | (1<<LED1);	

//	MCUCR |= (1<<ISC01) | (1<<ISC11);		// 都是下降沿触发
	MCUCR |= (1<<ISC01) | (1<<ISC11) | (1<<ISC10);	// INT0下降沿,INT1上升沿,可在仿真中看出其方式的差别
	GICR = (1<<INT0) | (1<<INT1);			// 允许两个中断
	sei();
	DDRB  = 0xff;
	DDRC  = 0xff;

	while(1)
	{	
		PORTC = 0xff;
		PORTB = 0xff;
		_delay_ms(1000);
		PORTC = 0x00;
		PORTB = 0x00;
		switch(g_key)
		{
		case 1: g_key = 0;
			LED_1();
			break;
		case 2: g_key = 0;
			LED_2();
			break;
		default:
			break;
		}
	}
	return 0;
}


/////////old OK!
/*
SIGNAL(SIG_INTERRUPT0)
{
	g_key = 1;
}

SIGNAL(SIG_INTERRUPT1)
{
	g_key = 2;
}
*/


//////////////new OK too

ISR(INT0_vect)
{
	g_key = 1;
}

ISR(INT1_vect)
{
	g_key = 2;
}

/*
int main(void)
{
	DDRA = 0xff;
	DDRB = 0xff;
	DDRC = 0xff;
	DDRD = 0xff;
	while (1)
	{
		PORTA = 0xff;
		PORTB = 0xff;
		PORTC = 0xff;
		PORTD = 0xff;
		_delay_ms(1000);
		PORTA = 0x00;
		PORTB = 0x00;
		PORTC = 0x00;
		PORTD = 0x00;
		_delay_ms(1000);
	}
	return 0;
}
*/

⌨️ 快捷键说明

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