stc8按顺序点亮LED的问题。

芯片是stc8,想通过5个按键按顺序控制点亮LED,每当一个按键按下,对应LED点亮,如果顺序正确,则输出并进入下一个流程,如果错误,则全部熄灭,重新点亮。
遇到的问题:每次上电,都会由一个LED是亮起状态,然后按下剩余按键会判定错误,重新按,第二次则没有问题。有时候断电重启就正常。有时候重启很多次也不正常。
希望大shen给看一下问题的所在,另外,本人是个自学C语言1个多余的菜ji,程序结构也存在很多问题,还请给与批评和指点,怎么样的结构顺序更好。
下面是电路图:

img

下面是程序代码:


```c

#include <stc15.h>

sbit Magnetic_Switch0=P1^3;
sbit Magnetic_Switch1=P1^4;
sbit Magnetic_Switch2=P1^5;
sbit Magnetic_Switch3=P1^6;
sbit Magnetic_Switch4=P1^7;

sbit Right_Out1=P1^1;
sbit Right_Out2=P5^4;

sbit Speaker_Switch0=P1^0;
sbit Speaker_Switch1=P3^7;
sbit Speaker_Switch2=P3^6;
sbit Speaker_Switch3=P3^5;
sbit Speaker_Switch4=P3^4;




sbit getLED0=P3^3;
sbit getLED1=P3^2;
sbit getLED2=P3^1;
sbit getLED3=P3^0;
sbit getLED4=P5^5;






unsigned char getflag0=0,getflag1=0,getflag2=0,getflag3=0,getflag4=0;

void delay1000ms(void);
void delay1500ms(void);

    
void main(void)
{

    unsigned char flag=1;
    unsigned char getflag0=0,getflag1=0,getflag2=0,getflag3=0,getflag4=0;
    int i=0;  //unsigned char i=10;
    unsigned char j=0,k=0;
    const unsigned char setMagnetic_Switch[5]={0,1,2,3,4};
    unsigned char getMagnetic_Switch[5]={0,0,0,0,0};
    
    P0M0=0x00;
    P0M1=0x00;
    P1M0=0x00;
    P1M1=0x00;
    P2M0=0x00;
    P2M1=0x00;
    P3M0=0x00;
    P3M1=0x00;
    P4M0=0x00;
    P4M1=0x00;
    P5M0=0x00;
    P5M1=0x00;
    
    Magnetic_Switch0=1;
    Magnetic_Switch1=1;
    Magnetic_Switch2=1;
    Magnetic_Switch3=1;
    Magnetic_Switch4=1;
    
    Speaker_Switch0=0;
    Speaker_Switch1=0;
    Speaker_Switch2=0;
    Speaker_Switch3=0;
    Speaker_Switch4=0;
    

    
    getLED0=1;
    getLED1=1;
    getLED2=1;
    getLED3=1;
    getLED4=1;
    
    
    Right_Out1=1;
    Right_Out2=1;





    while(1)
    {    
//获取
        while(j<5)
        {
            if(Magnetic_Switch0==0&&Magnetic_Switch1!=0&&Magnetic_Switch2!=0&&Magnetic_Switch3!=0&&Magnetic_Switch4!=0&&getflag0==0)
            {

                getMagnetic_Switch[j]=0;
                getflag0=1;
                getLED0=0;
                j++;

            }
            if(Magnetic_Switch1==0&&Magnetic_Switch0!=0&&Magnetic_Switch2!=0&&Magnetic_Switch3!=0&&Magnetic_Switch4!=0&&getflag1==0)
            {

                getMagnetic_Switch[j]=1;
                getflag1=1;
                getLED1=0;
                j++;

            }
            if(Magnetic_Switch2==0&&Magnetic_Switch0!=0&&Magnetic_Switch1!=0&&Magnetic_Switch3!=0&&Magnetic_Switch4!=0&&getflag2==0)
            {

                getMagnetic_Switch[j]=2;
                getflag2=1;
                getLED2=0;
                j++;

            }
            if(Magnetic_Switch3==0&&Magnetic_Switch0!=0&&Magnetic_Switch1!=0&&Magnetic_Switch2!=0&&Magnetic_Switch4!=0&&getflag3==0)
            {

                getMagnetic_Switch[j]=3;
                getflag3=1;
                getLED3=0;
                j++;

            }
            if(Magnetic_Switch4==0&&Magnetic_Switch0!=0&&Magnetic_Switch1!=0&&Magnetic_Switch2!=0&&Magnetic_Switch3!=0&&getflag4==0)
            {

                getMagnetic_Switch[j]=4;
                getflag4=1;
                getLED4=0;
                j++;

            }
        }
        j=0;
        //比较

        while(1)
        {
            if(setMagnetic_Switch[k]==getMagnetic_Switch[k])
            {        
                k++;
                if(k<5)
                    continue;
                k=0;

                Right_Out1=0;
                i=30;
                while(i>0)
                {
                    delay1000ms();
                    i--;
                }    
                i=0;
                while(getLED0==0||getLED1==0||getLED2==0||getLED3==0||getLED4==0)
                {
                    if(Speaker_Switch0==1)
                    {
                        getLED0=1;
                        delay1500ms();
                    }
                    if(Speaker_Switch1==1)
                    {
                        getLED1=1;
                        delay1500ms();
                    }
                    if(Speaker_Switch2==1)
                    {
                        getLED2=1;
                        delay1500ms();
                    }
                    if(Speaker_Switch3==1)
                    {
                        getLED3=1;
                        delay1500ms();
                    }
                    if(Speaker_Switch4==1)
                    {
                        getLED4=1;
                        delay1500ms();
                    }
                }    
                Right_Out2=0;

                delay1000ms();        
                i=600000;
                while(i>0)
                {
                    delay1000ms();
                    i--;
                }    
                i=0;
                break;
            }
            else
            {

                getLED0=0;
                getLED1=0;
                getLED2=0;
                getLED3=0;
                getLED4=0;
                delay1000ms();
                getLED0=1;
                getLED1=1;
                getLED2=1;
                getLED3=1;
                getLED4=1;
                delay1000ms();
                getLED0=0;
                getLED1=0;
                getLED2=0;
                getLED3=0;
                getLED4=0;
                delay1000ms();
                getLED0=1;
                getLED1=1;
                getLED2=1;
                getLED3=1;
                getLED4=1;
                delay1000ms();
                getLED0=0;
                getLED1=0;
                getLED2=0;
                getLED3=0;
                getLED4=0;
                delay1000ms();
                getLED0=1;
                getLED1=1;
                getLED2=1;
                getLED3=1;
                getLED4=1;
                delay1000ms();
                
                

                Right_Out1=1;
                break;
            }
        }
        Magnetic_Switch0=1;
        Magnetic_Switch1=1;
        Magnetic_Switch2=1;
        Magnetic_Switch3=1;
        Magnetic_Switch4=1;
        getflag0=0;
        getflag1=0;
        getflag2=0;
        getflag3=0;
        getflag4=0;

        Speaker_Switch0=0;
        Speaker_Switch1=0;
        Speaker_Switch2=0;
        Speaker_Switch3=0;
        Speaker_Switch4=0;

        getLED0=1;
        getLED1=1;
        getLED2=1;
        getLED3=1;
        getLED4=1;
        Right_Out1=1;
        Right_Out2=1;

        for(i=0;i<5;i++)
        {
            getMagnetic_Switch[i]=0;
        }

        while(Magnetic_Switch0==0);
        while(Magnetic_Switch1==0);
        while(Magnetic_Switch2==0);
        while(Magnetic_Switch3==0);
        while(Magnetic_Switch4==0);
    }
}







void delay1000ms(void) //@11.0592MHz
{
    unsigned char i, j, k;
    i = 43;
    j = 6;
    k = 203;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}



void delay1500ms(void)        //@11.0592MHz
{
    unsigned char i, j, k;

    i = 64;
    j = 9;
    k = 179;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

```

