3149|1

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

s3c2440板扩展IO口来驱动4×4矩阵键盘,出现问题 [复制链接]

扩展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);       
        }

最新回复

代码看起来很繁琐。按键按下,一直有中断,是不是没有清中断标志位?不明白为什么要开外部中断,直接用过定时器中断来扫描吧显得更简单,而且消抖容易实现。你这种直接连到外部中断脚,按键一抖动,就连续中断很多次了,此时,你必要做硬件消抖,但是效果没有软件消抖好。  详情 回复 发表于 2010-5-26 18:05
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
代码看起来很繁琐。按键按下,一直有中断,是不是没有清中断标志位?不明白为什么要开外部中断,直接用过定时器中断来扫描吧显得更简单,而且消抖容易实现。你这种直接连到外部中断脚,按键一抖动,就连续中断很多次了,此时,你必要做硬件消抖,但是效果没有软件消抖好。
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表