关于按键 小抖动 的问题!

zaodt 2009-05-20 05:08:42

while (1)
{
WaitForSingleObject(gPwrButtonIntrEvent, INFINITE);

if (gOffFlag == FALSE)
{
if (PBT_IsPushed()) /* To Filter Noise */
{
Sleep(200);

if (PBT_IsPushed())
{
//RETAILMSG(1, (TEXT("::: Back Light On/Off \r\n")));
}
else
{
// Soft reset and standard suspend-resume both start with suspend for now.
#if (WINCEOSVER >= 400)
// call whichever shutdown API is available
if(gpfnSetSystemPowerState != NULL)
{
gpfnSetSystemPowerState(NULL, POWER_STATE_SUSPEND, POWER_FORCE);
}
else
{
PowerOffSystem();
}
#else
PowerOffSystem();
#endif

// Give control back to system if it wants it for anything. Not in
// power handling mode yet. All suspend and resume operations
// will be performed in the PowerOffSystem() function.
DriverSleep(0, FALSE);
}
}

InterruptDone(SYSINTR_POWER);
}
}



上面是三星的 IST 代码,我读不懂的是处理 小抖动 这块:

就是两个 PBT_IsPushed() 之间延时 200 毫秒这里,


麻烦兄弟们分析解释一下这里是咋回事!
...全文
171 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunrain_hjb 2009-05-21
  • 打赏
  • 举报
回复
第一个PBT_IsPushed()是去抖的,如果是因为抖动而进入中断IST,就不做任何处理。

Sleep(200)是确认200ms后的按键状态,用以区分长按和短按,
如果是长按做相应的处理,如果是短按则做另外的处理。
从代码看起来,长按是关闭背光,短按是关闭系统。
风中老长 2009-05-21
  • 打赏
  • 举报
回复
罗索两句,我没看你代码,本人处理抖动的做法就是按下之后至一个标志为1,在标志为1和按键同时有效才认为按键弹起,至于延迟问题就让线程里循环代码里去解决吧。
zwtchy123 2009-05-21
  • 打赏
  • 举报
回复
uping
gooogleman 2009-05-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Reallyu 的回复:]
这代码是想做短按关机,长按关背光???
[/Quote]
对,200ms 之后发现还是按下就可以做一些动作
[Quote=引用 1 楼 sunrain_hjb 的回复:]
加延时消抖,主要是因为在进入该IST线程时,该中断已经被屏蔽掉了,
直到InterruptDone()后才重新打开,
所以,这中间即使有抖动也不会多次触发中断。
[/Quote]

赞同,因为第一次扑捉到中断后,在ISR就会屏蔽这个中断,以后由于抖动,但是中断屏蔽了,所以就不必去抖动了。

那个延时不是去抖动的,而是读是否还按着键盘。

Reallyu 2009-05-20
  • 打赏
  • 举报
回复
这代码是想做短按关机,长按关背光???
zaodt 2009-05-20
  • 打赏
  • 举报
回复
可为什么 PBT_IsPushed() 第一次为真执行,而第二次却为假执行。
sunrain_hjb 2009-05-20
  • 打赏
  • 举报
回复
加延时消抖,主要是因为在进入该IST线程时,该中断已经被屏蔽掉了,
直到InterruptDone()后才重新打开,
所以,这中间即使有抖动也不会多次触发中断。

19,520

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