51单片机独立按键操控呼吸灯问题


#include <reg52.h>
sbit k1=P3^1;
sbit led=P2^0;
void delay(unsigned int a)
{
    while(a--);
}

void main()
{
    while(1)
    {
        led=1;
        if(k1==0)
        {
            delay(1000);
            if(k1==0)
            {
                while(1)
                {
              led=~led;
                delay(50000);
                delay(50000);
                led=~led;
                delay(50000);
                delay(50000);
                    if(k1==0)
                    {
                        delay(1000);
                        if(k1==0)
                        {
                            break;
                        }
                    }
                }
                led=0;
                if(k1==0)
                {
                     delay(1000);
                    if(k1==0)
                    {
                        continue;
                    }
                }
            }
        }
    }
}

想用独立按键实现呼吸灯的暂停和开始,就是按下第一次开始,按下第二次暂停,再按开始,但按下一次后只有闪烁,再按也实现不了暂停,求问是代码哪里不对,大一刚接触单片机,只有C语言基础,虚心求问!


#include <reg52.h>
sbit k1=P3^1;
sbit led=P2^0;
void delay(unsigned int a)
{
    while(a--);
}

void hx_led(void)
{
    led = ~led;
    delay(50000);
    delay(50000);
    led = ~led;
    delay(50000);
    delay(50000);
}

void main()
{
    //按键抬起时生效
    int    st    = 0;    //运行状态 0 stop//1 start
    int kd    = 0;    //按键按下状态

    while(1)
    {
        if(st != 0)
        {
            hx_led();
        }
        if(k1 == 0)
        {
            kd = 1;
            while( k1 == 0 )
            {
                if(st != 0)    hx_led();
            }
        }
        if( k1 == 1 && kd == 1)
        {
            kd    = 0;
            st    = ~st;
        }
    }
}
 
//程序没调试过,也没经过编译,可能会有错误,自己修改调试吧

你这思想有问题,个人觉得按键作为一个独立事件,闪灯作为一个独立事件,然后两者逻辑主函数联系起来。