流水灯怎么中断循环执行下个语句_(语言-c语言)

该问题来自社区帖: https://bbs.csdn.net/topics/615415359.为符合问答规范, 该问题经过ChatGPT优化

如何中断流水灯的循环执行并执行下一个语句?

以下是代码:

#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();}
        }
    }
}
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    可以采用信号量的方式来中断循环执行,具体实现方法如下:

    #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函数发送信号。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^