完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
独立按键
使用独立按键时,请将开发板上面的J5跳线帽接到BTN端,此时为独立按键模式。 独立按键原理很简单,根据原理图 此时一旦按键按下,相应的I/O口就是接地状态,为低电平。 写单片机时我们都知道按键按下需要消抖,我们之前是使用delay延时程序消抖,但是不建议在程序中使用delay,我们可以使用定时器延时来完成消抖。 我们之前写独立按键原理都是 检测按键按下—>延时消抖—>再次检测按键是否还在按下状态—>确认按键按下—>操作—>检测按键是否松开—>延时消抖—>再次检测按键是否松开—>确定按键松开—>操作 但是对于多个按键来说,这样就显得繁琐了,所以在这里介绍一种简单一些的方法。 使用定时器消抖 我们使用定时器定时2ms,然后每次中断扫描一下按键,将扫描值左移至一个变量中,每移动一次就判断当前连续的8次按键状态是不是全1或者全0,如果是全1则判断为弹起,如果是全0则判断为按下,如果是0和1交错,就认为是抖动,不做任何判定。 利用这种方法就可以避免通过延时消抖占用单片机执行时间,而是转化成了一种按键状态判定而非按键过程判定,我们只对当前按键的连续16ms的状态进行判断,而不再关心它在这16ms内都做了什么事情。 void Key_Scan(void) { u16 i; static u8 keybuff[] = {0xff,0xff,0xff,0xff}; keybuff[0] = (keybuff[0]<<1)|s4; keybuff[1] = (keybuff[1]<<1)|s5; keybuff[2] = (keybuff[2]<<1)|s6; keybuff[3] = (keybuff[3]<<1)|s7; for(i = 0;i < 4;i ++) { if(keybuff == 0xff) //连续扫描8次都是1,16ms内都是弹起状态,按键已松开 { KeySta = 1; } else if(keybuff == 0x00) //连续扫描8次都是0,16ms内都是按下状态,按键已按下 { KeySta = 0; } else //其他状态键值不稳定,不作处理 {} } } 这个算法就是经常使用的一种比较好的方法,我比较推荐这种方法,不建议在程序中加入延时。 |
|
|
|
只有小组成员才能发言,加入小组>>
2497 浏览 0 评论
1061浏览 2评论
680浏览 1评论
442浏览 0评论
176浏览 0评论
294浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 19:02 , Processed in 1.171401 second(s), Total 80, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号