我是靠谱客的博主 大方曲奇,最近开发中收集的这篇文章主要介绍STM32 HAL库入门--按键功能,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

按键功能

说明:在哔哩哔哩跟随UP主铁头山羊学习,所有代码均来自铁头山羊B站课堂或者根据铁头山羊代码修改。

功能说明

1、点亮一颗LED,使用GPIOA PIN0/1/2,500ms亮500ms灭,一直循环。
2、gpio输出高电平点亮,gpio输出低电平熄灭。
3、实现按键功能,每按下按键,抬起时候换一颗LED闪烁。
4、gpio输入模式查询按键是否按下,使用GPIOA PIN3,外部上拉高电平,按下时候接地即低电平。

API编程接口

1、void HAL_Init() //初始化HAL库
2、void HAL_Delay(uint32_t Delay) //HAL库延迟函数,最小1ms
3、__HAL_RCC_GPIOA_CLK_ENABLE() //GPIOA时钟使能
4、void HAL_GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_Init)
//GPIO初始化,函数参数获取方法:鼠标放在函数名上,按F3
5、void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx,uint16_t
GPIO_PIN,GPIO_PinState PinState) //GPIO输出高低电平
6、void HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) //读取GPIO 状态,返回GPIO_PIN_SET或GPIO_PIN_RESET
7、void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) //将GPIO输出状态反转
8、HAL_GetTick(void) //获取当前系统定时时间

LED初始化函数


void LEDInit()
{
	GPIO_InitTypeDef gpioinit;
	gpioinit.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;
	gpioinit.Mode = GPIO_MODE_OUTPUT_PP ;
	gpioinit.Speed = GPIO_SPEED_FREQ_LOW;

	__HAL_RCC_GPIOA_CLK_ENABLE();

	HAL_GPIO_Init(GPIOA,&gpioinit);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2,GPIO_PIN_RESET);
}

按键初始化函数


void ButtonInit()
{
	GPIO_InitTypeDef gpioinit;
	gpioinit.Pin = GPIO_PIN_3;
	gpioinit.Mode = GPIO_MODE_INPUT;
	gpioinit.Pull = GPIO_NOPULL;

	__HAL_RCC_GPIOA_CLK_ENABLE();

	HAL_GPIO_Init(GPIOA,&gpioinit);
}

按键检测函数


/**功能:检测按键是否按下,通过判断按键前后的状态
 * 若前后状态不同,则按键发生动作
 * 按键抬起才有对应动作函数,即切换另一个灯闪烁,一共3颗灯,通过对3取余实现
 */
void ButtonDect()
{
	ButtonNewState = (HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3) == GPIO_PIN_RESET) ? 1 : 0;
	if (ButtonNewState != ButtonPreState)
	{
		//按下按键
		if(ButtonNewState == 1)
		{
			//按键按下处理
		}
		else
		{
			//按键抬起处理
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2,GPIO_PIN_RESET);
			idx = (idx + 1) % 3;
		}
	}

	ButtonPreState = ButtonNewState;
}

``

LED闪烁函数


void LEDDisplay()
{
	uint8_t temp;

	switch(idx)
	{
	case 0:
		temp = GPIO_PIN_0;
		break;
	case 1:
		temp = GPIO_PIN_1;
		break;
	case 2:
		temp = GPIO_PIN_2;
		break;
	default:
		break;
	}

//	HAL_GPIO_WritePin(GPIOA,temp,GPIO_PIN_SET);

	if(HAL_GetTick() % delay == 0)
	{
		HAL_GPIO_TogglePin(GPIOA,temp);
	}

}


完整代码

/**功能:按键控制哪个灯闪烁,每按一次按键更换一个灯。
 * 共3颗LED,分别用GPIOA_PIN0/1/2控制。
 * 按键用GPIOA_PIN3控制。
 * 周期1秒1次。
 * 日期:2022-07-17
 * 作者:哆啦dd
 */


#include "main.h"

void LEDInit();
void ButtonInit();
void ButtonDect();
void LEDDisplay();
uint8_t ButtonPreState = 0; //按键前状态,1--按下;0--松开
uint8_t ButtonNewState = 0; //按键当前状态,1--按下;0--松开
uint32_t idx = 0;           //计数亮LED的序号
uint32_t delay = 500;       //LED闪烁周期的一半

int main()
{
    //初始化
	HAL_Init();
	LEDInit();
	ButtonInit();

	while(1)
	{
		LEDDisplay();     //LED闪烁
		ButtonDect();     //检测按键是否按下
		HAL_Delay(1);
	}
}

void LEDInit()
{
	GPIO_InitTypeDef gpioinit;
	gpioinit.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;
	gpioinit.Mode = GPIO_MODE_OUTPUT_PP ;
	gpioinit.Speed = GPIO_SPEED_FREQ_LOW;

	__HAL_RCC_GPIOA_CLK_ENABLE();

	HAL_GPIO_Init(GPIOA,&gpioinit);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2,GPIO_PIN_RESET);
}

void ButtonInit()
{
	GPIO_InitTypeDef gpioinit;
	gpioinit.Pin = GPIO_PIN_3;
	gpioinit.Mode = GPIO_MODE_INPUT;
	gpioinit.Pull = GPIO_NOPULL;

	__HAL_RCC_GPIOA_CLK_ENABLE();

	HAL_GPIO_Init(GPIOA,&gpioinit);
}

/**功能:检测按键是否按下,通过判断按键前后的状态
 * 若前后状态不同,则按键发生动作
 * 按键抬起才有对应动作函数,即切换另一个灯闪烁,一共3颗灯,通过对3取余实现
 */
void ButtonDect()
{
	ButtonNewState = (HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3) == GPIO_PIN_RESET) ? 1 : 0;
	if (ButtonNewState != ButtonPreState)
	{
		//按下按键
		if(ButtonNewState == 1)
		{
			//按键按下处理
		}
		else
		{
			//按键抬起处理
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2,GPIO_PIN_RESET);
			idx = (idx + 1) % 3;
		}
	}

	ButtonPreState = ButtonNewState;
}

void LEDDisplay()
{
	uint8_t temp;

	switch(idx)
	{
	case 0:
		temp = GPIO_PIN_0;
		break;
	case 1:
		temp = GPIO_PIN_1;
		break;
	case 2:
		temp = GPIO_PIN_2;
		break;
	default:
		break;
	}

//	HAL_GPIO_WritePin(GPIOA,temp,GPIO_PIN_SET);

	if(HAL_GetTick() % delay == 0)
	{
		HAL_GPIO_TogglePin(GPIOA,temp);
	}

}

最后

以上就是大方曲奇为你收集整理的STM32 HAL库入门--按键功能的全部内容,希望文章能够帮你解决STM32 HAL库入门--按键功能所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部