怎样实现单片机按键双按、长按识别功能?

elvia1983 2007-10-13 11:15:10
我用C51编程设计一个4键小键盘,想让程序判断出按键是否为双击、长按。
在识别双击部分,我想设两次击键的间隔时间为0.5s,但不知道如何设置定时器。

请高手指教,我是新手,请讲解详细一些,万分感谢!
...全文
2960 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
beyond402773274 2010-06-17
  • 打赏
  • 举报
回复
顶11楼,那Codehat 说跟不说一个样,不看也罢
elvia1983 2007-10-23
  • 打赏
  • 举报
回复
codehat 辛苦了
fghlw 2007-10-20
  • 打赏
  • 举报
回复
前几天做了个抗抖 采样N次判断是否稳定
效果还不错,,就是浪费点资源 要一个定时器
icesnows 2007-10-17
  • 打赏
  • 举报
回复
判断按键抬起,从按下到抬起为一次按键,记录这个状态,计数器开始工作,到检测到下一次按键或者计数超时计数器可以停止计数,认为单次按键

长按就是检测到按键按下开始计数,到额定时间按键如果保持按下状态就认为长按
用状态机来做比较好
CedarDiao 2007-10-15
  • 打赏
  • 举报
回复
终于对头了,瀑布汗
CedarDiao 2007-10-15
  • 打赏
  • 举报
回复


使用状态机。
以下以一个按键A为例:键值为A_Key(每一次收到A_Key表示按键A被按下一次).
假设每50ms扫描一次。

状态 意义
-------------------------------------
Idel ---- 按键没有按下(初始状态)
KDowm ---- 按键按下
KUp ---- 按键弹起
-------------------------------------

______________________
| |
v A_Key |
Idel ----> KDowm ----> KUp
^ |
|___|
A_Key

--------------------------------------
看得懂就看吧,看不懂就算了。。。。
格式问题,把#号去掉看。。。
CedarDiao 2007-10-15
  • 打赏
  • 举报
回复
使用状态机。
以下以一个按键A为例:键值为A_Key(每一次收到A_Key表示按键A被按下一次).
假设每50ms扫描一次。

状态 意义
-------------------------------------
Idel ---- 按键没有按下(初始状态)
KDowm ---- 按键按下
KUp ---- 按键弹起
-------------------------------------
#########______________________
#########|#####################|
#########|#####################|
#########v##############A_Key##|
########Idel ----> KDowm ----> KUp
###################^###|
###################|###|
###################A_Key

--------------------------------------
看得懂就看吧,看不懂就算了。。。。
格式问题,把#号去掉看。。。
CedarDiao 2007-10-15
  • 打赏
  • 举报
回复
使用状态机。
以下以一个按键A为例:键值为A_Key(每一次收到A_Key表示按键A被按下一次).
假设每50ms扫描一次。

状态 意义
-------------------------------------
Idel ---- 按键没有按下(初始状态)
KDowm ---- 按键按下
KUp ---- 按键弹起
-------------------------------------
#########______________________
#########| |
#########| |
#########v A_Key |
########Idel ----> KDowm ----> KUp
###################^ |
###################|___|
###################A_Key

--------------------------------------
看得懂就看吧,看不懂就算了。。。。
格式问题。。。
CedarDiao 2007-10-15
  • 打赏
  • 举报
回复
使用状态机。
以下以一个按键A为例:键值为A_Key(每一次收到A_Key表示按键A被按下一次).
假设每50ms扫描一次。

状态 意义
-------------------------------------
Idel ---- 按键没有按下(初始状态)
KDowm ---- 按键按下
KUp ---- 按键弹起
-------------------------------------
______________________
| |
| |
v A_Key |
Idel ----> KDowm ----> KUp
^ |
|___|
A_Key

--------------------------------------
看得懂就看吧,看不懂就算了。。。。
lbing7 2007-10-14
  • 打赏
  • 举报
回复
双击应该比0.5秒要短,最好LZ还是弄一个测试程序,让用户自己设定吧

单片机在做这个上要郁闷哈,咱们的键的那个抖动,嘿嘿

好运...
elvia1983 2007-10-14
  • 打赏
  • 举报
回复
我的意思是设定一个按键双击的时间间隔0.5s,此次按键与上一次按键的时间间隔小于0.5s则判断为双击,大于0.5s则判断为单击。那是不是应该启动一个定时器来对按键释放的时间计时呢?
mdejtod 2007-10-13
  • 打赏
  • 举报
回复
瞎说的,嘿嘿
mdejtod 2007-10-13
  • 打赏
  • 举报
回复
定时器?在中断中判断?
yefengchen 2007-10-13
  • 打赏
  • 举报
回复
LZ,0.5S,有这么设置吗?

貌似很难实现啊

我个人想法是让每次击键都产生一个信号发送给C51,然后在做后续处理

27,374

社区成员

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

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