物联网系统RT-Thread学习---软件包使用(按键)

前文回顾

《物联网系统RT-Thread学习—开发环境搭建》
《物联网系统RT-Thread学习—内核学习》
《物联网系统RT-Thread学习—设备和驱动学习》
《物联网系统RT-Thread学习—组件使用(一)》
《物联网系统RT-Thread学习—组件使用(二)》

本集预告

输出用过了IIC的显示屏,存储用了SPI的Flash,今天来学习一下输入,用了一款高大上五向的按键模块,TB售价高达2.4元,并且包邮。
在这里插入图片描述
就是一个这个。
在这里插入图片描述

硬件连接

首先来普及一下GPIO的输入输出的模式
输入模式

  • 输入浮空(GPIO_Mode_IN_FLOATING)
  • 输入上拉(GPIO_Mode_IPU)
  • 输入下拉(GPIO_Mode_IPD)
  • 模拟输入(GPIO_Mode_AIN)

输出模式

  • 开漏输出(GPIO_Mode_Out_OD)
  • 开漏复用功能(GPIO_Mode_AF_OD)
  • 推挽式输出(GPIO_Mode_Out_PP)
  • 推挽式复用功能(GPIO_Mode_AF_PP)

具体详情可以学习这个文章。《stm32设置内部上拉电阻_【STM32】STM32 GPIO模式理解》
简单来说,就是输入有高低,输出看强弱。自己体会。
在这里插入图片描述

接线

选出5个GPIO,为了方便直接就PA1~5,然后与模块的上下左右中间引脚相连,com公共端连接地,就完事了。
在这里插入图片描述

按键模块的其实就是一个公共端com,然后通过按键的按动,使其与某个引脚短接,例如,我按下up,up引脚便与com引脚短接。

就是我们将com公共端接入地,然后上下左右中间五个按钮的引脚分别接在PA1~5上,然后我们就需要配置上拉输入,由于内部上拉电阻的存在,我们在不输入的时候,引脚是高电平,按下按键的时候,IO与地相连,就相当于我们输入了低电平,这样,状态就是确定的了。
在这里插入图片描述

代码

这里就介绍一下软件包的使用,前面在配置显示屏的时候,已经介绍过一次了,大家可以再去复习一下
,驱动类的软件包是针对某块芯片,做了定制的开发,而这个按键类的驱动,则是将GPIO的操作,封装了一层,然后提供了更简单的接口,更稳定的功能。
本次采用的软件包是agile_button
在这里插入图片描述
倒要看看你有多灵活
在这里插入图片描述
选中软件包,并是能example,方便我们参考代码。
在这里插入图片描述
有些软件包带的example写的很清楚,就避免了再去看源码和头文件中的函数注释了,这样的软件包就很nice
在这里插入图片描述

下面是完整代码,参考子example.c

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <agile_button.h>
#include <stdlib.h>


#ifndef KEY_UP_PIN_NUM
#define KEY_UP_PIN_NUM	GET_PIN(A,  1)
#endif

#ifndef KEY_DWN_PIN_NUM
#define KEY_DWN_PIN_NUM	GET_PIN(A,  2)
#endif

#ifndef KEY_LFT_PIN_NUM
#define KEY_LFT_PIN_NUM	GET_PIN(A,  3)
#endif

#ifndef KEY_RHT_PIN_NUM
#define KEY_RHT_PIN_NUM	GET_PIN(A,  4)
#endif

#ifndef KEY_MID_PIN_NUM
#define KEY_MID_PIN_NUM	GET_PIN(A,  5)
#endif


static void btn_click_event_cb(agile_btn_t *btn)
{
    rt_kprintf("[button click event] pin:%d   repeat:%d, hold_time:%d\r\n", btn->pin, btn->repeat_cnt, btn->hold_time);
}

static void btn_hold_event_cb(agile_btn_t *btn)
{
    rt_kprintf("[button hold event] pin:%d   hold_time:%d\r\n", btn->pin, btn->hold_time);
}

#ifdef RT_USING_HEAP

static void dbtn_create(int pin, int active)
{
	agile_btn_t *_dbtn = RT_NULL;

	if (active == PIN_HIGH)
		_dbtn = agile_btn_create(pin, active, PIN_MODE_INPUT_PULLDOWN);
	else
		_dbtn = agile_btn_create(pin, active, PIN_MODE_INPUT_PULLUP);

	agile_btn_set_event_cb(_dbtn, BTN_CLICK_EVENT, btn_click_event_cb);
	agile_btn_set_event_cb(_dbtn, BTN_HOLD_EVENT, btn_hold_event_cb);
	agile_btn_start(_dbtn);
}



#endif /* RT_USING_HEAP */

int main(void)
{
	dbtn_create(KEY_UP_PIN_NUM,PIN_LOW);
	dbtn_create(KEY_DWN_PIN_NUM,PIN_LOW);
	dbtn_create(KEY_LFT_PIN_NUM,PIN_LOW);
	dbtn_create(KEY_RHT_PIN_NUM,PIN_LOW);
	dbtn_create(KEY_MID_PIN_NUM,PIN_LOW);
	return 0;
}

运行结果
在这里插入图片描述
其中包含了短按和长按。就是这么简单。
顺带改了一遍代码。给按键起个名字。调试起来也好看一些。
在这里插入图片描述
结果
在这里插入图片描述
就喜欢这种上上下下的感觉。
在这里插入图片描述

结束语

今天是大寒。下了一天的雪,写了两篇文章,下周要上七天班……为啥不这周上六天,下周上六天,平衡一下,还能早放一天假,哎,也不知道是咋想的。
可能早放一天,会影响社稷。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖哥王老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值