STM32L475潘多拉开发板RT Thread实验3_按键输入例程

一、头文件讲述:

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值