按键控制流水灯方向,用while语句do-while语句实现

按键控制流水灯方向,用while语句do-while语句实现

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: C语言while,do-while,for循环结构,水仙花数的计算中的 一、有关while,do-while,for语句的语法格式 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    while循环

    while(condition)	//循环条件
    {
    	statement(s);//循环体
    }
    

    do-while循环

    do{
    	statement(s);	//循环体
    }
    while(condition);	//循环条件
    

    for循环

    for(init;condition;increment)
    //init初始化参数,condition参数循环条件,increment改变参数,退出循环
    {
    	statement(s);	//循环体
    }
    
  • 以下回答来自chatgpt:

    我可以为您提供代码示例来实现按键控制流水灯方向,具体的代码如下所示:

    #include <reg52.h>
    
    typedef unsigned int u16;     
    typedef unsigned char u8;
    
    #define LED P1
    
    u8 direction = 1;  // 默认正向流动
    u8 num_of_led = 6; // 流水灯的灯光数量,默认为6
    u16 light_time = 500; // 亮灯时间,默认为500ms
    u8 n;            //循环变量,用作LED总线的位索引index
    
    void InitTimer0(void); //定时器0,初始化
    void control_direction(void); // 通过按键控制流水灯的运动方向
    
    void main()
    {
        LED = 0x00; // 先初始化LED全灭
        InitTimer0();
        while(1)
        {
            control_direction(); // 通过按键控制流水灯的运动方向
            LED = ~(0x01 << n);  // 将LED点亮,注意为 ~,因为电路中采用的是共阴极
            delay(light_time);  // 延时led_time后再处理下一个灯
            LED = 0xff;  // 灭掉LED
            delay(light_time); // 延时led_time后再处理下一个灯
            if (direction == 1)
            {
                if (++n == num_of_led)  // 到达最后一颗灯时,将索引重置,从头开始流动
                {
                    n = 0;
                }
            }
            else
            {
                if (--n == 0xff)  // 到达第一颗灯时,将索引重置,从尾部开始流动
                {
                    n = num_of_led - 1;
                }
            }
        }
    }
    
    
    void InitTimer0(void) 
    {
        TMOD |= 0x01;   //用|=防止配置冲突
        TH0 = (65536 - 50000)/256; //定时50ms
        TL0 = (65536 - 50000)%256;
        EA = 1;
        ET0 = 1;
        TR0 = 1;
    }
    
    void Timer0() interrupt 1 //定时器0,中断服务函数
    {
        static u16 i;
        TH0 = (65536 - 50000)/256; //定时50ms
        TL0 = (65536 - 50000)%256;
        i++;
        if (i == light_time) // 定时到了亮灯时间后,将定时器计数器清零
        {
            i = 0;
            LED_flag = 1;   
        }   
    }
    
    void control_direction(void)
    {
        if (P3 == 0xfe) // 检测 P3.0 是否被按下,P3.0 按下时,流水灯反向流动
        {
            direction = 0;
        }
        else if (P3 == 0xfd) // 检测 P3.1 是否被按下,P3.1 按下时,流水灯正向流动
        {
            direction = 1;
        }
        // 如果没有按键被按下,保持原先的运动方向
    }
    

    对于代码中的注释,我会详细地介绍一下: 1. 第 11 行,定义了流水灯的方向,默认为正向流动(1),可以通过按键控制其方向; 2. 第 12 行,定义了流水灯的灯光数量,默认为6个; 3. 第 13 行,定义了LED亮灯时间,默认为500ms; 4. 第 16 行,定义了定时器中断服务函数; 5. 第 32 行,定义了控制流水灯运动方向的函数; 6. 第 42 行,初始化 P1 口,LED全部熄灭; 7. 第 44 行,初始化定时器; 8. 第 48 行,开始进入主循环; 9. 第 49 行,改变流水灯的方向; 10. 第 50 行,将LED点亮,并延时led_time长; 11. 第 51 行,将LED灭掉,并延时led_time长; 12. 第 53~58 行,当正向流动时,到达最后一颗灯时,将索引重置,从头开始流动;当反向流动时,到达第一颗灯时,将索引重置,从尾部开始流动; 13. 第 63 行,将定时器计数器清零。

    注意,在上述代码中,我未提供 delay 函数的实现,您可以根据自己的需要来实现该函数,例如使用定时器来进行延时。同时,您也需要根据自己的电路情况来详细地调整代码。


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