您的当前位置:首页正文

51单片机 流水灯 中断

2021-03-17 来源:汇智旅游网


//51单片机控制8个LED灯,左右循环移动,当外部中断0引脚的按键,第一次按下时,停在当前位置;第二次按下时,继续向下执行

//**********************************************************************************************************************

//注释:当主函数中在执行左右流水点亮LED灯的时候,按键按下(这是第一次按下,即奇数次),CPU暂时

//中断当前点亮灯的工作,转去处理中断程序(c=1),处理完后,再返回原来中断的地方继续原来的工作,

//因为这时候C为1,while(c);为真,为死循环状态,即是LED亮的状态停在当前位置;当按键按下(这是第二次按下,即偶数次)

//CPU中断当前状态,转去处理中断程序(c=0),处理完后,再返回原来中断的地方继续原来的工作,

//这时候C为0,while(c);为假,则程序继续向下执行。

//***********************************************************************************************************************

#include

#include//控制左右移的头文件

void delay(int);//声明延时函数

unsigned char i=0,a=0,b=0,c=0;//a为判断按键按下时奇数次还是偶数次

void main()

{

P2=0xfe;

IT0=0;// 低电平有效

EX0=1;//开外部中断0

EA=1; //开总中断

while(1)

{

for(i=0;i<7;i++)//左循环

{

b=1;

while(c);//C为0时,顺序向下执行,为1时停在当前状态,

P2=_crol_(P2,1);

delay(500);

}

for(i=0;i<7;i++)//右循环

{

b=1;

while(c);//C为0时,顺序向下执行,为1时停在当前状态,

P2=_cror_(P2,1);

delay(500);

}

}

while(1);//等待中断

}

void int0_int(void) interrupt 0 //中断服务函数

{

delay(40);//延时一段时间,消除抖动

if(b==1)

{

b=0;

a+=1;//按键为奇数次时,停在当前的状态;偶数次时,接着原来的状态继续往下执行

if(a%2)

c=1;

else

c=0;

}

}

void delay(int n)//延时函数

{

unsigned int i,j;

for(i=0;ifor(j=0;j<50;j++);

}

因篇幅问题不能全部显示,请点此查看更多更全内容