C51单片机8个开关控制16个Led,更改不了状态。

C51单片机使用P2口8个开关控制P1和P0,16个Led,更改P2口状态后,原来的16个Led的状态不改变。
问题是:实现用P2.0至P2.7端口连接的8个开关按键,控制P0口和P1口连接的16个发光二级管,实现不同花样的流水点亮效果。


Proteus图如下

img


问题具体描述如上,已经找了一下午的资料了。刚入门,不知道该怎么解决,或许进入了死胡同。请帮忙解决下。
部分代码如下

#include <reg51.h>
#define uchar unsigned char
//Delay
void delay(){
    uchar i,j;
    for(i=0;i<255;i++)
    for(j=0;j<255;j++);
}

char GetKey(){
    char key;
    key = ~P2;
    return key;
}


//P2=1,P0 All On.
void P0_All_On(){
    P0 = 0x00;
}

//P1 unidirectional led
void P1_Unidirectional_Led(){
    
}

//P2=0xfd,P1 All On.
void P1_All_On(){
    while(1){
        
        P1 = 0x00;
    }
}

void LedDispose(char key){
    P1 = 0xff;
    P0 = 0xff;
    if(key == 0x01)
        P0_All_On();
    if(key == 0x02)
        P1_All_On();
}


void main(){
    char key;
    P2 = 0xff;
    key = ~P2;
    while(1)
    {
        key = GetKey();
//        state = ~P2;
        if(key != 0x00)
        {
            LedDispose(key);
        }else{
            P1 = 0xff;
            P0 = 0xff;
        }

    }
}


仿真效果如下:

img

代码都没有,怎么分析呢

先搭建好51单片机的最小系统,包括晶振那些,可以去网上搜一下proteus上搭建51单片机最小系统的电路图,否则单片机是不能正常工作的