//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 } 因篇幅问题不能全部显示,请点此查看更多更全内容