0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在之前创建的Hello World项目中添加按键检测功能

RTThread物联网操作系统 来源:RTThread物联网操作系统 2020-06-03 14:46 次阅读

本期我们将讲解,如何在之前创建的Hello World项目中添加按键检测功能。

一、创建一个新的线程用于按键检测

1、使用动态线程创建方法创建一个线程

首先,定义一个动态线程句柄结构体指针:

1/*定义一个按键检测线程句柄结构体指针*/ 2staticrt_thread_tkey_thread=RT_NULL;

然后使用动态线程创建函数创建一个线程,其中线程优先级的范围根据系统配置情况不同, 可以在rtconfig.h中查看RT_THREAD_PRIORITY_MAX宏定义

1/*创建按键检测线程*/ 2key_thread=rt_thread_create("keythread",/*线程的名称*/ 3key_thread_entry,/*线程入口函数*/ 4RT_NULL,/*线程入口函数的参数*/ 5256,/*线程栈大小,单位是字节*/ 65,/*线程的优先级,数值越小优先级越高*/ 710);/*线程的时间片大小*/

线程创建成功后会返回该创建成功的线程句柄,如果线程创建失败,则返回RT_NULL,当线程创建成功后,我们启动该线程,让该线程进入就绪态

1/*如果获得线程控制块,启动这个线程*/ 2if(key_thread!=RT_NULL) 3rt_err=rt_thread_startup(key_thread); 4else 5rt_kprintf("keythreadcreatefailure!!! "); 6 7/*判断线程是否启动成功*/ 8if(rt_err==RT_EOK) 9rt_kprintf("keythreadstartupok. "); 10else 11rt_kprintf("keythreadstartuperr. ");

2、使用静态线程创建方法创建一个线程

静态线程创建需要提供线程栈和句柄:

1/*定义一个按键检测静态线程栈*/ 2staticcharkey_thread_stack[256]; 3/*定义一个按键检测静态线程句柄*/ 4staticstructrt_threadkey_thread;

然后使用静态线程初始化函数初始化静态线程对象

1/*初始化按键检测线程,名称是thread2,入口是thread2_entry*/ 2rt_err=rt_thread_init(&key_thread,/*线程句柄*/ 3"keythread",/*线程的名称*/ 4key_thread_entry,/*线程入口函数*/ 5RT_NULL,/*线程入口函数的参数*/ 6&key_thread_stack[0],/*线程栈起始地址*/ 7sizeof(key_thread_stack),/*线程栈大小,单位是字节*/ 85,/*线程的优先级,数值越小优先级越高*/ 910);/*线程的时间片大小*/

线程创建成功后返回值为RT_EOK,创建失败则返回-RT_ERROR,当线程创建成功后,我们启动该线程,让该线程进入就绪态

1/*如果线程创建成功,启动这个线程*/ 2if(rt_err==RT_EOK) 3rt_err=rt_thread_startup(&key_thread); 4else 5rt_kprintf("keythreadinitfailure!!! "); 6 7/*判断线程是否启动成功*/ 8if(rt_err==RT_EOK) 9rt_kprintf("keythreadstartupok. "); 10else 11rt_kprintf("keythreadstartuperr. ");

二、编写线程入口函数

首先,我们需要获取按键对应的引脚编号,使用GET_PIN宏定义,查看原理图,获取按键对应的引脚

1/*获取相应的引脚编号*/ 2#definePIN_WK_UPGET_PIN(C,13) 3#definePIN_KEY0GET_PIN(D,10) 4#definePIN_KEY1GET_PIN(D,9) 5#definePIN_KEY2GET_PIN(D,8)

接下来,我们编写一下按键检测线程入口函数,因为硬件上已经有上下拉了,所以就不配置内部上下拉了

