关于#单片机#的问题:用这个代码写出来矩阵键盘完全控制不了LED

用这个代码写出来矩阵键盘完全控制不了LED,想知道为什么。
矩阵键盘肯定没坏,已经试验过了。

#include "reg52.h"

sfr P4 = 0xc0;

sbit R1 = P3^0;
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;

unsigned char code SMG_duanma[18]=
    {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
        0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f}; 
    
sbit C4 = P3^4;
sbit C3 = P3^5;
sbit C2 = P4^2;
sbit C1 = P4^4;

void SelectHC573(unsigned char channel)
{
    switch(channel)
    {
        case 4:
            P2=(P2 & 0x1f) | 0x80;
        break;
        case 5:
            P2=(P2 & 0x1f) | 0xa0;
        break;
        case 6:
            P2=(P2 & 0x1f) | 0xc0;
        break;
        case 7:
            P2=(P2 & 0x1f) | 0xe0;
        break;
    }
}

void DisplayKeyNum(unsigned char value)
{
    SelectHC573(6);
    P0 = 0x01;
    SelectHC573(6);
    P0 = value;
}

unsigned char key_num;
void ScanKeyMulti()
{
    R1 = 0;
    R2 = R3 = R4 = 1;
    C1 = C2 = C3 = C4 = 1;
    if(C1 == 0)
    {
        while(C1 == 0);
        key_num = 0;
        DisplayKeyNum(SMG_duanma[key_num]);
    }
    else if(C2 == 0)
    {
     while(C2 == 0);
        key_num = 1;
        DisplayKeyNum(SMG_duanma[key_num]);
    }
    else if(C3 == 0)
    {
     while(C3 == 0);
        key_num = 2;
        DisplayKeyNum(SMG_duanma[key_num]);
    }
    else if(C4 == 0)
    {
     while(C4 == 0);
        key_num = 3;
        DisplayKeyNum(SMG_duanma[key_num]);
    }
    R2 = 0;
    R1 = R3 = R4 = 1;
    C1 = C2 = C3 = C4 = 1;
    if(C1 == 0)
    {
        while(C1 == 0);
        key_num = 4;
        DisplayKeyNum(SMG_duanma[key_num]);
    }
    else if(C2 == 0)
    {
     while(C2 == 0);
        key_num = 5;
        DisplayKeyNum(SMG_duanma[key_num]);
    }
    else if(C3 == 0)
    {
     while(C3 == 0);
        key_num = 6;
        DisplayKeyNum(SMG_duanma[key_num]);
    }
    else if(C4 == 0)
    {
     while(C4 == 7);
        key_num = 3;
        DisplayKeyNum(SMG_duanma[key_num]);
    }
    R3 = 0;
    R2 = R1 = R4 = 1;
    C1 = C2 = C3 = C4 = 1;
    if(C1 == 0)
    {
        while(C1 == 0);
        key_num = 8;
        DisplayKeyNum(SMG_duanma[key_num]);
    }
    else if(C2 == 0)
    {
     while(C2 == 0);
        key_num = 9;
        DisplayKeyNum(SMG_duanma[key_num]);
    }
    else if(C3 == 0)
    {
     while(C3 == 0);
        key_num = 10;
        DisplayKeyNum(SMG_duanma[key_num]);
    }
    else if(C4 == 0)
    {
     while(C4 == 0);
        key_num = 11;
        DisplayKeyNum(SMG_duanma[key_num]);
    }
    R4 = 0;
    R2 = R3 = R1 = 1;
    C1 = C2 = C3 = C4 = 1;
    if(C1 == 0)
    {
        while(C1 == 0);
        key_num = 12;
        DisplayKeyNum(SMG_duanma[key_num]);
    }
    else if(C2 == 0)
    {
     while(C2 == 0);
        key_num = 13;
        DisplayKeyNum(SMG_duanma[key_num]);
    }
    else if(C3 == 0)
    {
     while(C3 == 0);
        key_num = 14;
        DisplayKeyNum(SMG_duanma[key_num]);
    }
    else if(C4 == 0)
    {
     while(C4 == 0);
        key_num = 15;
        DisplayKeyNum(SMG_duanma[key_num]);
    }
}

void main()
{
    while(1)
    {
        ScanKeyMulti();
    }
}



img


```

以下是我的回答,希望能点击一下采纳,让我有继续回答下去的动力
https://blog.csdn.net/weixin_63568691/article/details/129019521

1.在第二组按键判断中,在按键C4按下时,不会做出任何响应,这是因为代码中有一个错误:

else if(C4 == 0)
{
 while(C4 == 7);
    key_num = 3;
    DisplayKeyNum(SMG_duanma[key_num]);
}

正确的代码应该是:

else if(C4 == 0)
{
 while(C4 == 0);
    key_num = 11;
    DisplayKeyNum(SMG_duanma[key_num]);
}

2.在ScanKeyMulti函数中,没有处理所有的按键,你需要补充其他两组按键的扫描代码。
3.在最后一组按键的判断中,在按键C4按下时,key_num的值一直被设置为3,你需要将其修改为正确的值,例如:


else if(C4 == 0)
{
 while(C4 == 0);
    key_num = 15;
    DisplayKeyNum(SMG_duanma[key_num]);
}