物联网Lora模块从入门到精通(三)按键的读取与使用_is_key2_down

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)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值