Hi,friends
关于 capsense 用作开关按键时,我有一个疑问,如下截图
在 capsense 扫面完成之后判断是否被触发。如果不将 capsense stop ,那么 if(CapSense_IsWidgetActive(CapSense_BUTTON0_WDGT_ID)),这个 if 判断会执行多次(在手指已经离开 button 的情况下,按照 delay 时间反转多次程序中 led_status 的值。原本想用做控制 led 开关的,实际现象是 led 按照 delay 的时间闪烁),只有先将 capsense 停止了才能正常的只执行一次 if 判断后的动作。
请指正一下正确的写法,或者有没有相关的示例程序? 如果可以的话,还请解释一下这个 if 判断为什么会执行多次,如果 将 delay 时间改长一点,比如说 1000 ms,这个闪烁的现象会更加直观(在手指触摸离开之后,间隔1000ms 闪烁 三、四次左右)。如果是因为 capsense 外设扫描是独立于 CPU 之外的工作的,那么为什么 button 的触发已经停止了,程序执行这个 if 判断还是成立的呢?我是在 kit-149 上面尝试的。很多疑惑,请帮我解释一下,感谢。
已解决! 转到解答。
1:你代码设计的逻辑是,只要active,就会一直调用led_status=~led_status;一般情况下,你可以按照下面的代码逻辑测试,active的时候led 亮,inactive的时候led灭。
if(CapSense_NOT_BUSY == CapSense_IsBusy())
{
CapSense_ProcessAllWidgets(); /* Process all widgets */
if(CapSense_IsWidgetActive(CapSense_BUTTON0_WDGT_ID))
{
LED12_Write(0);
}
else
{
LED12_Write(1);
}
CapSense_RunTuner();
/* To sync with Tuner application */
#if (0u != CapSense_SELF_TEST_EN)
measure_cp(); /* Measure the sensor capacitance using BIST */
#endif
CapSense_ScanAllWidgets(); /* Start next scan */
}
}
2: 你的代码因为只是截取的一部分,我也不好分析。你可以用附件的代码在cy8ckit-149上面测试。
非常感谢你的耐心回答,你的这个方法可以很好的实现这个功能,但还是有点疑问。当手触控的一瞬间会被扫描到很多次这个我可以理解,但是有delay的时候手离开了还是会反转 pin几次,不符合程序执行的顺序,难道是 capsense 的状态被记录了下来,按照先后顺序逐个给与 if(CapSense_IsWidgetActive(CapSense_BUTTON0_WDGT_ID))这句话做判断,而不是根据这个 if 判断之前的一次扫描的 capsense 状态
这个可能跟你tunning的参数有关系。你可以打开tuning看一下,或者测一下,我给你的代码现在有没有问题。