关于按键检测 ,

2019-07-20 22:17发布

程序中按键怎么写,连开三贴了,谢谢老师们的指点,我愚笨 ,还是没有想清楚 。所以决定把问题问的详细点 ,然后暂时成为我的套路 。求老师们可以上传些成功历程,或是详细指点一下 ,那么 ,问题来了  :

情景: 如果我程序中要做的事情很多 ,按键处理只是其中部分功能 ,那么


1 扫描IO口的方法好  ,还是外部中断中断的方式好 ?

2 如果是用定时器扫描IO口的话 ,这部分代码写在哪里 ?
3如果程序裸奔的话 ,怎么把按键按下这一事件告知按下按键想要触发的那个事件?
4如果还有松手检测,松手检测怎么写?
5想写一个长时间,比如按下3秒才认为按下,怎么写 ,同样长按下怎么告知想要触发的那个事件?
6同一按键怎么区分长时间按下和短时间按下 ?
7如果写组合键 ,思路套路又是怎样 ?

工作多年 ,水平薄浅 。别笑我 ,求赐教!!


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
xianshasaman
2019-07-22 03:23
对于按键的驱动,任何情况下都不建议直接使用外部中断,使用中断的特点是响应快,但是按键的应用不需要响应很快。而使用外部中断引起的麻烦却不少。1.该不该在中断里做毫秒级的延时?如果只是中断发送消息,主循环里的按键处理才是主体,才进行延时,那这个中断就一点意义都没有,还不如用定时器去触发按键扫描周期。2.按键功能如果比较丰富,怎么做到不干扰别的任务。比如你说的长按功能,如果没有定时器参与进来,那这3秒就不能干别的了,如果进一步想做出按住后连续触发的功能,程序就彻底不能用了。


如果任务较多,个人建议用操作系统。按键的驱动就是很典型的适用于操作系统的应用,毫秒级的延时正好可以用taskDelay这种函数,释放了cpu的占用,程序可以去干别的。
如果不想用操作系统,那可以定时器来辅助。基本思路就是使用状态机的模式,将按键的处理做成周期性执行的操作,如果某些场合需要的延时不一样,那就用计数变量把长延时拆成短延时。每个周期按键扫描函数执行一次,用定时器同步,函数内没有任何软延时。
建议将去抖动和按键功能触发做成2个层次,底层的去抖动处理只实时更新每个按键IO的电平,上层的触发检测根据不同的电平和每个按键的模式配置、状态机的状态,来判断需要执行的操作。 假如以后移植到rtos里,直接做一个周期性执行的任务即可。

目前手里没有现成的代码,这个只是思路。不过前几年在这个论坛上见过有人发过很详细的按键驱动代码,功能很全,当时我还没收藏,你可以找找看。

一周热门 更多>