一、头文件讲述:
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
这次的这些头文件中,还是和之前那两个实验一样的功能,就不过多讲述了,主要要说的地方就是找到按键引脚定义的地方。
首先我们打开Divers文件夹,打开里面的drv_gpio.c文件,可以看到很多引脚区域的定义,找到这部分代码:
__STM32_PIN(55, D, 7),
__STM32_PIN(56, D, 8),
__STM32_PIN(57, D, 9),
__STM32_PIN(58, D, 10),
这个代码是定义按键的四个引脚的,然后我们打开drv_gpio.h,然后可以看到定义的具体内容:
#define PIN_KEY2 GET_PIN(D, 8) // PD8 : KEY2 --> KEY
#define PIN_KEY1 GET_PIN(D, 9) // PD9 : KEY1 --> KEY
#define PIN_KEY0 GET_PIN(D, 10) // PD10: KEY0 --> KEY
#define PIN_WK_UP GET_PIN(C, 13) // PC13: WK_UP --> KEY
现在我们只需要在主函数中使用这些代码就行。
二、主函数
(1)主函数
首先来看看按键的一些电路原理:
在这张电路图中,由于WK_UP按键和其他三个按键的原理电路不一样,所以WK_UP按键是按下为高电平,不按为高电平,其他三个按键KEY0~2是按下为低电平,不按为高电平。
int main(void)
{
unsigned int count = 1;
/* 设置 RGB 红灯引脚的模式为输出模式 */
rt_pin_mode(PIN_LED_R, PIN_MODE_OUTPUT);
/* 设置 KEY0 引脚的模式为输入模式 */
rt_pin_mode(PIN_KEY0, PIN_MODE_INPUT);
while (count > 0)
{
/* 读取按键 KEY0 的引脚状态 */
if (rt_pin_read(PIN_KEY0) == PIN_LOW)
{
rt_thread_mdelay(50);
if (rt_pin_read(PIN_KEY0) == PIN_LOW)
{
/* 按键已被按下,输出 log,点亮 LED 灯 */
LOG_D("KEY0 pressed!");
rt_pin_write(PIN_LED_R, PIN_LOW);
}
}
else
{
/* 按键没被按下,熄灭 LED 灯 */
rt_pin_write(PIN_LED_R, PIN_HIGH);
}
rt_thread_mdelay(10);
count++;
}
return 0;
}
在这个代码中,首先先设置 KEY0 引脚为输入模式,R 灯引脚为输出模式,所以在 if 函数中首先先按键消抖判断是否按下,如果按下则 KEY0 引脚为低电平,则写 R 灯引脚电平为低电平,灯点亮,否则 R 灯引脚始终为高电平不点亮。
(2)拓展
现在我改一下例程代码,使得四个按键都有相应的功能,现在的功能是:
KEY0:R 灯亮;
KEY1:G 灯亮;
KEY2:B 灯亮;
WK_UP:R G B 三灯全亮。
但需要注意的是,WK_UP 引脚是按下为高,不按为低,和其他三个按键的原理不一样。
int main(void)
{
/* 设置 RGB 红灯引脚的模式为输出模式 */
rt_pin_mode(PIN_LED_R, PIN_MODE_OUTPUT);
rt_pin_mode(PIN_LED_G, PIN_MODE_OUTPUT);
rt_pin_mode(PIN_LED_B, PIN_MODE_OUTPUT);
/* 设置 KEY0 引脚的模式为输入模式 */
rt_pin_mode(PIN_KEY0, PIN_MODE_INPUT);
rt_pin_mode(PIN_KEY1, PIN_MODE_INPUT);
rt_pin_mode(PIN_KEY2, PIN_MODE_INPUT);
rt_pin_mode(PIN_WK_UP, PIN_MODE_INPUT);
while (1)
{
/* 读取按键 KEY0 的引脚状态 */
if (rt_pin_read(PIN_KEY0) == PIN_LOW)
{
rt_thread_mdelay(50);
while (rt_pin_read(PIN_KEY0) == PIN_LOW)
{
/* 按键已被按下,输出 log,点亮 LED 灯 */
LOG_D("KEY0 pressed!");
rt_pin_write(PIN_LED_R, PIN_LOW);
}
}
else
{
/* 按键没被按下,熄灭 LED 灯 */
rt_pin_write(PIN_LED_R, PIN_HIGH);
}
rt_thread_mdelay(10);
/* 读取按键 KEY1 的引脚状态 */
if (rt_pin_read(PIN_KEY1) == PIN_LOW)
{
rt_thread_mdelay(50);
while (rt_pin_read(PIN_KEY1) == PIN_LOW)
{
/* 按键已被按下,输出 log,点亮 LED 灯 */
LOG_D("KEY1 pressed!");
rt_pin_write(PIN_LED_G, PIN_LOW);
}
}
else
{
/* 按键没被按下,熄灭 LED 灯 */
rt_pin_write(PIN_LED_B, PIN_HIGH);
}
rt_thread_mdelay(10);
/* 读取按键 KEY2 的引脚状态 */
if (rt_pin_read(PIN_KEY2) == PIN_LOW)
{
rt_thread_mdelay(50);
while (rt_pin_read(PIN_KEY2) == PIN_LOW)
{
/* 按键已被按下,输出 log,点亮 LED 灯 */
LOG_D("KEY2 pressed!");
rt_pin_write(PIN_LED_B, PIN_LOW);
}
}
else
{
/* 按键没被按下,熄灭 LED 灯 */
rt_pin_write(PIN_LED_B, PIN_HIGH);
}
rt_thread_mdelay(10);
/* 读取按键 WK_UP 的引脚状态 */
if (rt_pin_read(PIN_WK_UP) == PIN_HIGH)
{
rt_thread_mdelay(50);
while (rt_pin_read(PIN_WK_UP) == PIN_HIGH)
{
/* 按键已被按下,输出 log,点亮 LED 灯 */
LOG_D("WK_UP pressed!");
rt_pin_write(PIN_LED_R, PIN_LOW);
rt_pin_write(PIN_LED_G, PIN_LOW);
rt_pin_write(PIN_LED_B, PIN_LOW);
}
}
else
{
/* 按键没被按下,熄灭 LED 灯 */
rt_pin_write(PIN_LED_R, PIN_HIGH);
rt_pin_write(PIN_LED_G, PIN_HIGH);
rt_pin_write(PIN_LED_B, PIN_HIGH);
}
rt_thread_mdelay(10);
}
return 0;
}