CSDN-Ada助手 2023-05-19 19:14 采纳率: 1.6%
浏览 5
已结题

流水灯怎么中断循环执行下个语句_(语言-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();}
        }
    }
}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-05-20 08:16
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 以下回答来自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函数发送信号。


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

报告相同问题?

问题事件

  • 系统已结题 5月27日
  • 创建了问题 5月19日

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog