stm32-hal库-蓝桥杯嵌入式的准备

本文介绍了在时间紧迫的情况下,如何利用STM32的定时器和GPIO实现按键的短按和长按检测,包括定时器中断的配置、按键状态读取、消抖处理以及按键事件的判断逻辑。
摘要由CSDN通过智能技术生成

时间紧迫,先给大家代码  >@<

书接上回,经过上一篇文章的学习,你已经成功变成点灯大师,那么接下来,我们来看看按键如何去书写。现在已经是4月10号了,距离蓝桥杯开始就剩下两天了,所以我决定先把代码放在上面,注释写的详细一些,方便大家和我自己看,等到蓝桥杯结束之后,我在补充比较详细的说明,感觉时间紧迫,话不多说先上代码

按键的短按和长按:

配置成上拉电阻:

我习惯于先去定义一个这个,看各位的喜好吧

/*定义缩写*/
#define uint unsigned int
#define uchar unsigned char
	

初始化( 一定要记得开启定时器中断)

	/*初始化*/
    led_display(0x00);                  //先把led全部关掉 
	HAL_TIM_Base_Start_IT(&htim4);      //开启定时器4的中断 

按键的参数

struct keys
{
	
	uint key_state;//按件是高电平还是低电平
	uint key_judge;//按键的判断
	uint key_flag;//短按的标志位
	uint key_time;//长按的时间
	uint key_long_flag;//长按的标志位

};


struct keys key[4];//四个按键

再就是按键的写法了

补充:

考完蓝桥杯的第一天:我来补充补充:

思路:

1.在前面我们配置了一个0.01s的定时器,也就是说进入中断的时间很快,一直在进入,对吧。理解了这一点,我们就可以看成几乎是在一直执行定时器计数中断里面的事情,是吧。

2.那么我们在获取按键所对应的gpio的电平值,由于蓝桥杯它的引脚的初始状态时高电平,所以当按键按下来的时候,此时此刻它是低电平的。

3.当我们按下按下按键的时候,按键的状态置为低电平,会把key[i].key_judge置为1,再进行一次判断的目的是为了消抖。按住不懂之后,按键的时间就会加加,当你松开手的时候,去看看按键的时间是否大于1s,如果大于1s那么就是长按,如果小于1s那么就是短按。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
		if( htim->Instance == TIM4)
		{
			/*读取每个按键的高低电平,低电平是按键按下*/
			key[0].key_state = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
			key[1].key_state = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
			key[2].key_state = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
			key[3].key_state = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
			
			for( int i = 0; i < 4; i++)
			{
				switch(key[i].key_judge)
				{
					case 0:
					{
						if( key[i].key_state == 0)  /*按下按键*/
						{
							key[i].key_judge = 1;
						}
					}
					break;
					case 1:
					{
						if( key[i].key_state == 0) /*消抖*/
						{
							key[i].key_judge = 2;
						}
						else if( key[i].key_state == 1)
						{
							key[i].key_judge = 0;
						}
					}
					break;
					case 2:
					{
						if( key[i].key_state == 0) /*一直按着,也就是长按,按键时间积累*/
						{
							key[i].key_time++;
						}
						else if( key[i].key_state == 1)
						{
							if( key[i].key_time >= 100) /* 大于1s就是长按*/
							{
								key[i].key_long_flag = 1;
							}
							else if( key[i].key_time <= 100) /*小于就是短按*/
							{
								key[i].key_flag = 1;
							}
							
							key[i].key_time = 0;
							key[i].key_judge = 0;
						}
					}
					break;
				}
			}
			
			
		}

}

最后就是在主程序中验证一下

 while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

		if( key[0].key_flag == 1)        /*按键b1是可以用的*/
		{
		  t_led |= 0x01;
		  led_display(t_led);	
			
			key[0].key_flag = 0;
		}
		
  }

确实写的比较急,我过几天肯定会继续补充的

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值