STM32按键单击双击和长按实验

学习目标:

1. 按键单击
2. 按键双击
3. 按键长按

实验思路:

使用定时器来完成对按键长按,单击,双击的检测。

实验代码:

//定时器采用的定时器7周期周期为30ms
#define Press_Time 60								//长按时间				1.8s
#define KEY_Response_Time 10				//按键响应时间		300ms
enum{
	Click = 0x01,//单机标志				  
	Double_Click = 0x02,//双击标志
	Press = 0x04 //长按2s标志
};

typedef struct {
	uint8_t volatile KEY_Count;//按下时间计数
	uint8_t KEY_Flag;//按键标志 				  
}User_Key_t;

User_Key_t KEY0={0,0};
User_Key_t KEY1={0,0};
User_Key_t KEY2={0,0};
User_Key_t WKUP={0,0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	static uint8_t tim300_count;
	static uint8_t count_flag;
	if(htim == &htim7)   //确定是定时器6产生的中断
	{
		if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==RESET){
			KEY0.KEY_Count++;
		}
		else if(KEY0.KEY_Count){
			if(KEY0.KEY_Count>Press_Time){KEY0.KEY_Flag=Press;KEY0.KEY_Count=0;count_flag=0;tim300_count=0;return;}
			if(count_flag==0){KEY0.KEY_Count=0;count_flag=0X01;}
		}
		if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==RESET){
			KEY1.KEY_Count++;
		}else if(KEY1.KEY_Count){
			if(KEY1.KEY_Count>Press_Time){KEY1.KEY_Flag=Press;KEY1.KEY_Count=0;count_flag=0;tim300_count=0;return;}
			if(count_flag==0){KEY1.KEY_Count=0;count_flag=0X02;}
		} 
		if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==RESET){
			KEY2.KEY_Count++;
		}else if(KEY2.KEY_Count){
			if(KEY2.KEY_Count>Press_Time){KEY2.KEY_Flag=Press;KEY2.KEY_Count=0;count_flag=0;tim300_count=0;return;}
			if(count_flag==0){KEY2.KEY_Count=0;count_flag=0X04;}
		}
		if(HAL_GPIO_ReadPin(WKUP_GPIO_Port,WKUP_Pin)==SET){
			WKUP.KEY_Count++;
		}else if(WKUP.KEY_Count){
			if(WKUP.KEY_Count>Press_Time){WKUP.KEY_Flag=Press;WKUP.KEY_Count=0;count_flag=0;tim300_count=0;return;}
			if(count_flag==0){WKUP.KEY_Count=0;count_flag=0X08;}
		}
		if(count_flag){
			tim300_count++;
		}	
		if(tim300_count>=KEY_Response_Time){
			if(KEY0.KEY_Count>2){KEY0.KEY_Flag=Double_Click;KEY0.KEY_Count=0;tim300_count=0;count_flag=0;return;}//双击
			else if(KEY1.KEY_Count>2){KEY1.KEY_Flag=Double_Click;KEY1.KEY_Count=0;tim300_count=0;count_flag=0;return;}//双击			
			else if(KEY2.KEY_Count>2){KEY2.KEY_Flag=Double_Click;KEY2.KEY_Count=0;tim300_count=0;count_flag=0;return;}//双击
			else if(WKUP.KEY_Count>2){WKUP.KEY_Flag=Double_Click;WKUP.KEY_Count=0;tim300_count=0;count_flag=0;return;}//双击
			if(count_flag==0x01) {KEY0.KEY_Flag=Click;tim300_count=0;count_flag=0;return;}//单击
			else if(count_flag==0x02) {KEY1.KEY_Flag=Click;tim300_count=0;count_flag=0;return;}//单击	
			else if(count_flag==0x04){KEY2.KEY_Flag=Click;tim300_count=0;count_flag=0;return;}//单击	
			else if(count_flag==0x08){WKUP.KEY_Flag=Click;tim300_count=0;count_flag=0;return;}//单击							
			
		}
	}

}

主函数里调用

		switch(KEY0.KEY_Flag)
		{
			case Click:
				printf("%d\r\n",KEY0.KEY_Flag);
				LED.LED_On(LED1_GPIO_Port,LED1_Pin);
				LED.LED_Off(LED0_GPIO_Port,LED0_Pin);
				KEY0.KEY_Flag=0x00;
				break;
			case Double_Click:
				printf("%d\r\n",KEY0.KEY_Flag);				
				LED.LED_Off(LED1_GPIO_Port,LED1_Pin);
				LED.LED_On(LED0_GPIO_Port,LED0_Pin);
				KEY0.KEY_Flag=0x00;			
			break;
			case Press:
				printf("%d\r\n",KEY0.KEY_Flag);
				LED.LED_Off(LED1_GPIO_Port,LED1_Pin);
				LED.LED_Off(LED0_GPIO_Port,LED0_Pin);	
				KEY0.KEY_Flag=0x00;
			break;
		}
  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32是一种嵌入式微控制器,具有灵活的输入输出引脚。使用STM32可以方便地实现按键单击双击按功能。 实现按键单击功能的方法是,在程序中通过轮询检测按键引脚的电平状态。当检测到按键引脚的电平从高变低时,就可以认为发生了按键单击事件。在处理事件的代码中可以执行相应的操作,比如控制LED灯亮起或熄灭。 要实现按键双击功能,可以利用计时器和中断。当按键引脚由高电平变为低电平时,启动计时器,并设置一个适当的时间阈值。在计时器中断中断中,检查按键引脚的电平状态,如果在规定的时间内再次检测到低电平,就可以认为发生了双击事件。在处理双击事件的代码中,可以执行相应的操作,如切换LED灯的状态。 要实现按键按功能,也可以利用计时器和中断。当按键引脚由高电平变为低电平时,启动计时器,并设置一个较的时间阈值。在计时器中断中,检查按键引脚的电平状态,如果在规定的时间内仍然保持低电平,就可以认为发生了按事件。在处理按事件的代码中,可以执行相应的操作,如控制LED灯持续亮起或熄灭,或者是执行其他功能。 总结来说,通过对STM32的输入输出引脚进行轮询检测,并结合计时器和中断的使用,可以实现按键单击双击按功能。这种灵活和可编程性是STM32在嵌入式系统中广泛应用的原因之一。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值