在实现人机交互的需求下,最节约成本的方式莫过于外部按键
上图是共阳极接法,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;
}
}