s3c2440板扩展IO口来驱动4×4矩阵键盘,出现问题

ganyutao   2010-5-26 15:29 楼主
扩展IO口来驱动矩阵键盘 GPG1,3,5,7接列线,作为中断,EXTINT9,11,13,15;
GPE11,13 GPB8,6接行线 相关程序部分如下:   将程序下载到开发板上之后,4×4键盘中只要有一个键按下,就一直产生中断,串口上一直打印eint×,不知道原因?
static void __irq Key_ISR(void)
{U32 r;       

        EnterCritical(&r);
        if(rINTPND==BIT_EINT8_23)
        {
                Uart_Printf("eint%d\n",county++);
                ClearPending(BIT_EINT8_23);
        }
            //   rGPGCON = rGPGCON & (~((3<<14)|(3<<10)|(3<<6)|(3<<2))) | ((2<<14)|(2<<10)|(2<<6)|(2<<2)) ;        //eint 9,11,13,15 set EINT
                 rGPEDAT = rGPEDAT & (~((3<<11)|(3<<13))) | ((0<<11)|(0<<13));
                 rGPBDAT = rGPBDAT & (~((3<<6)|(3<<8))) | ((0<<6)|(0<<8));
        ExitCritical(&r);
}
void KeyScan_Test(void)
{  
        Uart_Printf("\nKey Scan Test, press ESC key to exit !\n");       

        rGPBUP = rGPBUP & ~0x01e0|0x01e0;                        //  LED [8:5] => PU En
        rGPBCON = rGPBCON & ~0x3d57fd|0x3d57fd;                //LED[8:5],GPB0 => OUTPUT ;
       
         rGPECON = rGPECON & (~((3<<26)|(3<<22))) | ((1<<26)|(1<<22)) ;                //GPE13,11 set OUTPUT
         rGPEUP = rGPEUP & ~0x2800|0x2800;                        //  GPE13,11 => PU En
       
         //rGPGCON = rGPGCON & (~((3<<14)|(3<<10)|(3<<6)|(3<<2))) | ((1<<14)|(1<<10)|(1<<6)|(1<<2));// GPG1,3,5,7 set OUTPUT
         //rGPGDAT = rGPGDAT & (~((1<<1)|(1<<5)|(1<<7)))|((1<<1)|(1<<3)|(1<<5)|(1<<7));
         
          rGPEDAT = rGPEDAT & (~((3<<11)|(3<<13))) | ((0<<11)|(0<<13));
         rGPBDAT = rGPBDAT & (~((3<<6)|(3<<8))) | ((0<<6)|(0<<8));//GPB8,6 GPE11,13口送0
       
        rEXTINT1 &= ~((7<<4)|(7<<12)|(7<<20)|(7<<28));       
        rEXTINT1 |= ((7<<4)|(7<<12)|(7<<20)|(7<<28));                //set eint 9,11,13,15 switch level int


    rGPGCON = rGPGCON & (~((3<<14)|(3<<10)|(3<<6)|(3<<2))) | ((2<<14)|(2<<10)|(2<<6)|(2<<2)) ;//GPG1,3,5,7 set EINT
        rEINTPEND = rEINTPEND|(1<<9)|(1<<11)|(1<<13)|(1<<15);                                //clear eint 9,11,13,15
        rEINTMASK &= ~((1<<9)|(1<<11)|(1<<13)|(1<<15));                                //enable eint 9,11,13,15
        ClearPending(BIT_EINT8_23);
                pISR_EINT8_23 = (U32)Key_ISR;
        EnableIrq(BIT_EINT8_23);       

         while( Uart_GetKey() != ESC_KEY );
         DisableIrq(BIT_EINT8_23);       
        }

回复评论 (1)

代码看起来很繁琐。按键按下,一直有中断,是不是没有清中断标志位?不明白为什么要开外部中断,直接用过定时器中断来扫描吧显得更简单,而且消抖容易实现。你这种直接连到外部中断脚,按键一抖动,就连续中断很多次了,此时,你必要做硬件消抖,但是效果没有软件消抖好。
点赞  2010-5-26 18:05
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复