打印
[ZLG-ARM]

请教:按键延时去抖的疑问

[复制链接]
1413|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liutongen|  楼主 | 2007-6-5 18:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
os, TI, ST, IO, pi
您好:关于延时去抖我有一些不解,请看下面的程序段

 void  Task(void *pdata)
{
    pdata = pdata;                       /* 避免编译警告 */

    for (;;)
    {
        OSTimeDly(OS_TICKS_PER_SEC / 50);      /* 第一个延时20毫秒 */
        if ((IOPIN & KEY1) != 0)
        {
            continue;
        }
        OSTimeDly(OS_TICKS_PER_SEC / 50);/*第二个延时20毫秒用于去抖*/
        if ((IOPIN & KEY1) != 0)
        {
            continue;
        }
        OSTaskResume(0);
        while ((IOPIN & KEY1) == 0)
        {
            OSTimeDly(OS_TICKS_PER_SEC / 50);   /*第三个延时20毫秒 */
        }
    }
}

疑问:
1.第一个延时20毫秒是起什么作用的?
2.当有按键按下时将执行第二个延时,执行去抖延时。若延时后按键仍被按下则往下执行OSTaskResume(0);恢复任务,关键是若去抖延时后按键信息不再存在,那么程序将在第二个
if ((IOPIN & KEY1) != 0)
        {
            continue;
        }
中循环,若再次有按键按下信息时,是不是就直接从该循环中往下执行了,若是的话,那么这次按键信息就没有延时去抖功能了!不知分析对否?
3.若执行到OSTaskResume(0); 即恢复任务后,将转去执行被挂起的程序,不知OSTaskResume(0);后面的语句段有和作用?
请多多执教,不胜感激!

相关帖子

沙发
liutongen|  楼主 | 2007-6-5 18:18 | 只看该作者

想通了第一个问题!

第一个延时是先去一次抖,然后再执行按键的判断,这样更保险、更有效!

使用特权

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

本版积分规则

10

主题

20

帖子

0

粉丝