1/*按键检测线程入口函数*/ 2staticvoidkey_thread_entry(void*parameter) 3{ 4staticrt_uint8_tkey_up=1;/*按键松开标志*/ 5/*初始化按键*/ 6rt_pin_mode(PIN_WK_UP,PIN_MODE_INPUT); 7rt_pin_mode(PIN_KEY0,PIN_MODE_INPUT); 8rt_pin_mode(PIN_KEY1,PIN_MODE_INPUT); 9rt_pin_mode(PIN_KEY2,PIN_MODE_INPUT); 10 11while(1) 12{ 13/*检测按键是否按下*/ 14if(key_up&&((rt_pin_read(PIN_WK_UP)==PIN_HIGH)|| 15(rt_pin_read(PIN_KEY0)==PIN_LOW)|| 16(rt_pin_read(PIN_KEY1)==PIN_LOW)|| 17(rt_pin_read(PIN_KEY2)==PIN_LOW))) 18{ 19rt_thread_mdelay(50);/*延时消抖*/ 20key_up=0; 21if(rt_pin_read(PIN_WK_UP)==PIN_HIGH) 22{ 23/*按键WK_UP按下,按键按下处理*/ 24rt_kprintf("WK_UPpressed! "); 25} 26elseif(rt_pin_read(PIN_KEY0)==PIN_LOW) 27{ 28/*按键KEY0按下,按键按下处理*/ 29rt_kprintf("KEY0pressed! "); 30} 31elseif(rt_pin_read(PIN_KEY1)==PIN_LOW) 32{ 33/*按键KEY0按下,按键按下处理*/ 34rt_kprintf("KEY1pressed! "); 35} 36elseif(rt_pin_read(PIN_KEY2)==PIN_LOW) 37{ 38/*按键KEY0按下,按键按下处理*/ 39rt_kprintf("KEY2pressed! "); 40} 41} 42elseif((rt_pin_read(PIN_WK_UP)==PIN_LOW)&& 43(rt_pin_read(PIN_KEY0)==PIN_HIGH)&& 44(rt_pin_read(PIN_KEY1)==PIN_HIGH)&& 45(rt_pin_read(PIN_KEY2)==PIN_HIGH)) 46{ 47key_up=1;/*按键已松开*/ 48} 49rt_thread_mdelay(100); 50} 51 52}

三、实现效果

构建并下载程序,查看串口终端输出:

可以看到,按键检测线程启动成功,按键功能也实现了

四、代码优化

上面我们的代码都写在了mian.c里,我们可以将其放在一个单独的app_key.c文件中右键选中【applications】,选择新建源文件

输入app_key.c文件名,点击确定:

将之前编写的代码都迁移到该文件中来,并提供一个app_key_init()函数供main()函数调用

