51单片机 流水灯 中断
- 格式:doc
- 大小:14.50 KB
- 文档页数:2
//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++); }