蓝桥杯省赛模块准备-KEY(G431)

系列文章目录

LED

串口

LCD


文章目录

目录

系列文章目录

文章目录

前言

一、工程创建

二、使用步骤

1.按键扫描函数

2.按键的应用以及长按逻辑的实现

3.现象


前言

本文按键检测采用逻辑消抖法,后面有时间会更新状态机写法

一、工程创建

基础配置本文就不再次赘述,基础配置可以查看LED模块文章

查阅产品手册,按键用到的IO口为PB0、PB1、PB2、PA0,分别对应KEY1、KEY2、KEY3、KEY4,又注意到原理图上带有上拉电阻,所以在配置IO口输入模式时,既可以配置内部上拉也可以不进行配置

生成工程

二、代码编写

打开keil后,依旧是需要先修改debug等相关配置

1.按键扫描函数

此函数消抖主要靠三行逻辑判断,核心是通过轮询检测按键状态,再通过逻辑运算使得只有在按下和抬起时标志位的变成相应的值,其余时候为0

uint8_t key_temp,key_down,key_up,key_old;

void key_scan(void)
{
	//对应按键按下,key_temp赋相应的值
	if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == GPIO_PIN_RESET)
	{
		key_temp = 1;
	}
	else if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET)
	{
		key_temp = 2;
	}
	else if(HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin) == GPIO_PIN_RESET)
	{
		key_temp = 3;
	}
	else if(HAL_GPIO_ReadPin(KEY4_GPIO_Port,KEY4_Pin) == GPIO_PIN_RESET)
	{
		key_temp = 4;
	}
	else
	{
		key_temp = 0;
	}
	
	//三行逻辑消抖
	key_down = key_temp & (key_temp ^ key_old);
	key_up = ~key_temp & (key_temp ^ key_old);
	key_old = key_temp;
}

2.按键的应用以及长按逻辑的实现

HAL_GetTick()这个函数可以获取系统当前的运行时间,其单位是ms,sysTick是系统滴答定时器,HAL库在初始化时,通过相应配置使得你用CubeMX生成工程时,sysTick的中断周期都是1ms,所以这个时间是ms为单位

长按的逻辑就是在按下时获取一次系统运行时间,在抬起时再获取一次,两次时间相减则为按键按下的时长,再执行相应逻辑,此工程仅用KEY1作为演示

uint32_t key_press_time[2] = {0,0};

void key_text(void)
{
	key_scan();
	//长按逻辑实现
	//按键1按下
	if(key_down == 1)
	{
		key_press_time[0] = HAL_GetTick();
	}
	switch(key_up)
	{
		case 1:
			key_press_time[1] = HAL_GetTick();
			//长按1s以上,LED1熄灭
		    if(key_press_time[1] - key_press_time[0] > 1000)
			{
				LED_Display(LED1_Pin,1);
			}
			//短按LED1点亮
			else
			{
				LED_Display(LED1_Pin,0);
			}
			break;
	}
}

3.现象

KEY

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值