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