51单片机 流水灯 中断

  • 格式:doc
  • 大小:14.50 KB
  • 文档页数:2

下载文档原格式

  / 2
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//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;i

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

}