极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 21187|回复: 5

求助:关于中断扫描键盘的难题

[复制链接]
发表于 2019-2-26 23:16:34 | 显示全部楼层 |阅读模式
esp8266+一个单片机触摸mcu

触摸键盘原理是这样的,我自己的主mcu是esp8266,触摸那边是一个拥有触摸功能的mcu,8266和触摸之间是通过中断来计数脉冲个数进行通讯的。

通讯线是2条,第一条(以下简称Apin)是触摸有效产生一个高电平,大概10ms(通讯基本上在8.5m左右完成),第二条(以下简称Bpin)是脉冲数据(以下简称KeyID),比如Key1是1个脉冲,Key2是2个脉冲,Key10是10个脉冲。

我现在的程序是:
在主程序中开启中断检测Apin,中断检测模式为CHANGE,当第一个CHANGE到来时,开启Bpin中断检测,检测模式RISING,用于统计后边到来多少个脉冲数,在第二个CHANG到来的时候,结束Bpin中断检测并输出脉冲统计个数。此为按键数据的获取。

这个触摸mcu没有配置选项,程序是固定的,也没有锁定时间,如果我一直按着这个键,那么它会一直按上边的模式输出。

我程序拿到触摸数据之后,通过定义一个数组,根据KeyID作为下标,获取数组内容进行LED、数码管、继电器等控制操作……

现在的难题:
1、我无法判断当前的KeyID是由于我一直触摸而产生的重复数据,还是我第二次点击产生的数据。比如,作为开关来说,点击一次为开再点击一次为关。
2、由于重复快速输出KeyID,导致继电器等执行代码会快速的变动,继电器产生抖动现象……

求思路解决问题……
回复

使用道具 举报

发表于 2019-2-27 22:51:03 | 显示全部楼层
本帖最后由 Ansifa 于 2019-2-27 22:54 编辑

Apin一次触摸只有一次翻转,触摸就应该看Apin,而不是看脉冲。所以Bpin就不应该中断,哪怕中断也要低等级。

我建议只有A中断并且只有RISING,中断函数只有一句话,Mark=1
loop内死循环判断Mark是否为1,如果为1,记下当前时间t,

在millis()-t<100ms(10个脉冲)的时间内,loop()内用查询电平高低变化法统计KeyID。超时则把这时间内的脉冲作为结果。并且将Mark=0。等待下次中断。

还有,建议使用IIC的电容触摸芯片。比如SC12A
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-27 23:21:23 | 显示全部楼层
Ansifa 发表于 2019-2-27 22:51
Apin一次触摸只有一次翻转,触摸就应该看Apin,而不是看脉冲。所以Bpin就不应该中断,哪怕中断也要低等级。 ...

唉,我手贱买了一个小众的触摸开关,方案就是我上边说的那个……

看下边一个完整的脉冲简易图示:
APin:_____________________
_____|                                    |_______
BPin:  ___        ___       ____
_____|     |___|     |___|      |_________

我的程序是,在APin的上升沿触发,开启Bpin中断进行脉冲上升沿计数,在Apin的下降沿触发关闭Bpin,脉冲计数是没问题,问题是触摸芯片会类似微触开关那种抖动,每次按键它不是有且只有一次脉冲,而是会至少发送一次脉冲,多的时候就看你手指多久离开触摸键盘了……

现在我的问题:
1、如何避免错误的接收第一次触发之后的“抖动”信息,通常有2~6个Apin中断,也就是说按键抖动了2~6次。这个次数不定。
2、我的操作有类似A1 Key按下第一次开灯,再按一次关灯……该用什么思路实现呢
回复 支持 反对

使用道具 举报

发表于 2019-3-1 09:53:32 | 显示全部楼层
現在我的問題:
1、如何避免錯誤的接收第一次觸發之後的“抖動”信息,通常有2~6個Apin中斷,也就是說按鍵抖動了2~6次。這個次數不定。

理論上你的鍵盤主控 ECU 就應該自行做好按鍵抖動的濾除,不是靠後端來濾

如果要用後端來濾,你可能要自己做判斷式,例如記錄最後一次按鍵放開的時間,
若這次按下的時間與上次間隔夠久(變成所謂的第一次觸發),就在接收第1個 A pin
中斷後,暫停接收一段時間的 A pin 中斷,時間長短跟你有示波器可以抓得準的話
應該沒問題,沒有示波器的話就自己推算(TRY & ERROR)

2、我的操作有類似A1 Key按下第一次開燈,再按一次關燈……該用什麼思路實現呢

設個旗標變數,例如用 0/1 來記錄目前的作動狀態(0:未作動,1:已作動)
在觸發作動時反轉旗標作為輸出指定(0→1,1→0),就能做到雙態切換了
回复 支持 反对

使用道具 举报

发表于 2019-3-13 21:58:16 来自手机 | 显示全部楼层
中断里面比较时间,如果本次中断与上次中断间隔时间小于200ms就跳出中断并记录本次中断时间用于下次中断
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-15 12:21:05 | 显示全部楼层
ldy2370 发表于 2019-3-13 21:58
中断里面比较时间,如果本次中断与上次中断间隔时间小于200ms就跳出中断并记录本次中断时间用于下次中断 ...

我现在已经搞定了。
我直接在第一次完成键盘数据读取后,封锁200ms。就算中断也不处理键盘数据。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-24 15:13 , Processed in 0.039060 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表