单片机——按键检测

     在实现人机交互的需求下,最节约成本的方式莫过于外部按键

  上图是共阳极接法,IO管脚我们可以设置为下拉输入,当按键松开时,IO读取到的为低,按下时,读取为高。

  由于机械按键会有抖动问题,如下图:

大家通常会采用滤波的方式进行软件消抖,部分氪金大佬会选择在硬件上加个电容实现消抖:

      我毕竟不是氪金大佬,所以选择软件消抖。这里切记不要用阻塞式Delay,通过标志位的判断以及用计数器来确定是否是干扰还是真正的按下,这种编程思想在单片机尤其是裸机邻域中很重要,在这个基础上我们判断长按,短按,单机,双击就都很简单,只需要多用几个计数器即可。

  按键检测常用的方式有外部中断以及轮询,这里我们使用轮询方式

代码如下:

	//R档输入   PA14 
    //Input_R_Flag 按键是否按下标志位  1按下   0没有按下
    bit Input_R_Flag=0;
   void  Key_Scan()  //按键扫描函数,时基5ms
  {
	if(Input_R_Flag==1)
	{
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_14)==0) //读取IO口电平
		{
			if(++Input_R_Cnt>=10)  //消抖
			{
				Input_R_Cnt=0;
				Input_R_Flag=0;
			}
		}	
			else
				Input_R_Cnt=0;	   //计数清零
	}
	else 
	{
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_14)==1)
		{
			if(++Input_R_Cnt>=10)  //按下事件超过10*时基
			{
				Input_R_Cnt=0;
				Input_R_Flag=1;   //确定为按下状态
				//R_F+=1;
				//if(R_F>=2)
					//R_F=0;
			}		
		}	
		else		
				Input_R_Cnt=0;
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值