概述
按键功能
说明:在哔哩哔哩跟随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库入门--按键功能所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复