按键控制流水灯流向问题

img


两个开关按键分别接在p1.0和p1.1口,四个LED灯接在p2,执行该代码,开关未起到控制的左右,问题出现在了哪里。

换成K1 K2试试

供参考:

#include <reg51.h>
#define uchar unsigned char
#define uint  unsigned int
#define LED_PORT P2

sbit LED1 = LED_PORT ^ 0;
sbit LED2 = LED_PORT ^ 1;
sbit LED3 = LED_PORT ^ 2;
sbit LED4 = LED_PORT ^ 3;

sbit K1 = P1 ^ 0;
sbit K2 = P1 ^ 1;
uchar key_ret = 0;

uchar LED[4] = { 0x01,0x02,0x04,0x08 };

void delay(uint ms)
{
    uint i, j;
    for (i = 0; i < ms; i++)
        for (j = 0; j < 125; j++);
}

void LED_Prt(uchar flg = 0)
{
    uint i;
    if (flg) {
        for (i = 3; i >= 0; i--)
        {
            LED_PORT = LED[i];
            delay(500);
        }
    }
    else{
        for (i = 0; i < 4; i++)
        {
            LED_PORT = LED[i];
            delay(500);
        }
    }
}

void Scan_Key()
{
    if (K1 == 0) {
        delay(50);
        if (K1 == 0) {
            while (K1 == 0);
            key_ret = 1;
        }
    }
    if (K2 == 0) {
        delay(50);
        if (K2 == 0) {
            while (K2 == 0);
            key_ret = 2;
        }
    }
}

void main()
{
    P1 = 0xff;
    LED_PORT = 0x00;
    while (1){
        Scan_Key();
        switch (key_ret)
        {
        case 1:LED_Prt(0); break;
        case 2:LED_Prt(1); break;
        default:
            break;
        }
    }
}

【以下回答由 GPT 生成】

问题的主要原因是选择LED灯的逻辑错误。在代码中,根据开关的状态选择LED灯的方式是使用LED数组的索引。但是这里LED数组的索引是从0到3的,而在循环中,当i等于0时,P2被赋值为LED[0],这时只有LED1亮起,而其他LED灯都是关闭的。因此,我们需要将循环控制条件中的i改为i > -1,同时修改赋值语句为P2 = LED[i],以使所有LED灯能够被正确选中。

以下是修改后的代码:

#include <reg5l.h>

#define LEDPORT P2
sbit LED1 = LEDPORTO;
sbit LED2 = LEDPORT1;
sbit LED3 = LEDPORT2;
sbit LED4 = LEDPORT3;
sbit K1 = P1^0;
sbit K2 = P1^1;
unsigned char LED[4] = {0x01, 0x02, 0x04, 0x08};

void delay(unsigned int mg) {
    unsigned int i, j;
    for(i = 0; i < mg; i++) {
        for(j = 0; j < 123; j++) {
            // 这里是空循环,用于延时
        }
    }
}

void main() {
    int i, j;
    while(1) {
        P2 = 0x00;
        if (K1 == 0) {
            for (i = 3; i > -1; i--) { // 修改循环控制条件
                P2 = LED[i];
                delay(500);
            }
        }
        if (K2 == 0) {
            for (i = 0; i < 4; i++) {
                P2 = LED[i];
                delay(500);
            }
        }
    }
}

请尝试使用修改后的代码,在嵌入式硬件上测试是否能够解决问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^