按键处理方式
按键状态读取的两种方式
查寻方式:适用于简单的裸机程序,或中断资源有限的场合中断方式:
中断方式;适用于对实时性要求高和多任务分时处理的场合
由于单片机端口要读取按键电路的高低电平,所以端口模式需要设置成输出模式GPIO_input
分析电路:当按键被按下是gpio端口电平状态变成低电平
所以要设置成上拉状态
tips:cubemx常用快捷键
Ctrl+/ Ctrl+7(Toggle Comment) | 注释行/取消注释行 |
Ctrl+D | 删除行 |
Ctrl+Shift+F | 格式化代码 |
Alt+/ | 代码补全 |
#ifndef KEY_KEY_H_
#define KEY_KEY_H_
#include "stm32f4xx_hal.h" //HAL库文件声明
#include "main.h" //IO定义与初始化函数在main.c文件中,必须引用
uint8_t KEY_1(void);//按键1
uint8_t KEY_2(void);//按键2
uint8_t KEY_3(void);//按键3
uint8_t KEY_4(void);//按键4
#endif /* KEY_KEY_H_ */
#include "key.h"
uint8_t KEY_1(void)
{
uint8_t a;
a=0;//如果未进入按键处理,则返回0
if(HAL_GPIO_ReadPin(GPIOF,KEY1_Pin)==GPIO_PIN_RESET){//读按键接口的电平
HAL_Delay(20);//延时去抖动
if(HAL_GPIO_ReadPin(GPIOF,KEY1_Pin)==GPIO_PIN_RESET){ //读按键接口的电平
a=1;//进入按键处理,返回1
}
}
while(HAL_GPIO_ReadPin(GPIOF,KEY1_Pin)==GPIO_PIN_RESET); //等待按键松开
return a;
}
uint8_t KEY_2(void)
{
uint8_t a;
a=0;//如果未进入按键处理,则返回0
if(HAL_GPIO_ReadPin(GPIOF,KEY2_Pin)==GPIO_PIN_RESET){//读按键接口的电平
HAL_Delay(20);//延时去抖动
if(HAL_GPIO_ReadPin(GPIOF,KEY2_Pin)==GPIO_PIN_RESET){ //读按键接口的电平
a=1;//进入按键处理,返回1
}
}
while(HAL_GPIO_ReadPin(GPIOF,KEY2_Pin)==GPIO_PIN_RESET); //等待按键松开
return a;
}
uint8_t KEY_3(void)
{
uint8_t a;
a=0;//如果未进入按键处理,则返回0
if(HAL_GPIO_ReadPin(GPIOF,KEY3_Pin)==GPIO_PIN_RESET){//读按键接口的电平
HAL_Delay(20);//延时去抖动
if(HAL_GPIO_ReadPin(GPIOF,KEY3_Pin)==GPIO_PIN_RESET){ //读按键接口的电平
a=1;//进入按键处理,返回1
}
}
while(HAL_GPIO_ReadPin(GPIOF,KEY3_Pin)==GPIO_PIN_RESET); //等待按键松开
return a;
}
uint8_t KEY_4(void)
{
uint8_t a;
a=0;//如果未进入按键处理,则返回0
if(HAL_GPIO_ReadPin(GPIOF,KEY4_Pin)==GPIO_PIN_RESET){//读按键接口的电平
HAL_Delay(20);//延时去抖动
if(HAL_GPIO_ReadPin(GPIOF,KEY4_Pin)==GPIO_PIN_RESET){ //读按键接口的电平
a=1;//进入按键处理,返回1
}
}
while(HAL_GPIO_ReadPin(GPIOF,KEY4_Pin)==GPIO_PIN_RESET); //等待按键松开
return a;
}
while (1)
{
if(KEY_1()){
LED_1(1) ;
LED_2(1);
}
if(KEY_2()){
LED_1(0) ;
LED_2(0);
}
tips:if語句的使用
if语句的基本结构
语法:
if (表达式)
{
// 表达式为真时执行的语句。
}
else
{
// 表达式为假时执行的语句。
}
注意:
- if (表达式)之间的空格可以不写。
- 表达式必须使用括号。
- 表达式可以是具体的值。
- 表达式一般是关系运算和逻辑运算表达式,也可以是赋值运算或其它的表达式。
- 不要把if(变量名==值)写成if(变量名=值)。
- 整个if语句可以没有else分支。
- if或else分支花括号内的代码如果只有一行,花括号可以不写;如果一行也没有,花括号一定要写;如果有多行,花括号一定要写,如果不写,除了第一行,其它的代码将不是if语句的一部分。
- if (表达式)和else后不能加分号,因为分号表示空语句。(C++用分号作为一条语句结束的标志。如果在C++程序中不小心多写了一个分号,那么该分号会被当成一条空语句。)
嵌套使用if语句
if语句可以嵌套使用,实现多级(层)的条件判断(最多127层)。
语法:
if (表达式一)
{
if (表达式二)
{
// 表达式二为真时执行的语句。
}
else
{
// 表达式二为假时执行的语句。
}
}
else
{
// 表达式一为假时执行的语句。
}
多条件的if语句
语法:
if (表达式一)
{
// 表达式一为真时执行的语句。
}
else if (表达式二)
{
// 表达式二为真时执行的语句。
}
else if (表达式三)
{
// 表达式三为真时执行的语句。
}
……
else if (表达式n)
{
// 表达式n为真时执行的语句。
}
else
{
// 全部表达式都不为真时执行的语句。
}
注意:
- 多条件的if语句本质上是嵌套的if语句。
- 最多只能有127个条件分支。
- 最后一个else可以没有。