如何中断流水灯的循环执行并执行下一个语句?
以下是代码:
#include <reg51.h>
#include "key.h"
#include <INTRINS.H>
#include "Delay.h"
unsigned char keynum,ledmod;
void led1()
{
unsigned char i;
P1=0xfe;
P2=0xfe;
for(i=0;i<=7;i++)
{
P1=_crol_(P1,1);
P2=_crol_(P2,1);
Delay(100);
}
i=0;
}
void led2()
{
unsigned char i;
P1=0x7f;
P2=0x7f;
for(i=0;i<=7;i++)
{
P1=_cror_(P1,1);
P2=_cror_(P2,1);
Delay(100);
}
i=0;
}
void led3()
{
while(1)
{
unsigned char i;
P1=0xFF;
P2=0xFE;
Delay(100);
for(i=0;i<=6;i++)
{
P2=_crol_(P2,1);
Delay(100);
}
i=0;
P1=0xFe;
P2=0xff;
for(i=0;i<=7;i++)
{
P1=_cror_(P1,1);
Delay(100);
}
i=0;
}
}
void led4()
{
unsigned char i;
P1=0xFE;
P2=0xFF;
Delay(100);
for(i=0;i<=6;i++)
{
P1=_crol_(P1,1);
Delay(100);
}
i=0;
P1=0xFF;
P2=0xfe;
for(i=0;i<=7;i++)
{
P2=_cror_(P2,1);
Delay(100);
}
i=0;
}
void main()
{
while(1)
{
keynum=key();
if(keynum)
{
while(keynum==1){led1();}
while(keynum==2){led2();}
while(keynum==3){led3();}
while(keynum==4){led4();}
}
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话:可以采用信号量的方式来中断循环执行,具体实现方法如下:
#include <stdio.h>
#include <windows.h>
#include <signal.h>
static volatile int flag = 0;
void handler(int sig) // 定义信号处理函数
{
flag = 1; // 改变标志位,跳出循环
}
int main()
{
int i;
signal(SIGINT, handler); // 注册中断信号处理函数
while(1)
{
if(flag) // 判断标志位是否改变
break;
for(i = 0; i < 8; i++)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), i+1);
printf("流水灯\n");
Sleep(500);
}
}
printf("结束流水灯循环\n");
return 0;
}
其中,首先在程序进入循环前,使用signal
函数将中断信号(这里采用SIGINT
,即Ctrl+C
键)和自定义的信号处理函数handler
关联起来。信号处理函数中将标志位flag
改变,使程序跳出循环。在主程序中,通过判断标志位flag
是否改变来实现跳出循环的效果。当程序跳出循环后,即可执行下一个语句。
需要注意,在程序中使用signal
函数要保证跨平台性,因此建议使用sigaction
函数。此外,如果需要实现多线程中的中断,可以考虑使用pthread_kill
函数发送信号。