打印

延时多少时间

[复制链接]
楼主: wuhany
手机看帖
扫描二维码
随时随地手机跟帖
21
wuhany|  楼主 | 2013-8-27 22:09 | 只看该作者 回帖奖励 |倒序浏览
上升沿我一般少用得到,要用也行,不过还要加多抬起的消抖。

使用特权

评论回复
22
jlyuan| | 2013-8-27 22:09 | 只看该作者
void main()
{
   P3=0xff;
   wela=1;
   P2=0x00;
   wela=0;
   while(1)
   {
   if(d2==0)    //检测是否有键按下
   {
   delay(5);
   if(d2==0)   //确认是否有键按下
   {
   P1=0x00;
   num++;
   if(num==16)
   num=0;
   }
   while(!d2);   //键盘松手检测
   delay(5);
   while(!d2);
   }
   else
   P1=0xff;
   dula=1;
   P0=table[num];
   dula=0;
   }
   }
   void delay(uint z)
{
   uint x,y;
   for(x=100;x>0;x--)
      for(y=z;y>0;y--);
}
我用的是5MS,还行。。。用键盘加数减数枚问题。。带松手检测按下松开后相应。。。这是我学习键盘时写的一个小程序希望对你有用。。。

使用特权

评论回复
23
wuhany|  楼主 | 2013-8-27 22:10 | 只看该作者
谢谢,不过,消抖还是要中断的好

使用特权

评论回复
24
yszong| | 2013-8-27 22:10 | 只看该作者
键盘 我的做法是例如定时1ms扫描一次键盘,若连续10次扫描到按键按下,则查询按键已经按下标志:
此标志为0则证明这是新的按下行为,置标志,处理按键程序;
此标志为1则证明按键已经按下,处理程序已经执行,不再重复执行。
扫描时发现按键释放,则清标志。

使用特权

评论回复
25
dengdc| | 2013-8-27 22:11 | 只看该作者
消抖只是一个概念,一般在几个MS~100MS之间
延时也是消抖,定时调用也是消抖,只是实方法不同

使用特权

评论回复
26
heweibig| | 2013-8-27 22:12 | 只看该作者
//*************************************************
//函数名称:SingleKeyScan();
//函数功能:单一按键扫描
//作用区域:外部调用
//函数说明:20ms调用一次。
//         sKeyState 为按键状态
//                        0: 无按键按下
//                        1:有按键按下 未消抖
//                        2~100:消抖完毕 未放开按键 短按阶段
//                        100:长按阶段 按键生效
//                        101:长按生效
//*************************************************                    
void SingleKeyScan()
{
        if (KEY == 0)                                                              // 有键按下
        {
                if (sKeyState == 0)
                        sKeyState = 1;                     // 进入消抖状态

                else if (sKeyState != 101)
                {
                    sKeyState++;
                   if(sKeyState >= 100)                               //100*20ms = 2s
                   {
                           sKeyState = 100;
                           LPEvent();
                   }
                }                  
        }
        else
        {
                if((sKeyState == 1) || (sKeyState == 101))        //抖动或长按结束
                        sKeyState = 0;
                else if ((sKeyState >= 2) && (sKeyState < 100))
                        SPEvent();                              // 短按按键生效
        }
}

使用特权

评论回复
27
lizye| | 2013-8-27 22:13 | 只看该作者
楼主这个程序稍作修改就能得到你想要的结果

bit   fg_shake;               =0
bit   fg_scan;                 =0

//中断中,每10ms就fg_scan=1;
void    main(void)
{
          -----;
          if(fg_scan==1)
          {
                     fg_scan = 0;
                     keyscan();
          }
}

void   keyscan(void)
{
          if(key_on ==1) //有键按下
          {
                    if(fg_shake==0)  
                    {
                                fg_shake=1;
                    }
                    else  if(fg_shake_1==0)  
                    {
                                fg_shake_1=1;
                               //按键处理

                   }
          }
          else   fg_shake =0;
}

使用特权

评论回复
28
zhaoxqi| | 2013-8-27 22:13 | 只看该作者
5ms读一次,只要不是按下,清计数值。当计数值大于5至10时,读键值。

使用特权

评论回复
29
jiajs| | 2013-8-27 22:15 | 只看该作者
每隔1ms扫描一次键盘, 有键盘输入时7~15ms消抖.

使用特权

评论回复
30
zhanghqi| | 2013-8-27 22:15 | 只看该作者
我用示波器测试过,4ms足够了。采用的是普通的4脚直插按键,上拉10K电阻。而且多次测试,发现抖动全部发生在按键弹起的过程中,按下的过程,电平直接被拉低,没有出现毛刺现象,如果有的话,好像只有一次,概率极低。

使用特权

评论回复
31
zhenykun| | 2013-8-27 22:18 | 只看该作者
和你的键盘有关系,通常设10mS-30mS;
没必要设的特别灵敏;

使用特权

评论回复
32
wyjie| | 2013-8-27 22:18 | 只看该作者
键盘扫描个人感觉最好的方法就是定时中断扫描加状态机是比较好的方法,消除抖动我一般是用15ms,用起来比较不错。

使用特权

评论回复
33
yszong| | 2013-8-27 22:19 | 只看该作者
10MS行,我搞到300MS也不错,这个没什么定式的吧,试呗,感觉好就成了

不过时间太长了最好用系统啊,裸机程序还是别太长了,没效率了

使用特权

评论回复
34
dengdc| | 2013-8-27 22:19 | 只看该作者
弄个计数器,串入主循环不断扫描,每次扫描到有键按下计数器加一,加到100时处理一次!我就是这样弄的,效果还不错!

使用特权

评论回复
35
shimx| | 2013-8-27 22:21 | 只看该作者
和按钮材料结构相关,一般20mS.

使用特权

评论回复
36
jiaxw| | 2013-8-27 22:22 | 只看该作者
没有 刻意去消抖,1ms  扫描按键一次  ,有 能连续加到 50ms的  ,说明按键按下

使用特权

评论回复
37
spark周| | 2013-8-27 22:23 | 只看该作者
不用这么复杂,3句话解决问题
unsigned char  Trg;
unsigned char  cont;
void   Key_scan (void)
{ unsigned  char  Readdata=Px^0XFF;
  Trg=Readdata&(Readdata^cont);
  cont=Readdata;
}

使用特权

评论回复
38
liliang9554| | 2013-8-27 22:24 | 只看该作者
我是至少10ms

使用特权

评论回复
39
wuhany|  楼主 | 2013-8-27 22:25 | 只看该作者
我整理一下,多谢大家

使用特权

评论回复
40
wuhany|  楼主 | 2013-8-27 22:25 | 只看该作者
先结贴吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则