1#include 2#include 3#include 4 5/*使用静态方法线程创建*/ 6#defineSTATIC_METHON 7 8#ifndefSTATIC_METHON 9/*定义一个按键检测线程句柄结构体指针*/ 10staticrt_thread_tkey_thread=RT_NULL; 11#else 12/*定义一个按键检测静态线程栈*/ 13staticcharkey_thread_stack[256]; 14/*定义一个按键检测静态线程句柄*/ 15staticstructrt_threadkey_thread; 16#endif 17 18/*获取相应的引脚编号*/ 19#definePIN_WK_UPGET_PIN(C,13) 20#definePIN_KEY0GET_PIN(D,10) 21#definePIN_KEY1GET_PIN(D,9) 22#definePIN_KEY2GET_PIN(D,8) 23 24/*按键检测线程入口函数*/ 25staticvoidkey_thread_entry(void*parameter) 26{ 27staticrt_uint8_tkey_up=1;/*按键松开标志*/ 28/*初始化按键*/ 29rt_pin_mode(PIN_WK_UP,PIN_MODE_INPUT); 30rt_pin_mode(PIN_KEY0,PIN_MODE_INPUT); 31rt_pin_mode(PIN_KEY1,PIN_MODE_INPUT); 32rt_pin_mode(PIN_KEY2,PIN_MODE_INPUT); 33 34while(1) 35{ 36/*检测按键是否按下*/ 37if(key_up&&((rt_pin_read(PIN_WK_UP)==PIN_HIGH)|| 38(rt_pin_read(PIN_KEY0)==PIN_LOW)|| 39(rt_pin_read(PIN_KEY1)==PIN_LOW)|| 40(rt_pin_read(PIN_KEY2)==PIN_LOW))) 41{ 42rt_thread_mdelay(50);/*延时消抖*/ 43key_up=0; 44if(rt_pin_read(PIN_WK_UP)==PIN_HIGH) 45{ 46/*按键WK_UP按下,按键按下处理*/ 47rt_kprintf("WK_UPpressed! "); 48} 49elseif(rt_pin_read(PIN_KEY0)==PIN_LOW) 50{ 51/*按键KEY0按下,按键按下处理*/ 52rt_kprintf("KEY0pressed! "); 53} 54elseif(rt_pin_read(PIN_KEY1)==PIN_LOW) 55{ 56/*按键KEY0按下,按键按下处理*/ 57rt_kprintf("KEY1pressed! "); 58} 59elseif(rt_pin_read(PIN_KEY2)==PIN_LOW) 60{ 61/*按键KEY0按下,按键按下处理*/ 62rt_kprintf("KEY2pressed! "); 63} 64} 65elseif((rt_pin_read(PIN_WK_UP)==PIN_LOW)&& 66(rt_pin_read(PIN_KEY0)==PIN_HIGH)&& 67(rt_pin_read(PIN_KEY1)==PIN_HIGH)&& 68(rt_pin_read(PIN_KEY2)==PIN_HIGH)) 69{ 70key_up=1;/*按键已松开*/ 71} 72rt_thread_mdelay(100); 73} 74 75} 76 77 78voidapp_key_init(void) 79{ 80rt_err_trt_err; 81#ifndefSTATIC_METHON 82/*创建按键检测线程*/ 83key_thread=rt_thread_create("keythread",/*线程的名称*/ 84key_thread_entry,/*线程入口函数*/ 85RT_NULL,/*线程入口函数的参数*/ 86256,/*线程栈大小,单位是字节*/ 875,/*线程的优先级,数值越小优先级越高*/ 8810);/*线程的时间片大小*/ 89/*如果获得线程控制块,启动这个线程*/ 90if(key_thread!=RT_NULL) 91rt_err=rt_thread_startup(key_thread); 92else 93rt_kprintf("keythreadcreatefailure!!! "); 94 95/*判断线程是否创建成功*/ 96if(rt_err==RT_EOK) 97rt_kprintf("keythreadstartupok. "); 98else 99rt_kprintf("keythreadstartuperr. "); 100#else 101/*初始化按键检测线程,名称是thread2,入口是thread2_entry*/ 102rt_err=rt_thread_init(&key_thread,/*线程句柄*/ 103"keythread",/*线程的名称*/ 104key_thread_entry,/*线程入口函数*/ 105RT_NULL,/*线程入口函数的参数*/ 106&key_thread_stack[0],/*线程栈起始地址*/ 107sizeof(key_thread_stack),/*线程栈大小,单位是字节*/ 1085,/*线程的优先级,数值越小优先级越高*/ 10910);/*线程的时间片大小*/ 110/*如果线程创建成功,启动这个线程*/ 111if(rt_err==RT_EOK) 112rt_err=rt_thread_startup(&key_thread); 113else 114rt_kprintf("keythreadinitfailure!!! "); 115 116/*判断线程是否启动成功*/ 117if(rt_err==RT_EOK) 118rt_kprintf("keythreadstartupok. "); 119else 120rt_kprintf("keythreadstartuperr. "); 121#endif 122}

在mian()函数中调用app_key_init()

实现效果一样:

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4299

    浏览量

    62374
  • 线程
    +关注

    关注

    0

    文章

    504

    浏览量

    19638