sbit getLED0=P3^3;
sbit getLED1=P3^2;
sbit getLED2=P3^1;
sbit getLED3=P3^0;
sbit getLED4=P5^5; ->sbit getLED4=P3^4

看你这程序写的有点复杂,主要查两个地方吧,一个是初始化程序,另一个就硬件电路

按键的次序错位了吧

sbit Magnetic_Switch0=P1^3;
sbit Magnetic_Switch1=P1^4;
sbit Magnetic_Switch2=P1^5;
sbit Magnetic_Switch3=P1^6;
sbit Magnetic_Switch4=P1^7;
```c

改为:

```c++
sbit Magnetic_Switch0=P1^2;
sbit Magnetic_Switch1=P1^3;
sbit Magnetic_Switch2=P1^4;
sbit Magnetic_Switch3=P1^5;
sbit Magnetic_Switch4=P1^6;

兄弟,这代码看的我属实是烧心啊!我真的没有耐心看完了,你写代码封装函数啊!咋的也不能都写道main里啊?
1.任何一个函数最好都不要超过100行
2.函数命名你这是咋命名的?很乱啊,我从你的函数名称上都看不出你要干啥
3.你的按键和led分组,就把名称和led的编号搭配起来,别前一个led0是P3^0,led2就是P3^3,led3又是P3^1,这么写代码真的让看的人很揪心。
4.规范一下代码层次
5.遇到你现在遇到的这种奇奇怪怪的问题的时候,分析顺序是先看的代码初始化逻辑,输出,输入引脚是不是都已经配置好了,配置好了引脚,引脚的初始状态有没有设置。这些你都排查完了,你在看逻辑,但是一般这玩意和逻辑都没啥关系。你就去看电路,你这电路能不能搞一个上拉电阻?按键你就直接接地了?你能保证稳定性吗?

你最后的问题顺序和逻辑,你多封装几个函数,规范一下,自然就自己能找到逻辑了!
另外,if(Magnetic_Switch0==0&&Magnetic_Switch1!=0&&Magnetic_Switch2!=0&&Magnetic_Switch3!=0&&Magnetic_Switch4!=0&&getflag0==0),这个玩意,能不能加几个括号,有一个层次关系?然后在分行!一个判断分一行,一眼就能看出来你要干啥!
if((Magnetic_Switch0==0)&&(Magnetic_Switch1!=0)&&
(Magnetic_Switch2!=0)&&(Magnetic_Switch3!=0)&&
(Magnetic_Switch4!=0)&&(getflag0==0))

首先,那个模拟的软件里面可以加示波器或者查电压的东西,可以拖一个出来监测你的io口是什么电压。
其次,你似乎没加消抖的逻辑?按键需要消抖……你查查
最后,芯片型号选错了?
51没必要学,联系学esp32或者stm32

初始化的时候把灯全关掉