在矩阵键盘中增加功能按键,并实现组合按键的操作

基础功能:通过按键实现点阵上点的移动,按键时有按键音
附加:在矩阵键盘中增加功能按键,并实现组合按键的操作:功能按键+组合按键1实现点阵的开和关;功能按键+组合按键2实现按键音的开和关

void KeyDown(void)
{
    char a=0;
    GPIO_KEY=0x0f;
    if(GPIO_KEY!=0x0f)//读取按键是否按下
    {
        delay(1000);//延时10ms进行消抖
        if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
        {    
            flag = 1;
        //    s_c++;
            //测试列
            GPIO_KEY=0X0F;
            switch(GPIO_KEY)
            {
                case(0X07):    KeyValue=0;break;
                case(0X0b):    KeyValue=1;break;
                case(0X0d): KeyValue=2;break;
                case(0X0e):    KeyValue=3;break;
            }
            //测试行
            GPIO_KEY=0XF0;
            switch(GPIO_KEY)
            {
                case(0X70):    KeyValue=KeyValue;break;
                case(0Xb0):    KeyValue=KeyValue+4;break;
                case(0Xd0): KeyValue=KeyValue+8;break;
                case(0Xe0):    KeyValue=KeyValue+12;break;
            }
//            if(KeyValue == 0)            //判断是否出现功能按键
//            {
//                KeyValue = 255;
//                GPIO_KEY = 0x0f;
//                while(GPIO_KEY != 0x0f)
//                {
//                    GPIO_KEY = 0x0f;    //判断组合按键
//                    switch(GPIO_KEY & 0x07)
//                    {
//                        case(0x03): KeyValue = 16;break;    //组合按键1
//                        case(0x05): KeyValue = 17;break;
//                    }
//                    if(KeyValue > 16 && KeyValue < 18) break;
//                }
//            }
        }    
    }
}

将S1设为功能键,两个组合按键分别设为S2、S3
后面加上了判定位ledflag和singflag

void Int0() interrupt 0 //外部中断 0 的中断函数
{
    delay(1000); //延时消抖
    if(flag == 1)
    {
        delay(1000);
        flag = 0;
        if(KeyValue == 16)
        {
            ledflag = ~ledflag;
        }
    }
}

void Int1() interrupt 2 //外部中断 1 的中断函数
{
    delay(1000); //延时消抖
    if(flag == 1)//读取按键是否按下
    {
        delay(1000);//延时10ms进行消抖
        flag = 0;
        if(KeyValue == 17)
        {
            singflag = ~singflag;
        }
    }
}

不加组合按键的其他程序都是对的,加了组合按键后,按下S1,点阵的点就不移动了,且没有按键音
有没有能人看看到底哪错了