按键部分的原理图
从上图可以看出,开发板上共配备了4个按键,分别连接在PB0,PB1,PB2,PA0引脚上,引脚通过10K的电阻连接在电源正极VDD,按键的另一端连接在电源负极GND,分析可知,在没有按键按下时,对应的GPIO为高电平,有按键按下时,对应的GPIO为低电平。
按键的使用步骤
① 将 PB0,PB1,PB2,PA0 初始化为输入模式
void Key_Init() //按键初始化
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE(); //打开GPIO A的时钟
__HAL_RCC_GPIOB_CLK_ENABLE(); //打开GPIO B的时钟
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //将PA0设为输入模式
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); //将PB0 PB1 PB2设为输入模式
}
② 按键扫描函数
uint8_t Key_Scan(void) //按键扫描函数
{
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0) //PB0 (按键B1)被按下
{
HAL_Delay(10);//延时消抖
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0)
{
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0); //等待按键抬起
return 1;//返回1
}
}
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0) //PB1 (按键B2)被按下
{
HAL_Delay(10);//延时消抖
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0)
{
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0); //等待按键抬起
return 2;//返回2
}
}
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0) //PB2 (按键B3)被按下
{
HAL_Delay(10);//延时消抖
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0)
{
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0); //等待按键抬起
return 3; //返回3
}
}
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 0) //PA0 (按键B4)被按下
{
HAL_Delay(10);//延时消抖
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 0)
{
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 0); //等待按键抬起
return 4; //返回4
}
}
return 0; //没有按键按下返回0
}
③ 在main.c中使用按键
④ 读取并使用按键
int Key_Value = 0;
Key_Value = Key_Scan();
if(Key_Value == 1) //按键B1被按下
{
}
if(Key_Value == 2) //按键B2被按下
{
}
if(Key_Value == 3) //按键B3被按下
{
}
if(Key_Value == 4) //按键B4被按下
{
}
总结
KEY 按键 使用步骤总结如下:
- 按键引脚PB0,PB1,PB2,PA0初始化为输出模式
- 复制文章中Key_Scan()代码到main.c中
- 在主函数中读取并使用KEY按键。
按键部分的原理图
从上图可以看出,开发板上共配备了4个按键,分别连接在PB0,PB1,PB2,PA0引脚上,引脚通过10K的电阻连接在电源正极VDD,按键的另一端连接在电源负极GND,分析可知,在没有按键按下时,对应的GPIO为高电平,有按键按下时,对应的GPIO为低电平。
按键的使用步骤
① 将 PB0,PB1,PB2,PA0 初始化为输入模式
void Key_Init() //按键初始化
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE(); //打开GPIO A的时钟
__HAL_RCC_GPIOB_CLK_ENABLE(); //打开GPIO B的时钟
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //将PA0设为输入模式
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); //将PB0 PB1 PB2设为输入模式
}
② 按键扫描函数
uint8_t Key_Scan(void) //按键扫描函数
{
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0) //PB0 (按键B1)被按下
{
HAL_Delay(10);//延时消抖
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0)
{
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0); //等待按键抬起
return 1;//返回1
}
}
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0) //PB1 (按键B2)被按下
{
HAL_Delay(10);//延时消抖
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0)
{
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0); //等待按键抬起
return 2;//返回2
}
}
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0) //PB2 (按键B3)被按下
{
HAL_Delay(10);//延时消抖
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0)
{
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0); //等待按键抬起
return 3; //返回3
}
}
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 0) //PA0 (按键B4)被按下
{
HAL_Delay(10);//延时消抖
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 0)
{
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 0); //等待按键抬起
return 4; //返回4
}
}
return 0; //没有按键按下返回0
}
③ 在main.c中使用按键
④ 读取并使用按键
int Key_Value = 0;
Key_Value = Key_Scan();
if(Key_Value == 1) //按键B1被按下
{
}
if(Key_Value == 2) //按键B2被按下
{
}
if(Key_Value == 3) //按键B3被按下
{
}
if(Key_Value == 4) //按键B4被按下
{
}
总结
KEY 按键 使用步骤总结如下:
- 按键引脚PB0,PB1,PB2,PA0初始化为输出模式
- 复制文章中Key_Scan()代码到main.c中
- 在主函数中读取并使用KEY按键。
举报