前文回顾
《物联网系统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;
}
运行结果
其中包含了短按和长按。就是这么简单。
顺带改了一遍代码。给按键起个名字。调试起来也好看一些。
结果
就喜欢这种上上下下的感觉。
结束语
今天是大寒。下了一天的雪,写了两篇文章,下周要上七天班……为啥不这周上六天,下周上六天,平衡一下,还能早放一天假,哎,也不知道是咋想的。
可能早放一天,会影响社稷。