如果不加外部中断的话,就是不加入按键操作的话,四种LED花灯样式可以正常实现,我觉得应该是外部中断出问题,请大家解惑
#include <REGX52.H>
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char data i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void Int0_Init() //外部中断初始化函数
{
IT0=1;
IE0=1;
EX0=1;
EA=1;
PX0=1;
}
unsigned char j,state;
void main()
{
Int0_Init();
while(1)
{
if(state==1)
{
P2=0xFE; //一、逐渐点亮LED
Delay1ms(100);
P2=0xFC;
Delay1ms(100);
P2=0xF8;
Delay1ms(100);
P2=0xF0;
Delay1ms(100);
P2=0xE0;
Delay1ms(100);
P2=0xC0;
Delay1ms(100);
P2=0x80;
Delay1ms(100);
P2=0x00;
Delay1ms(100); //开始反向流水
P2=0x7F;
Delay1ms(100);
P2=0x3F;
Delay1ms(100);
P2=0x1F;
Delay1ms(100);
P2=0x0F;
Delay1ms(100);
P2=0x07;
Delay1ms(100);
P2=0x03;
Delay1ms(100);
P2=0x01;
Delay1ms(100);
P2=0x00;
Delay1ms(100);
}
if(state==2)
{
for(j=0;j<=7;j++) //二、依次向一边点亮两灯
{
P2=~(0x03<<j); //即0000 0011向左移一位再取反
Delay1ms(100);
}
for(j=0;j<=7;j++)
{
P2=~(0xC0>>j); //即1100 0000向右移一位再取反
Delay1ms(100);
}
}
if(state==3)
{
P2=0x55; //三、间隔的LED闪烁
Delay1ms(100); //0x55即0101 0101
P2=0xAA; //0xAA即1010 1010
Delay1ms(100);
}
if(state==4)
{
P2=0x00; //四、全部LED同时亮灭
Delay1ms(200);
P2=0xFF; //0xFF即1111 1111
Delay1ms(200);
}
}
}
void Int0_Routine(void) interrupt 0 //外部中断函数
{
if(P1_4==0)
{
Delay1ms(20);
if(P1_4==0) //按一次按键切换一种模式
{
state++;
if(state>=5)
state=1;
while(P1_4==0);
}
}
}