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