蓝桥杯之单片机设计与开发(3)——独立按键

独立按键

使用独立按键时,请将开发板上面的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[i] == 0xff)		//连续扫描8次都是1,16ms内都是弹起状态,按键已松开
		{
			KeySta[i] = 1;
		}
		else if(keybuff[i] == 0x00)	//连续扫描8次都是0,16ms内都是按下状态,按键已按下
		{
			KeySta[i] = 0;
		}
		else	//其他状态键值不稳定,不作处理
		{}
	}
}

这个算法就是经常使用的一种比较好的方法,我比较推荐这种方法,不建议在程序中加入延时。

 

 

 

 

 

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值