实验现象:按下B1按键,LED1亮!按下B2按键,LED1灭!
按下B3按键,LED2亮!按下B4按键,LED2灭!
1.创建key.c和key.h文件,将其分别放入Src跟Inc文件中,与第一篇文章中代码封装的步骤一致。
2.编写key.c中代码
#include "key.h"
#include "main.h"
#include "led.h"
void key()
{
//按下B1键 led1灯亮
if(HAL\_GPIO\_ReadPin(GPIOB,GPIO_PIN_0)==RESET)//B1按下为低电平
{
HAL\_Delay(5);//防抖动
if(HAL\_GPIO\_ReadPin(GPIOB,GPIO_PIN_0)==RESET)//延迟消抖
{
//写功能
led(1,1);
}
// 等待按键松开,按键松开之前程序一直卡在while循环里,按键松开之后才能处理其他的程序。
while(HAL\_GPIO\_ReadPin(GPIOB,GPIO_PIN_0)==RESET);
}
//按下B2键,led1灯灭
if(HAL\_GPIO\_ReadPin(GPIOB,GPIO_PIN_1)==RESET)//B2按下为低电平
{
HAL\_Delay(5);
if(HAL\_GPIO\_ReadPin(GPIOB,GPIO_PIN_1)==RESET)
{
//写功能
led(1,0);
}
while(HAL\_GPIO\_ReadPin(GPIOB,GPIO_PIN_1)==RESET);
}
//按下B3键,led2灯亮
if(HAL\_GPIO\_ReadPin(GPIOB,GPIO_PIN_2)==RESET)//B3按下为低电平
{
HAL\_Delay(5);
if(HAL\_GPIO\_ReadPin(GPIOB,GPIO_PIN_2)==RESET)
{
//写功能
led(2,1);
}
while(HAL\_GPIO\_ReadPin(GPIOB,GPIO_PIN_2)==RESET);
}
//按下B4键,led2灯灭
if(HAL\_GPIO\_ReadPin(GPIOA,GPIO_PIN_0)==RESET)//B4按下为低电平
{
HAL\_Delay(5);
if(HAL\_GPIO\_ReadPin(GPIOA,GPIO_PIN_0)==RESET)
{
//写功能
led(2,0);
}
while(HAL\_GPIO\_ReadPin(GPIOA,GPIO_PIN_0)==RESET);
}
}
3.在key.h中
void key(void);
4.在main.c中
5.在main.c while(1)中调用函数功能
五、key函数的封装
#define KEY\_STATE GPIO\_PIN\_RESET
#define KEY\_UNSTATE GPIO\_PIN\_SET
#define KEY1\_GPIO GPIOB
#define KEY1\_PIN GPIO\_PIN\_1
#define KEY2\_GPIO GPIOA
#define KEY2\_PIN GPIO\_PIN\_7
#define KEY3\_GPIO GPIOA
#define KEY3\_PIN GPIO\_PIN\_5
#define KEY4\_GPIO GPIOA
#define KEY4\_PIN GPIO\_PIN\_3
int keynum()
{
int KeyNum=0;
if(HAL\_GPIO\_ReadPin(KEY1_GPIO,KEY1_PIN)==KEY_STATE)
{
HAL\_Delay(5);
if(HAL\_GPIO\_ReadPin(KEY1_GPIO,KEY1_PIN)==KEY_STATE)
{
KeyNum=1;
}
while(HAL\_GPIO\_ReadPin(KEY1_GPIO,KEY1_PIN)==KEY_STATE);
}
if(HAL\_GPIO\_ReadPin(KEY2_GPIO,KEY2_PIN)==KEY_STATE)
{
HAL\_Delay(5);
if(HAL\_GPIO\_ReadPin(KEY2_GPIO,KEY2_PIN)==KEY_STATE)
{
KeyNum=2;
}
while(HAL\_GPIO\_ReadPin(KEY2_GPIO,KEY2_PIN)==KEY_STATE);
}
if(HAL\_GPIO\_ReadPin(KEY3_GPIO,KEY3_PIN)==KEY_STATE)
{
HAL\_Delay(5);
if(HAL\_GPIO\_ReadPin(KEY3_GPIO,KEY3_PIN)==KEY_STATE)
{
KeyNum=3;
}
while(HAL\_GPIO\_ReadPin(KEY3_GPIO,KEY3_PIN)==KEY_STATE);
}
if(HAL\_GPIO\_ReadPin(KEY4_GPIO,KEY4_PIN)==KEY_STATE)
{
HAL\_Delay(5);
if(HAL\_GPIO\_ReadPin(KEY4_GPIO,KEY4_PIN)==KEY_STATE)
{
KeyNum=4;
}
while(HAL\_GPIO\_ReadPin(KEY4_GPIO,KEY4_PIN)==KEY_STATE);
}
return KeyNum;
}
注意事项:在函数调用的时候,一定要先写int key=keynum();再做判断!
实例:
总结
秋招即将开始,校招的朋友普遍是缺少项目经历的,所以底层逻辑,基础知识要掌握好!
而一般的社招,更是神仙打架。特别强调,项目经历不可忽视;几乎简历上提到的项目都会被刨根问底,所以项目应用的技术要熟练,底层原理必须清楚。
这里给大家提供一份汇集各大厂面试高频核心考点前端学习资料。涵盖 HTML,CSS,JavaScript,HTTP,TCP协议,浏览器,Vue框架,算法等高频考点238道(含答案)!
资料截图 :
高级前端工程师必备资料包