GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(KEY3_GPIO, &GPIO_InitStruct);
GPIO_InitStruct.Pin = KEY4_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(KEY4_GPIO, &GPIO_InitStruct);
}
volatile char is_key2_down = 0;
volatile char is_key3_down = 0;
volatile char is_key4_down = 0;
char isKey2Pressed(void){
return is_key2_down;
}
char isKey3Pressed(void){
return is_key3_down;
}
char isKey4Pressed(void){
return is_key4_down;
}
void resetKey2(void){
is_key2_down = 0;
}
void resetKey3(void){
is_key3_down = 0;
}
void resetKey4(void){
is_key4_down = 0;
}
#define DEBOUNCE_CNT 2
void scan_keys(void)
{
static char key2_status = KEY_UP, key2_down_cnt = 0, key2_up_cnt = 0;
static char key3_status = KEY_UP, key3_down_cnt = 0, key3_up_cnt = 0;
static char key4_status = KEY_UP, key4_down_cnt = 0, key4_up_cnt = 0;
char new_status;
//KEY2
new_status = HAL_GPIO_ReadPin(KEY2_GPIO, KEY2_GPIO_PIN);
if((key2_status == KEY_UP) && (new_status == KEY_DOWN)) {
key2_down_cnt++;
if(key2_down_cnt >= DEBOUNCE_CNT) {
is_key2_down = 1;
key2_status = KEY_DOWN;
}
} else {
key2_down_cnt = 0;
}
if((key2_status == KEY_DOWN) && (new_status == KEY_UP)) {
key2_up_cnt++;
if(key2_up_cnt >= DEBOUNCE_CNT) {
is_key2_down = 0;
key2_status = KEY_UP;;
}
} else {
key2_up_cnt = 0;
}
//KEY3
new_status = HAL_GPIO_ReadPin(KEY3_GPIO, KEY3_GPIO_PIN);
if((key3_status == KEY_UP) && (new_status == KEY_DOWN)) {
key3_down_cnt++;
if(key3_down_cnt >= DEBOUNCE_CNT) {
is_key3_down = 1;
key3_status = KEY_DOWN;
}
} else {
key3_down_cnt = 0;
}
if((key3_status == KEY_DOWN) && (new_status == KEY_UP)) {
key3_up_cnt++;
if(key3_up_cnt >= DEBOUNCE_CNT) {
is_key3_down = 0;
key3_status = KEY_UP;;
}
} else {
key3_up_cnt = 0;
}
//KEY4
new_status = HAL_GPIO_ReadPin(KEY4_GPIO, KEY4_GPIO_PIN);
if((key4_status == KEY_UP) && (new_status == KEY_DOWN)) {
key4_down_cnt++;
if(key4_down_cnt >= DEBOUNCE_CNT) {
is_key4_down = 1;
key4_status = KEY_DOWN;
}
} else {
key4_down_cnt = 0;
}
if((key4_status == KEY_DOWN) && (new_status == KEY_UP)) {
key4_up_cnt++;
if(key4_up_cnt >= DEBOUNCE_CNT) {
is_key4_down = 0;
key4_status = KEY_UP;;
}
} else {
key4_up_cnt = 0;
}
}
上述.c文件中,已经为我们初始化了相关引脚,并完成了配置工作。我们使用这个库主要是使用在库中的isKey\_Pressed()和resetKey\_()函数。
isKey\_Pressed()是在按键被按下后,对应的is\_key\_down标志位的值发生改变,因此我们读取该标志位的值即可。
resetKey\_()是将其对应的标志位的值重置,这常用在我们已经做完按键的反馈的事件之后进行,以便接受下一次的按键事件。因此,如果我们长时间没有处理按键的事件,标志位反应的仅仅是按过,而并非按下多少次。
### 具体使用:
![](https://img-blog.csdnimg.cn/79da760f360c4c3b81bc4cdfd775e325.png)
以上的含义是读取KEY2是否被按下,如果被按下则LED1亮。如果KEY3被按下,则LED1灭。
int main( void )
{
Init();
while( 1 )
{
if(isKey2Pressed())
{
GpioWrite(&Led1,0);
resetKey2();
}
if(isKey3Pressed())
{
GpioWrite(&Led1,1);
resetKey3();
}
}
}
### 按键进阶:
#### 双击:
双击的原理,即在短时间内完成两次点击,即可完成双击操作。因此,代码的核心将放在对本次按下与上一次松开之间的时间的判断。
#### 长按:
## 最后
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**
**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/d8ec856a82d83f05eec3038e5d16fab6.png)
![img](https://img-blog.csdnimg.cn/img_convert/15475a54858bb6827c1c8353cda15ced.jpeg)
![img](https://img-blog.csdnimg.cn/img_convert/4eaa0f452ba435f4b288ea8892ea24bf.png)
![img](https://img-blog.csdnimg.cn/img_convert/9fecf49006084f54d7b01e4a85afa988.png)
![img](https://img-blog.csdnimg.cn/img_convert/efe3d77ff941f81c4f53eac30aec42a5.png)
![img](https://img-blog.csdnimg.cn/img_convert/57ca7ded99f005ba098c4852cd228d35.png)
![](https://img-blog.csdnimg.cn/img_convert/c47e670644e56861db0a34e025dd3960.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!
阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!