打印

键盘扫描的消抖一般要延时多少时间

[复制链接]
楼主: wangzsa
手机看帖
扫描二维码
随时随地手机跟帖
21
zhanghqi| | 2022-2-20 21:18 | 只看该作者 回帖奖励 |倒序浏览
用状态机吧 延时消抖的话时间都浪费了

使用特权

评论回复
22
llljh| | 2022-2-20 21:20 | 只看该作者

10ms 较合适

使用特权

评论回复
23
huangchui| | 2022-2-20 21:22 | 只看该作者
消抖,直接用while不就行了?

使用特权

评论回复
24
supernan| | 2022-2-20 21:24 | 只看该作者
消抖,直接用while不就行了?

使用特权

评论回复
25
huanghuac| | 2022-2-20 21:26 | 只看该作者
有必要这么复杂?直接用while不就行了?

使用特权

评论回复
26
zhenykun| | 2022-2-20 21:30 | 只看该作者

在按键电路上加个并联小电容,软件扫描间隔一般大于10毫秒就可以了。
反正人手是搞不了那么快的,就算扫描间隔大于100毫秒也不会有什么问题(看你产品的操控性要求)。

使用特权

评论回复
27
supernan| | 2022-2-20 21:32 | 只看该作者
定时器里放一个标志位每次进中断检测标志位到什么时间干什么事

使用特权

评论回复
28
zhaoxqi| | 2022-2-20 21:34 | 只看该作者

键盘扫描消抖似乎几十毫秒左右就够了
更多操作

使用特权

评论回复
29
jiajs| | 2022-2-20 21:36 | 只看该作者
不同的按键抖动时间是不同的,小按键抖动小,大按键抖动大点。可以用示波器或逻辑分析仪测试一下。选择合适的去抖时间,提高系统运行效率。

使用特权

评论回复
30
wangzsa|  楼主 | 2022-2-20 21:38 | 只看该作者
上升沿我一般少用得到,要用也行,不过还要加多抬起的消抖。

使用特权

评论回复
31
chenjunt| | 2022-2-20 21:41 | 只看该作者
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,还行。。。用键盘加数减数枚问题。。带松手检测按下松开后相应。。。这是我学习键盘时写的一个小程序希望对你有用。。。

使用特权

评论回复
32
wangzsa|  楼主 | 2022-2-20 21:43 | 只看该作者
谢谢,不过,消抖还是要中断的好

使用特权

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

使用特权

评论回复
34
chenjunt| | 2022-2-20 21:50 | 只看该作者

消抖只是一个概念,一般在几个MS~100MS之间
延时也是消抖,定时调用也是消抖,只是实方法不同

使用特权

评论回复
35
renyaq| | 2022-2-20 21:53 | 只看该作者

//*************************************************
//函数名称: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();                              // 短按按键生效
         }
}

使用特权

评论回复
36
lizye| | 2022-2-20 21:57 | 只看该作者

楼主这个程序稍作修改就能得到你想要的结果

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

使用特权

评论回复
37
pengf| | 2022-2-20 22:00 | 只看该作者
不需要专门做消抖:  (中断中处理流程,中断外处理流程类似)
   10mS 中断扫一次键, 检测到按键,相应键值寄存器计数加一 ,最高 bit 置零(也可以后续处理),未检测到按键,相应寄存器清零,
       寄存器值等于 2,认定一次按键按下, 大于 0x31 (0.5 秒、或其它时间值),开始按键重发 -- 当 d2 d1 d0 = 010  (此时 0.08 秒连发重复一次,  若 d3 d2 d1 d0 = 0010 则为0.16秒连发一次,设置为其它键扫延时也很好处理) 时认定一次相应按键按下。
   非中断内处理时,流程被其它任务阻塞时,多余连发可以抛弃,也可以保留,看人机界面设定。

使用特权

评论回复
38
huangchui| | 2022-2-20 22:03 | 只看该作者
5ms读一次,只要不是按下,清计数值。当计数值大于5至10时,读键值。

使用特权

评论回复
39
yszong| | 2022-2-20 22:08 | 只看该作者
帮楼主顶一下

使用特权

评论回复
40
renyaq| | 2022-2-20 22:11 | 只看该作者
每隔1ms扫描一次键盘, 有键盘输入时7~15ms消抖.

使用特权

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

本版积分规则