单片机动态数码管和矩阵键盘相关问题

想要实现的是矩阵键盘某键按下时,其键值显示于动态数码管,且每按一个键数字向左移动一位,新的数字出现在最右侧
但连接后矩阵键盘显示的数字不对应 且输入一个数字后所有的数字都变为同一数字
矩阵键盘的判断是按照课上讲的写的不知道有没有问题 但是显示数码管的函数测试是没问题的
问题大概率出在Keydown里

#include "REG51.h"
#include "intrins.h"
#define Key P1
sbit LSA=P2^0;
sbit LSB=P2^1;
sbit LSC=P2^2;        //定义数码管位选信号控制脚(和138译码器)
unsigned char num[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//动态数码管显示0~F
unsigned char Dig[8]={0,0,0,0,0,0,0,0};
void Keydown(void);    //按键扫描函数
char KeyValue; 
char j;

void delay10ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}


void InitTimer1(void)//timer1初始化
{
    TMOD |= 0x10;    //设置TMOD值,定时器1,工作方式1
    TH1 = 0xEC;
    TL1 = 0x78;    //初值5ms
    EA = 1;              //全局中断开
    ET1 = 1;          //定时器1中断开
    TR1 = 1;          //启动定时器1
}

main()
{
    while(1)
    {
        Keydown();
    }
}

void Keydown()
{
    int a=0;//计算按键时间 t=10ms*a
    Key=0x0f;
    if(Key!=0x0f)//读取按键是否按下
    {
        delay10ms();//消抖
        if(Key!=0x0f)
        {    //测试列 
            Key=0X0F;
            switch(Key)
            {
                case(0X07): KeyValue=0;break;
                case(0X0b): KeyValue=4;break;
                case(0X0d): KeyValue=8;break;
                case(0X0e): KeyValue=12;break;
            }
            Key=0XF0;
            switch(Key)
            {//测试行 
                case(0X70): KeyValue+=3;break;
                case(0Xb0): KeyValue+=2;break;
                case(0Xd0): KeyValue+=1;break;
                case(0Xe0): break;
            } 
            while((a<50)&&(Key!=0xf0))//松手检测
            {
                delay10ms();//延时10ms,500ms后开始新的检测 
                a++; 
            }
            for(j=0;j<7;j++)
            {
                Dig[j]=Dig[j+1];//更新显示值 
            }
            Dig[7]=KeyValue;
            InitTimer1();    
        } 
    } 
}


void Timer1(void)interrupt 3  //定时器1 用于显示动态数码管 
{
    static char i;
    TH1 = 0xEC;
    TL1 = 0x78;    //初值5ms
    P0=0x00;     
    switch(i)
    {
        case 0:LSC=1;LSB=1;LSA=1;
            if(Dig[7]!=16)
            {
                P0=num[Dig[7]];
            }
            break;
        case 1:LSC=1;LSB=1;LSA=0;
            if(Dig[6]!=16)
            {
                P0=num[Dig[6]];
            }
            break;
        case 2:LSC=1;LSB=0;LSA=1;
            if(Dig[5]!=16)
            {
                P0=num[Dig[5]];
            }
            break;
        case 3:LSC=1;LSB=0;LSA=0;
            if(Dig[4]!=16)
            {
                P0=num[Dig[4]];
            }
            break;
        case 4:LSC=0;LSB=1;LSA=1;
            if(Dig[3]!=16)
            {
                P0=num[Dig[3]];
            }
            break;
        case 5:LSC=0;LSB=1;LSA=0;
            if(Dig[2]!=16)
            {
                P0=num[Dig[2]];
            }
            break;
        case 6:LSC=0;LSB=0;LSA=1;
            if(Dig[1]!=16)
            {
                P0=num[Dig[1]];
            }
            break;
        case 7:LSC=0;LSB=0;LSA=0;
            if(Dig[0]!=16)
            {
                P0=num[Dig[0]];
            }
            break;
    }
    i++;
    if(i>=8) i=0;
}