Stm32F407——机械按键识别_key(5)

main.c

int main(void)
{
    
    
	u8 key_value = 0;
	Stm32_Clock_Init(336,8,2,7);//系统时钟初始化
	LED_Init();//LED灯初始化
	BEEP_Init();
	KEY_Init();
	while(1)
	{
    
    
		key_value = KEY_Scan();//获得按键值
		switch(key_value)//判断按键值,并做相应的动作
		{
    
    
			case 1: LED0 = ~LED0; break;//KEY0按下
			case 2: LED1 = ~LED1; break;//KEY1按下
			case 3: BEEP = ~BEEP; break;//KEY2按下
			case 4: LED0 = ~LED0; LED1 = ~LED1; break;//WAKE_UP按下
		}
	}
}

key.c

void KEY_Init(void)
{
    
    
	RCC->AHB1ENR |= (1<<0); //使能PA口的时钟
	RCC->AHB1ENR |= (1<<4); //使能PE口的时钟
	GPIO_Set(GPIOA,(1<<0),0,0,0,2);//PA0输入下拉
	GPIO_Set(GPIOE,((1<<2)|(1<<3)|(1<<4)),0,0,0,1);//PE2,3,4输入上拉
}
/*KEY_Scan函数有按键按下返回按键的值,没有按键按下返回0;
  按键的值:KEY0=1;KEY1=2;KEY2=3;KEY_UP=4. */
u8 KEY_Scan(void)
{
    
    
	static u8 key_flag=1; //按键弹起标志位为1,按下为0
	if(((WAKE_UP==1)||(KEY0==0)||(KEY1==0)||(KEY2==0))&&(key_flag==1))
	{
    
    //按键刚刚处于弹起状态,但现在有按下
		Delay_ms(10);//延时20ms,消除抖动
		if((WAKE_UP==1)||(KEY0==0)||(KEY1==0)||(KEY2==0))
		{
    
    //确实有按键按下
			key_flag = 0; //key_flag=0说明为按下状态,防止重复触发导致按下一次但报多次按下
			if(KEY0==0) return 1;
			if(KEY1==0) return 2;
			if(KEY2==0) return 3;
			if(WAKE_UP==1) return 4;	
		}	
	}
	if(((WAKE_UP==0)&&(KEY0==1)&&(KEY1==1)&&(KEY2==1))&&(key_flag==0))
	{
    
    //按键处于弹起状态而且刚刚是按下状态
		Delay_ms(10); //消除弹起抖动
		if((WAKE_UP==0)&&(KEY0==1)&&(KEY1==1)&&(KEY2==1))
		{
    
    //确实是弹起了,将标志置1
			key_flag = 1;
		}	
	}
	return 0;//没有按键按下返回0
}

猜你喜欢

转载自blog.csdn.net/weixin_53391957/article/details/117424507