蓝桥杯长按键短按键双击按键

本文介绍了一个嵌入式系统中,通过HALGPIO库实现GPIO引脚的按键检测,支持单击、双击和长按三种模式。利用定时器中断机制,每10毫秒处理一次按键状态,通过CUBE软件配置定时器参数,确保功能的准确执行。
摘要由CSDN通过智能技术生成

#define key1  HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)
#define key2  HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)
#define key3  HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)
#define key4  HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)

 struct keys
{
	uint8_t key_judge; // 状态位
	_Bool  key_sta;
	uint8_t  single_flg; //统计次数
	_Bool  longle_flg;    //长按标志
	uint8_t key_time;    //按键状态
	_Bool double_flg;    //双击标志
	_Bool one_flag;        //单击标志
};
HAL_TIM_Base_Start_IT(&htim2);          //开启定时器中断,进入回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) //回调函数
{
	if(htim->Instance == TIM2)            //锁入TIM2
	{
	key[0].key_sta = key1;                 //接收状态   
	key[1].key_sta = key2;
	key[2].key_sta = key3;
	key[3].key_sta = key4;
	for(uint8_t i = 0;i < 4; i++)      //判断按键是哪一个按下
	{
	switch(key[i].key_judge)            
	{
		case 0:  if(key[i].key_sta == 0)   //按下 case 0 退出后经过TIM 10ms消抖由key_judge = 1;再次进入case 1:                                 
				{
			key[i].key_time = 0;
			key[i].key_judge = 1;
				}
			break;
		case 1: if(key[i].key_sta == 0)    //同样进入case3
			{	
				key[i].key_judge = 2;
			}
		else key[i].key_judge = 0;
			break;
		case 2: 
			if(key[i].key_sta == 1) 			//松手检测											  //松手检测
			{	
			if(key[i].key_time > 20 && key[i].key_time <= 70 )    //单击功能
		{
			key[i].one_flag = 1;
			key[i].key_judge = 0;
		}
			if(key[i].key_time <= 20 )													//双击功能
		{
			key[i].single_flg++;
			key[i].key_judge = 0;
			
			if(key[i].single_flg == 2 )														//长按键功能
			{	
			key[i].double_flg=1;
			key[i].key_judge = 0;
			key[i].single_flg =0;
			}
		}
		else 
		{
			key[i].longle_flg = 1;
			key[i].key_judge = 0;
		}
		}
		else 
		{
			key[i].key_time++;
			
		}
			break;
	}
	}
	}
}

1.按键三种模式同时实现,这个单击跟双击在一起是很矛盾的所以使用定时不同隔开,

2.由于开启定时器中断触发事件,每一次10ms进入函数,为什么是10ms由定时器重装载值和计数器决定。

3.重装载值和计数值在CUBE软件配置,此次实验开启中断2,配置重装载为10000,计数值为80,RCC那边配置的是80M,FC = 80M/80/10000 = 100;T = 倒数1/100 = 0.01s = 10ms

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在C语言中实现按键按、按和双击功能可以通过多线程的方式来实现。 首先,我们需要一个全局变量来记录按键的状态,比如键盘按下状态(pressed)和释放状态(released)。然后,我们可以使用一个线程来不断地监测键盘的状态,判断按键按、按和双击。 对于按功能,我们可以通过判断按键的按下时间是否超过设定的时间来实现。当按键按下时,我们记录下按下的时间,然后在监测线程中判断按键是否已经释放,如果按键释放时间大于设定的时间,则判定为按。 对于按功能,我们可以在按键按下时记录下按下的时间,在监测线程中判断按键是否已经释放,如果按键释放时间小于设定的时间,则判定为按。 对于双击功能,我们可以在监测线程中记录下按键的按下时间和释放时间,如果两次按键的时间间隔小于设定的时间,则判定为双击。 在实现按键功能时,需要注意多线程的同步问题,可以使用锁来确保多个线程对全局变量的操作不会冲突。 以上是一个简单的思路,具体的实现还需要根据具体的应用场景进行调整。同时,还需要考虑到编译器和硬件的差异,以及其他相关的因素,来确保按键功能能够在不同的环境中正常运行。 ### 回答2: 在C语言中,我们可以通过监听键盘的按键事件,来实现检测按键按、按和双击效果。 首先,我们需要定义一些变量来记录按键的状态和时间。我们可以使用一个布尔型变量来表示按键的状态,例如isPressed表示按键是否被按下,以及两个整型变量来记录按键按下和松开的时间。 对于检测按效果,我们可以在每次按键被按下时记录当前的系统时间,并通过不断监听键盘事件来检测按键是否持续按下。如果按键一直被按下,并且按键按下的时间超过一定的阈值(可以自行设定),就可以判断为按。 对于检测按效果,我们可以判断按键是否在很的时间内被按下并松开,例如在100毫秒内,即可判断为按。 对于检测双击效果,我们可以通过记录按键按下的次数来实现。每次按键按下时,我们可以检测两次按键的时间间隔是否在一定的范围内(比如200毫秒内),如果是,则可以判断为双击效果。 总之,通过监听键盘事件,并结合一些时间和状态的记录,我们可以在C语言中实现按键按、按和双击效果。 ### 回答3: C语言中,我们可以利用计时器和状态机来检测按键按、按和双击操作。 首先,我们需要定义一个变量作为计时器,用来记录按键被按下的时间。我们假设按下按键时,将这个变量初始化为0。 当按键被按下后,我们可以在主循环中进行延时操作,然后检测按键是否仍然被按下,如果仍然被按下,就将计时器加1。 接着,我们可以设置一个阈值,用来判断按键按下的时间是按还是按。如果计时器记录的时间小于阈值,就可以判定为按;如果计时器记录的时间大于等于阈值,就可以判定为按。 同时,我们还需要维护一个状态机来记录双击操作。当按键按时,状态机将记录这一次按操作,并等待一定的时间,如果这段时间内再次检测到按键按,就可以判定为双击操作。 综上所述,通过利用计时器和状态机,我们可以在C语言中实现按键按、按和双击功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

焊五弟:

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值