最近在开发一个项目,控制面板上总共有40个按键,之前规格需求都是只要实现按键短按功能即可,所以代码框架上主要是按照短按逻辑去实现的;最近产品部提出增加按键长按功能这个需求,当然这个需求也非常合理,确实有些按键也需要支持长按。然后就开始研究代码怎么实现比较好。
然后就开始研究代码怎么实现比较好。先是解读了一下按键芯片,看怎么实现的,原来是触发按键中断后,如果按键一直保持,其实只要一直轮询读取按键码值即可,如果一直有码值且没有变化过,说明某个按键被一直按着。再是查看代码,看怎么实现,调试过程中居然发现,增加几行代码居然就能实现所有按键的长按功能了,太好了。增加的代码其实主要如下:
为了增加代码可维护性,保留原来功能,通过增加宏来实现新功能:
- //add key long press function
- #define KEY_LONG_PRESS_ENABLE
首先是在按键中断里增加三行,在触发按键中断后先关闭中断使能:
- #ifdef KEY_LONG_PRESS_ENABLE
- DISABLE_KEY_INTERRUPT();
- #endif
然后把原来的读取到按键标志位key_event后直接清除移到无法读取到正确按键值那里,即有按键的时候,就一直执行:
- #ifndef KEY_LONG_PRESS_ENABLE
- key_event = FALSE;
- #endif
读取到异常按键或无按键值时,重新使能中断,开启下一次按键检测:
- #ifdef KEY_LONG_PRESS_ENABLE
- key_event = FALSE;
- ENABLE_KEY_INTERRUPT();
- #endif
这么实现后,通过上位机监控按键数据的结果就是有按下就一直持续为1:
后面把样机给客户测试,客户使用起来觉得很方便很实用,果断同意此功能增加到规格需求里面,Nice。
也算误打误撞吧,不过庆幸之前代码框架写的好,增加几行代码就能实现新需求,客户很满意!
|