51单片机独立按键控制

您好打扰了,我想问一下,我想利用两个独立按键,控制流水灯的两种状态变换。
想要的效果就是比如K1按下就一直显示这种状态,按下K2切换另一种状态,松手流水灯不会熄灭

#include
#include

void Delay10ms() //@12.000MHz
{
unsigned char i, j;

i = 117;
j = 184;
do
{
    while (--j);
} while (--i);

}

sbit K3 = P3^2;
sbit K4 = P3^3;

sbit led1 = P2^0;
sbit led2 = P2^1;
sbit led3 = P2^2;
sbit led4 = P2^3;
sbit led5 = P2^4;
sbit led6 = P2^5;
sbit led7 = P2^6;
sbit led8 = P2^7;

void main()
{

while(1)
{

    if(K3==0)
    {
        led1 = 0;
        led8 = 0;
        Delay10ms();
        led1 = 1;
        led8 = 1;

        led2 = 0;
        led7 = 0;
        Delay10ms();
        led2 = 1;
        led7 = 1;

        led3 = 0;
        led6 = 0;
        Delay10ms();
        led3 = 1;
        led6 = 1;

        led4 = 0;
        led5 = 0;
        Delay10ms();
        led4 = 1;
        led5 = 1;

}

 else
 {
    P2=0xff;

}

if(K4==0)
{
Delay10ms();

    led1 = 0;
    Delay10ms();
    led1 = 1;
    
    led2 = 0;
    Delay10ms();
    led2 = 1;
    
    led3 = 0;
    Delay10ms();
    led3 = 1;

    led4 = 0;
    Delay10ms();
    led4 = 1;
    
    led5 = 0;
    Delay10ms();
    led5 = 1;
    
    
    led6 = 0;
    Delay10ms();
    led6 = 1;

    led7 = 0;
    Delay10ms();
    led7 = 1;
    
    led8 = 0;
    Delay10ms();
    led8 = 1;

}

else
{
P2=0xff;
}

}
}

你的需求就有点模糊,两个按键,就会有四种组合状态,你只描述了两种情况而且这两种情况还只提到了一个按键的状态。
对这类应用,可以给个通用的处理框架:
1,主循环里检测按键状态,根据按键状态确定LED显示模式
2,定时器中断里刷新LED状态,根据LED显示模式和当前时刻确定显示状态,改变每个LED的亮灭。用定时器中断有个好处,不会因为按键检测的消抖延时导致显示节奏被打乱。