原文标题:【RT-Thread Studio入门】使用轮询法检测按键

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    AD原理图如何添加第二页

    新的项目(Project)。 在项目中创建一个新的原理图文件(Schematic File)。 3. 添加第二页原理图 步骤一:创建新的图纸
    的头像 发表于 09-02 15:33 1060次阅读

    何在i2c中将hello world发送到LCD屏幕?

    有谁知道如何在 i2c 中告诉这个以将 hello world 发送到 LCD 屏幕?当我查找我的 4BIT 引脚时,我可以很好地做到这一点,但是当使用 i2c 时,我似乎在任何地方都找不到协议的任何细节,每个人都只想谈论天哪的
    发表于 07-11 06:10

    请问如何将cURL库添加到ESP8266_RTOS_SDK项目中

    我想使用 curl api,但我不知道如何将库添加到我的项目中,这样当我将该库的头文件包含在我的项目中时它就不会抱怨。 有谁知道如何正确地将第三方库添加到ESP8266_RTOS_SD
    发表于 07-09 07:52

    何在PSOC创建项目中确认看门狗定时器已启用?

    您好,我是 PSOC BLE 部件的新手,只有一项任务,即确认看门狗定时器是否正确启用并按需要工作。我是 PSOC Creator 的新用户。如有任何帮助,将不胜感激。如何在 PSOC 创建项目中确认看门狗定时器已启用?
    发表于 07-02 07:10

    鸿蒙OpenHarmony【轻量系统 编写“Hello World”程序】 (基于Hi3861开发板)

    下方将通过修改源码的方式展示如何编写简单程序,输出“Hello world”。请在下载的源码目录中进行下述操作。
    的头像 发表于 05-16 18:15 930次阅读
    鸿蒙OpenHarmony【轻量系统 编写“<b class='flag-5'>Hello</b> <b class='flag-5'>World</b>”程序】 (基于Hi3861开发板)

    鸿蒙OpenHarmony【小型系统 编写“Hello World”程序】 (基于Hi3516开发板)

    展示如何在单板上运行第一个应用程序,其中包括新建应用程序、编译、烧写、运行等步骤,最终输出“Hello World!”。
    的头像 发表于 05-10 16:26 657次阅读
    鸿蒙OpenHarmony【小型系统 编写“<b class='flag-5'>Hello</b> <b class='flag-5'>World</b>”程序】 (基于Hi3516开发板)

    鸿蒙OpenHarmony【标准系统 编写“Hello World”程序】(基于RK3568开发板)

    下方将展示如何在单板上运行第一个应用程序,其中包括新建应用程序、编译、烧写、运行等步骤,最终输出“Hello World!”。
    的头像 发表于 05-09 17:58 826次阅读
    鸿蒙OpenHarmony【标准系统 编写“<b class='flag-5'>Hello</b> <b class='flag-5'>World</b>”程序】(基于RK3568开发板)

    鸿蒙OpenHarmony【标准系统编写“Hello World”程序】 (基于RK3568开发板)

    编写“Hello World”程序 下方将展示如何在单板上运行第一个应用程序,其中包括新建应用程序、编译、烧写、运行等步骤,最终输出“Hello W
    的头像 发表于 04-24 17:32 689次阅读
    鸿蒙OpenHarmony【标准系统编写“<b class='flag-5'>Hello</b> <b class='flag-5'>World</b>”程序】 (基于RK3568开发板)

    鸿蒙OpenHarmony【小型系统编写“Hello World”程序】 (基于Hi3516开发板)

    下方将展示如何在单板上运行第一个应用程序,其中包括新建应用程序、编译、烧写、运行等步骤,最终输出“Hello World!”。
    的头像 发表于 04-22 21:55 331次阅读
    鸿蒙OpenHarmony【小型系统编写“<b class='flag-5'>Hello</b> <b class='flag-5'>World</b>”程序】 (基于Hi3516开发板)

    鸿蒙OpenHarmony【轻量系统编写“Hello World”程序】 (基于Hi3861开发板)

    下方将通过修改源码的方式展示如何编写简单程序,输出“Hello world”。请在下载的源码目录中进行下述操作。
    的头像 发表于 04-21 21:44 278次阅读
    鸿蒙OpenHarmony【轻量系统编写“<b class='flag-5'>Hello</b> <b class='flag-5'>World</b>”程序】 (基于Hi3861开发板)

    用于EK-RA8D1 MIPI LCD显示器的GUIX Hello World

    电子发烧友网站提供《用于EK-RA8D1 MIPI LCD显示器的GUIX Hello World.pdf》资料免费下载
    发表于 02-20 09:48 0次下载
    用于EK-RA8D1 MIPI LCD显示器的GUIX <b class='flag-5'>Hello</b> <b class='flag-5'>World</b>

    如何将CMSIS DSP库添加到XMC4700 Relax Kit的Dave CE项目中

    我刚开始研究 Dave,这对我来说还是个新事物。 我创建了一个 Dave CE 项目,并能够启动并运行 blink 代码。 我想将 CMSIS DSP 库添加到我的项目中,并使用库中的
    发表于 02-01 07:11

    AWTK 串口屏开发(1) - Hello World

    数据类型功能说明温度整数温度。范围(0-100)摄氏度创建项目从模板创建项目,将hmi/template_app拷贝hmi/
    的头像 发表于 12-08 15:52 468次阅读
    AWTK 串口屏开发(1) - <b class='flag-5'>Hello</b> <b class='flag-5'>World</b>

    eclipse怎么运行java项目

    代码添加项目中。您可以通过右键单击项目名称,然后选择“New” > “Class”来创建一个新的Java类。在弹出的对话框中,输入类的名称和
    的头像 发表于 12-06 11:25 1934次阅读

    c语言hello world程序编写

    C语言是一种非常经典和常用的编程语言,而"Hello world"程序是每一个编程入门者的必修课。它是用来熟悉编程语言基本语法、环境配置,以及验证编程环境是否正常工作的第一个程序。本文将详细介绍C
    的头像 发表于 11-26 09:23 2228次阅读