[ZLG-ARM] 请教:按键延时去抖的疑问

[复制链接]
1985|1
 楼主| liutongen 发表于 2007-6-5 18:10 | 显示全部楼层 |阅读模式
os, TI, ST, IO, pi
您好:关于延时去抖我有一些不解,请看下面的程序段<br /><br />&nbsp;void&nbsp;&nbsp;Task(void&nbsp;*pdata)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;pdata&nbsp;=&nbsp;pdata;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;避免编译警告&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(;;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTimeDly(OS_TICKS_PER_SEC&nbsp;/&nbsp;50);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;第一个延时20毫秒&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((IOPIN&nbsp;&&nbsp;KEY1)&nbsp;!=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTimeDly(OS_TICKS_PER_SEC&nbsp;/&nbsp;50);/*第二个延时20毫秒用于去抖*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((IOPIN&nbsp;&&nbsp;KEY1)&nbsp;!=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTaskResume(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;((IOPIN&nbsp;&&nbsp;KEY1)&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTimeDly(OS_TICKS_PER_SEC&nbsp;/&nbsp;50);&nbsp;&nbsp;&nbsp;/*第三个延时20毫秒&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />疑问:<br />1.第一个延时20毫秒是起什么作用的?<br />2.当有按键按下时将执行第二个延时,执行去抖延时。若延时后按键仍被按下则往下执行OSTaskResume(0);恢复任务,关键是若去抖延时后按键信息不再存在,那么程序将在第二个<br />if&nbsp;((IOPIN&nbsp;&&nbsp;KEY1)&nbsp;!=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />中循环,若再次有按键按下信息时,是不是就直接从该循环中往下执行了,若是的话,那么这次按键信息就没有延时去抖功能了!不知分析对否?<br />3.若执行到OSTaskResume(0);&nbsp;即恢复任务后,将转去执行被挂起的程序,不知OSTaskResume(0);后面的语句段有和作用?<br />请多多执教,不胜感激!<br />
 楼主| liutongen 发表于 2007-6-5 18:18 | 显示全部楼层

想通了第一个问题!

第一个延时是先去一次抖,然后再执行按键的判断,这样更保险、更有效!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

20

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部