3409|5

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

键盘防抖问题 [复制链接]

8个独立中断按键。
在中断后,先进行延时防抖,然后进行检查哪个按键被按下。当按键检查完后,判断按键是否释放,若释放,则返回。程序如下所示。
但是运行的时候,发现有时候按键后,按键次数加2 ,也就是说进入中断两次。难道判断按键释放的程序不对吗?到底该怎样考虑才能保证每次按键只会响应一次?

程序:
BYTE GetKey()                                                                                                                                                                        
{  
   BYTE        k;
   unsigned char i,value;
   value=100;       
        while(value--)
        {
                for(i=220;i>0;i--)
                ;
        }
    k=P1;
   k=k&0xFF;
  // return k;
   
  switch(k)
   {
             case 0xFE:
             return 1;
             break;
       
                 case 0xFD:
             return 2;
             break;
       
                 case 0xFB:
             return 3;
             break;
       
                 case 0xF7:
             return 4;
             break;
       
                 case 0xEF:
             return 5;
             break;
       
                 case 0xDF:
             return 6;
             break;
       
                 case 0xBF:
             return 7;
             break;
       
                 case 0x7F:
             return 8;
             break;
       
                 default:
                 return 0;
                 break;

   }

}
//*****************************************************************************
//外部中断响应程序
//*****************************************************************************
Int0_process() interrupt 0 using 0
{       

    BYTE k;
    EA=0; //屏蔽所有中断
    key1=GetKey();
    key++;

  while(1)  //等待按键释放
           {
             k=P1;
                 k=k&0xFF;
         if(k!=0xFF)
               {
                  _nop_();
               }
              else
                  break;
             }

        EA=1;
}

最新回复

为了确保按键释放,可以把中断响应程序改为如下: Int0_process() interrupt 0 using 0 {     BYTE k,i;     EA=0; //屏蔽所有中断      P1 = 0xff; //如果初始化过,这里就不需要了      key1=GetKey();     key++;         k = 0;     while(k  详情 回复 发表于 2009-6-3 14:05
点赞 关注

回复
举报

83

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
检测第一次下,延时,再次检测按下,如果发现还是按下,那么就什么事情都不错,等待。
while(按键按下?);即可。
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
延时或加去抖电容
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
要检测释放的过程,否则这个和长按就冲突了...

 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

5
 
正如1楼所说,判断按下的过程中,是需要多次检测的。这样,在键盘按下的不稳定期间,若检测到键盘有接触不好的情况,是不会进入中断的。
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

6
 

为了确保按键释放,可以把中断响应程序改为如下:
Int0_process() interrupt 0 using 0
{

    BYTE k,i;
    EA=0; //屏蔽所有中断
     P1 = 0xff; //如果初始化过,这里就不需要了
     key1=GetKey();
    key++;
   
    k = 0;
    while(k<100)  //等待按键释放
    {
        if(P1!=0xFF)
            k = 0;
        else
            k++;
        for(i=0; i<200; i++);
    }

    EA=1;
}

可以试试看!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表