avr单片机的主函数中增加了初始化中断的程序,主函数就不进入while(1)下面了程序。去掉初始化中断就执行了。
#include <mega64.h>
#include <delay.h>
void PortInitial(void)
{
DDRC = 0xff; //PC口作为led灯,低电平亮
PORTC = 0x55; //初始化部分灯亮
DDRD &= 0xf0; //PC0-4口设置初始化输入
PORTD |= 0x0f; //PC0-4上拉
}
void DeviceInitial(void)
{
#asm("cli"); //关闭总中断
#asm("nop"); //延时
EIFR = 0x00; //清除中断状态位
EIMSK = 0x00; //关闭中断
EICRA = (1<<ISC11)|(0<<ISC10)|(0<<ISC01)|(0<<ISC00); //INT0设置低电平触发,INT1设置下降沿触发
EIMSK = 0xff; //使能中断
#asm("sei"); //使能总中断
#asm("nop");
}
void main()
{
PortInitial();
DeviceInitial(); //中断初始化,如果增加了,就进不去while,不增加可以进入?????
#asm("nop");
while(1)
{
PORTC = 0X00; //led0-7点亮
}
}
interrupt [EXT_INT0] void led0ctrl (void) //外部中断1,低电平触发
{ volatile int i = 8;
volatile int ledstaus = 0xfe;
delay_ms(10);
while(!(PIND&0x01)) //PD0口按下未释放时,程序在里面执行流水灯程序
{
PORTC =ledstaus;
ledstaus = ledstaus<<1;
ledstaus +=1;
delay_ms(50);
i--;
if(!i)
{ ledstaus = 0xfe; i=8;}
}
EIFR = 0x00; //清除中断状态位
} |