单片机开关按键控制led灯

单片机两个开关,两个开关都是通路,通过中断来显示LED灯的亮灭。第一个开关中断后,绿灯亮,第二个开关中断后,判断第一个开关是否触发,如果触发则关闭绿灯,如果没有触发则亮红灯。
以下为我写的代码,不知道为什么就是点不亮(刚刚开始学单片机)。对于这种简单问题,各位大师小菜一碟。

最好给个模型,比如十个开关,需要按照顺序触发(没有按照顺序触发判定NG)亮红灯。如果全部按照顺序触发,亮绿灯在熄灭。有掉电保护功能最好了。

#include <reg51.H>

sbit LED1=P2^0;
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit K1=P3^0;
sbit K2=P3^1;

void Delay(XMS)
{
unsigned char i, j;
while(XMS--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}

void main()
{
LED1=1;
LED2=1;
LED3=1;
K1=1;
K2=1;

while(1)
{
    if(K1==0)
    {
        Delay(5);
        while(K1==0);
        Delay(5);
        
        LED1=0;
        Delay(50);
    }
    
    if(K2==0&&LED1==0)
    {
        Delay(5);
        while(K2==0);
        Delay(5);
        
        LED2=0;
        Delay(50);


        
    }
    if(K2==0)
    {
        Delay(5);
        while(K1==0);
        Delay(5);
        
        LED2=0;
    }
}

}

img

中断开关引脚定义错误与电路图不同是无法实现控制的,修改如下:
sbit K1=P3^2;
sbit K2=P3^3;
单片机外部中断只有2个有优先级的区别,但是无法通过2个开关不同状态的组合实现判断开关组合状态的。要实现开关组合状态不需要使用中断,使用普通IO组可实现10个组合甚至32个组合,因此想要达到什么目标先理清楚,再决定如何设计电路,才能决定如何写实现代码。
目前题目意图不明。

IO输出驱动LED都不加限流电阻,如果LED的Vf值比较低,LED点亮后可能造成MCU误判以为驱动LED的这个IO还是低电平状态。

自己先写个程序,用周期扫面开关的状态,让他按需求动作,做好了再去测试中断,这样会更容易理解,一上来就研究中断可能会懵逼,没有逻辑可以对比,哈哈

1、按键要加个上拉电阻,否则检测输入电平会有问题
2、LED 要串个电阻

【51单片机】独立按键控制LED灯(四种形式)
https://blog.csdn.net/weixin_52632755/article/details/120657820