RT thread studio ---按键点灯(3)

本文档介绍了如何在RTThread Studio 2.1.0版本中通过按键控制LED灯的点亮与熄灭。首先,展示了基本的LED点灯操作,然后分别演示了使用轮询和中断两种方式实现按键控制LED灯。对于轮询方式,提供了自定义读取按键和使用软件包两种实现,而对于中断方式,展示了按键下降沿触发的中断服务函数。
摘要由CSDN通过智能技术生成

目录

1、前言

2、普通点灯

3、通过按键点灯

轮询:

中断:

4、输出结果


1、前言

本文目的:在RT Thread Studio中通过按键点灯

RT Thread Studio 版本:2.1.0 

原理图:


2、普通点灯

实现点灯功能,之前老版本的RT Thread studio中main函数就默认写的有点灯,不过现在新的版本中换成了输出"Hello World"。

这里需要用到RT-Thread文档设备中https://www.rt-thread.org/document/site/programming-manual/device/pin/pin/的PIN设备。

1、设置引脚输出模式为PIN_MODE_OUTPUT,其中需要定义输出引脚  #define   LED0_PIN    GET_PIN(A, 5) 或 (#define   LED0_PIN    5 )这里的 5 和GET_PIN(A, 5)是等价的,详细可以看drv_gpio.c函数;

2、控制引脚输出电平的高低。

#include <rtthread.h>
#include "board.h"
#include <rtdevice.h>

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

#define LED0_PIN    5                        //引脚标号


int main(void)
{
    int count = 1;

    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);  //输出模式


    while (count++)
    {
        rt_pin_write(LED0_PIN, count % 2);    //使能灯闪烁
        rt_thread_mdelay(500);
    }

    return RT_EOK;
}

3、通过按键点灯

添加按键有两种方式:1、采用按键中断的形式;2、采用轮询的方式。

轮询:

这里有两种方法:1、自己写的;2、调用RT Thread软件包

1、自己写的:在while(1)中读取按键电平的高低,进而判断按键是否按下,根据原理图可以得知,电平默认为1,因此读到为0就表示按下。先设置按键引脚为输入模式,再通过调用下列函数来实现:

#include <rtthread.h>
#include "board.h"
#include <rtdevice.h>

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

#define LED0_PIN    5
#define LED1_PIN    6
#define KEY1_PIN    GET_PIN(C, 13)              //按键引脚定义
#define KEY2_PIN    GET_PIN(C, 14)

int main(void)
{
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);     //输出模式
    rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);
    rt_pin_mode(KEY1_PIN, PIN_MODE_INPUT_PULLUP);
    rt_pin_mode(KEY2_PIN, PIN_MODE_INPUT_PULLUP);

    while (1)
    {
        if(rt_pin_read(KEY1_PIN) == PIN_LOW)
        {
            rt_thread_mdelay(1);                //消抖
            if(rt_pin_read(KEY1_PIN) == PIN_LOW)
            {
                rt_pin_write(LED1_PIN, PIN_HIGH);//点灯1
            }
        }

        if(rt_pin_read(KEY2_PIN) == PIN_LOW)
        {
            rt_thread_mdelay(1);                //消抖
            if(rt_pin_read(KEY2_PIN) == PIN_LOW)
            {
                rt_pin_write(LED1_PIN, PIN_LOW);//灭灯1
            }
        }
    }

    return RT_EOK;
}

 

2、调用的软件包

                             

添加成功之后,Ctrl+S保存一下,可以看见工程中多了packages一个文件夹,里面就是存放自己添加的软件包。

点开里面的button.c文件,发现这个软件包是基于按键中断写的,大部分功能都已经封装好了,会用就行了。

#include <rtthread.h>
#include "board.h"
#include <rtdevice.h>
#include "button.h"

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

#define LED0_PIN    5
#define LED1_PIN    6
#define KEY1_PIN    GET_PIN(C, 13)              //按键引脚定义
#define KEY2_PIN    GET_PIN(C, 14)

Button_t Button1;
Button_t Button2;

/*****按键检测接口****/
uint8_t Read_Button1_Level(void)
{
    return rt_pin_read(KEY1_PIN);
}

uint8_t Read_Button2_Level(void)
{
    return rt_pin_read(KEY2_PIN);
}

/*******按键回调函数*******/
void Btn1_Dowm_CallBack(void *btn)
{
    rt_pin_write(LED1_PIN, PIN_HIGH);   //点灯1
}

void Btn2_Dowm_CallBack(void *btn)
{
    rt_pin_write(LED1_PIN, PIN_LOW);   //灭灯1
}

int main(void)
{
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
    rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);     //LED输出模式

    Button_Create("Button1",                 //按键名字
                 &Button1,                   //按键句柄
                 Read_Button1_Level,         //按键电平检测函数接口
                 0);                         //触发电平

    Button_Create("Button2",                 //按键名字
                 &Button2,                   //按键句柄
                 Read_Button2_Level,         //按键电平检测函数接口
                 0);                         //触发电平

    Button_Attach(&Button1, BUTTON_DOWM, Btn1_Dowm_CallBack);        //按键单击
    Button_Attach(&Button2, BUTTON_DOWM, Btn2_Dowm_CallBack);        //按键单击

    while (1)
    {
        Button_Process();           //按键轮询函数
        rt_thread_mdelay(20);       //20ms-50ms
    }

    return RT_EOK;
}

中断:

采用中断的方式,以引脚下降沿为中断触发条件进入中断服务函数,需要用到以下两个函数:

                   

#include <rtthread.h>
#include "board.h"
#include <rtdevice.h>

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

#define LED0_PIN    5
#define LED1_PIN    6
#define KEY1_PIN    GET_PIN(C, 13)              //按键引脚定义
#define KEY2_PIN    GET_PIN(C, 14)

/******按键1中断*******/
void led_on(void *args)
{
    rt_pin_write(LED1_PIN, PIN_HIGH);   //点灯1
}

/******按键2中断*******/
void led_off(void *args)
{
    rt_pin_write(LED1_PIN, PIN_LOW);    //灭灯1
}

int main(void)
{
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);     //输出模式
    rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);

    rt_pin_mode(KEY1_PIN, PIN_MODE_INPUT_PULLUP);
    rt_pin_attach_irq(KEY1_PIN, PIN_IRQ_MODE_FALLING, led_on, RT_NULL);  //设置下降沿中断
    rt_pin_irq_enable(KEY1_PIN, PIN_IRQ_ENABLE);

    rt_pin_mode(KEY2_PIN, PIN_MODE_INPUT_PULLUP);
    rt_pin_attach_irq(KEY2_PIN, PIN_IRQ_MODE_FALLING, led_off, RT_NULL); //设置下降沿中断
    rt_pin_irq_enable(KEY2_PIN, PIN_IRQ_ENABLE);

    while (1)
    {
        rt_thread_mdelay(100);
    }

    return RT_EOK;
}

 


4、输出结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值