2083|1

69

帖子

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;
}

最新回复

你在释放检测时候也增加 几个小周期的防抖检测 k=k&0xFF; if(k!=0xFF)       {           _nop_();   while()     } else { i=1000 while(i--);   k=P1; if(k=0xFF) break; }  详情 回复 发表于 2009-6-6 16:49
点赞 关注

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你在释放检测时候也增加 几个小周期的防抖检测

k=k&0xFF;
if(k!=0xFF)
      {
          _nop_();
  while()
    }
else
{ i=1000
while(i--);
  k=P1;
if(k=0xFF) break;
}
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

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