chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在之前創(chuàng)建的Hello World項(xiàng)目中添加按鍵檢測(cè)功能

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來(lái)源:RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 2020-06-03 14:46 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本期我們將講解,如何在之前創(chuàng)建的Hello World項(xiàng)目中添加按鍵檢測(cè)功能。

一、創(chuàng)建一個(gè)新的線程用于按鍵檢測(cè)

1、使用動(dòng)態(tài)線程創(chuàng)建方法創(chuàng)建一個(gè)線程

首先,定義一個(gè)動(dòng)態(tài)線程句柄結(jié)構(gòu)體指針:

1/*定義一個(gè)按鍵檢測(cè)線程句柄結(jié)構(gòu)體指針*/ 2staticrt_thread_tkey_thread=RT_NULL;

然后使用動(dòng)態(tài)線程創(chuàng)建函數(shù)創(chuàng)建一個(gè)線程,其中線程優(yōu)先級(jí)的范圍根據(jù)系統(tǒng)配置情況不同, 可以在rtconfig.h中查看RT_THREAD_PRIORITY_MAX宏定義

1/*創(chuàng)建按鍵檢測(cè)線程*/ 2key_thread=rt_thread_create("keythread",/*線程的名稱(chēng)*/ 3key_thread_entry,/*線程入口函數(shù)*/ 4RT_NULL,/*線程入口函數(shù)的參數(shù)*/ 5256,/*線程棧大小,單位是字節(jié)*/ 65,/*線程的優(yōu)先級(jí),數(shù)值越小優(yōu)先級(jí)越高*/ 710);/*線程的時(shí)間片大小*/

線程創(chuàng)建成功后會(huì)返回該創(chuàng)建成功的線程句柄,如果線程創(chuàng)建失敗,則返回RT_NULL,當(dāng)線程創(chuàng)建成功后,我們啟動(dòng)該線程,讓該線程進(jìn)入就緒態(tài)

1/*如果獲得線程控制塊,啟動(dòng)這個(gè)線程*/ 2if(key_thread!=RT_NULL) 3rt_err=rt_thread_startup(key_thread); 4else 5rt_kprintf("keythreadcreatefailure!!! "); 6 7/*判斷線程是否啟動(dòng)成功*/ 8if(rt_err==RT_EOK) 9rt_kprintf("keythreadstartupok. "); 10else 11rt_kprintf("keythreadstartuperr. ");

2、使用靜態(tài)線程創(chuàng)建方法創(chuàng)建一個(gè)線程

靜態(tài)線程創(chuàng)建需要提供線程棧和句柄:

1/*定義一個(gè)按鍵檢測(cè)靜態(tài)線程棧*/ 2staticcharkey_thread_stack[256]; 3/*定義一個(gè)按鍵檢測(cè)靜態(tài)線程句柄*/ 4staticstructrt_threadkey_thread;

然后使用靜態(tài)線程初始化函數(shù)初始化靜態(tài)線程對(duì)象

1/*初始化按鍵檢測(cè)線程,名稱(chēng)是thread2,入口是thread2_entry*/ 2rt_err=rt_thread_init(&key_thread,/*線程句柄*/ 3"keythread",/*線程的名稱(chēng)*/ 4key_thread_entry,/*線程入口函數(shù)*/ 5RT_NULL,/*線程入口函數(shù)的參數(shù)*/ 6&key_thread_stack[0],/*線程棧起始地址*/ 7sizeof(key_thread_stack),/*線程棧大小,單位是字節(jié)*/ 85,/*線程的優(yōu)先級(jí),數(shù)值越小優(yōu)先級(jí)越高*/ 910);/*線程的時(shí)間片大小*/

線程創(chuàng)建成功后返回值為RT_EOK,創(chuàng)建失敗則返回-RT_ERROR,當(dāng)線程創(chuàng)建成功后,我們啟動(dòng)該線程,讓該線程進(jìn)入就緒態(tài)

1/*如果線程創(chuàng)建成功,啟動(dòng)這個(gè)線程*/ 2if(rt_err==RT_EOK) 3rt_err=rt_thread_startup(&key_thread); 4else 5rt_kprintf("keythreadinitfailure!!! "); 6 7/*判斷線程是否啟動(dòng)成功*/ 8if(rt_err==RT_EOK) 9rt_kprintf("keythreadstartupok. "); 10else 11rt_kprintf("keythreadstartuperr. ");

二、編寫(xiě)線程入口函數(shù)

首先,我們需要獲取按鍵對(duì)應(yīng)的引腳編號(hào),使用GET_PIN宏定義,查看原理圖,獲取按鍵對(duì)應(yīng)的引腳

1/*獲取相應(yīng)的引腳編號(hào)*/ 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)

接下來(lái),我們編寫(xiě)一下按鍵檢測(cè)線程入口函數(shù),因?yàn)橛布弦呀?jīng)有上下拉了,所以就不配置內(nèi)部上下拉了

1/*按鍵檢測(cè)線程入口函數(shù)*/ 2staticvoidkey_thread_entry(void*parameter) 3{ 4staticrt_uint8_tkey_up=1;/*按鍵松開(kāi)標(biāo)志*/ 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/*檢測(cè)按鍵是否按下*/ 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);/*延時(shí)消抖*/ 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;/*按鍵已松開(kāi)*/ 48} 49rt_thread_mdelay(100); 50} 51 52}

三、實(shí)現(xiàn)效果

構(gòu)建并下載程序,查看串口終端輸出:

可以看到,按鍵檢測(cè)線程啟動(dòng)成功,按鍵功能也實(shí)現(xiàn)了

四、代碼優(yōu)化

上面我們的代碼都寫(xiě)在了mian.c里,我們可以將其放在一個(gè)單獨(dú)的app_key.c文件中右鍵選中【applications】,選擇新建源文件

輸入app_key.c文件名,點(diǎn)擊確定:

將之前編寫(xiě)的代碼都遷移到該文件中來(lái),并提供一個(gè)app_key_init()函數(shù)供main()函數(shù)調(diào)用

1#include 2#include 3#include 4 5/*使用靜態(tài)方法線程創(chuàng)建*/ 6#defineSTATIC_METHON 7 8#ifndefSTATIC_METHON 9/*定義一個(gè)按鍵檢測(cè)線程句柄結(jié)構(gòu)體指針*/ 10staticrt_thread_tkey_thread=RT_NULL; 11#else 12/*定義一個(gè)按鍵檢測(cè)靜態(tài)線程棧*/ 13staticcharkey_thread_stack[256]; 14/*定義一個(gè)按鍵檢測(cè)靜態(tài)線程句柄*/ 15staticstructrt_threadkey_thread; 16#endif 17 18/*獲取相應(yīng)的引腳編號(hào)*/ 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/*按鍵檢測(cè)線程入口函數(shù)*/ 25staticvoidkey_thread_entry(void*parameter) 26{ 27staticrt_uint8_tkey_up=1;/*按鍵松開(kāi)標(biāo)志*/ 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/*檢測(cè)按鍵是否按下*/ 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);/*延時(shí)消抖*/ 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;/*按鍵已松開(kāi)*/ 71} 72rt_thread_mdelay(100); 73} 74 75} 76 77 78voidapp_key_init(void) 79{ 80rt_err_trt_err; 81#ifndefSTATIC_METHON 82/*創(chuàng)建按鍵檢測(cè)線程*/ 83key_thread=rt_thread_create("keythread",/*線程的名稱(chēng)*/ 84key_thread_entry,/*線程入口函數(shù)*/ 85RT_NULL,/*線程入口函數(shù)的參數(shù)*/ 86256,/*線程棧大小,單位是字節(jié)*/ 875,/*線程的優(yōu)先級(jí),數(shù)值越小優(yōu)先級(jí)越高*/ 8810);/*線程的時(shí)間片大小*/ 89/*如果獲得線程控制塊,啟動(dòng)這個(gè)線程*/ 90if(key_thread!=RT_NULL) 91rt_err=rt_thread_startup(key_thread); 92else 93rt_kprintf("keythreadcreatefailure!!! "); 94 95/*判斷線程是否創(chuàng)建成功*/ 96if(rt_err==RT_EOK) 97rt_kprintf("keythreadstartupok. "); 98else 99rt_kprintf("keythreadstartuperr. "); 100#else 101/*初始化按鍵檢測(cè)線程,名稱(chēng)是thread2,入口是thread2_entry*/ 102rt_err=rt_thread_init(&key_thread,/*線程句柄*/ 103"keythread",/*線程的名稱(chēng)*/ 104key_thread_entry,/*線程入口函數(shù)*/ 105RT_NULL,/*線程入口函數(shù)的參數(shù)*/ 106&key_thread_stack[0],/*線程棧起始地址*/ 107sizeof(key_thread_stack),/*線程棧大小,單位是字節(jié)*/ 1085,/*線程的優(yōu)先級(jí),數(shù)值越小優(yōu)先級(jí)越高*/ 10910);/*線程的時(shí)間片大小*/ 110/*如果線程創(chuàng)建成功,啟動(dòng)這個(gè)線程*/ 111if(rt_err==RT_EOK) 112rt_err=rt_thread_startup(&key_thread); 113else 114rt_kprintf("keythreadinitfailure!!! "); 115 116/*判斷線程是否啟動(dòng)成功*/ 117if(rt_err==RT_EOK) 118rt_kprintf("keythreadstartupok. "); 119else 120rt_kprintf("keythreadstartuperr. "); 121#endif 122}

在mian()函數(shù)中調(diào)用app_key_init()

實(shí)現(xiàn)效果一樣:

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4400

    瀏覽量

    66368
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    508

    瀏覽量

    20654

原文標(biāo)題:【RT-Thread Studio入門(mén)】使用輪詢(xún)法檢測(cè)按鍵

文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    安裝RT thread studio后創(chuàng)建RT thread 項(xiàng)目報(bào)錯(cuò)怎么解決?

    安裝RT thread studio后創(chuàng)建RT thread 項(xiàng)目,報(bào)錯(cuò) hello工程是完全新建的項(xiàng)目 不論新建什么名稱(chēng)都會(huì)報(bào)錯(cuò)?。。。?! 難道系統(tǒng)知道我第一次安裝嘗試,給新手一點(diǎn)顏
    發(fā)表于 09-09 06:51

    如何移除意外添加項(xiàng)目中或不再需要的板級(jí)標(biāo)注

    在原理圖文檔中調(diào)用 Board Level Annotation Command 時(shí),項(xiàng)目目錄中會(huì)創(chuàng)建一個(gè)特殊文件,文件名包含項(xiàng)目名稱(chēng)及 .ANNOTATION 擴(kuò)展名。此文件一旦創(chuàng)建
    的頭像 發(fā)表于 08-25 11:11 ?724次閱讀

    【M-K1HSE開(kāi)發(fā)板免費(fèi)體驗(yàn)】M-K1HSE開(kāi)發(fā)板構(gòu)建HELLO WORLD頁(yè)面

    “Index.ets”文件,可以看到頁(yè)面由Text組件組成。添加按鈕 在默認(rèn)頁(yè)面基礎(chǔ)上,添加一個(gè)Button組件,作為按鈕響應(yīng)用戶(hù)點(diǎn)擊,“Index.ets”文件的按下面代碼修改: 6)3)運(yùn)行
    發(fā)表于 07-15 04:31

    【Milk-V Duo S 開(kāi)發(fā)板免費(fèi)體驗(yàn)】2 - 安裝編譯環(huán)境并測(cè)試Hello world!

    其中的gcc/riscv64-linux-musl-x86_64對(duì)我們才有用。 測(cè)試Hello world 程序編譯 以hello-world為例,進(jìn)入該例子目錄直接執(zhí)行 make 即可: cd
    發(fā)表于 07-07 21:18

    【潤(rùn)開(kāi)鴻HH-SCDAYU800A開(kāi)發(fā)板試用體驗(yàn)】Hello World

    \\\\\\\\toolchains Hello World 編寫(xiě)第一個(gè)應(yīng)用程序 :最簡(jiǎn)單的Hello World 文件->新建項(xiàng)目,
    發(fā)表于 07-01 00:52

    第六章 GPIO輸入——按鍵檢測(cè)

    本篇文章講述了如何在W55MH32上實(shí)現(xiàn)按鍵輸入檢測(cè),以及按鍵輸入檢測(cè)的注意事項(xiàng)、實(shí)現(xiàn)方式和代碼講解等。掌握了
    的頭像 發(fā)表于 05-22 16:41 ?607次閱讀
    第六章 GPIO輸入——<b class='flag-5'>按鍵</b><b class='flag-5'>檢測(cè)</b>

    DevEco Studio 寫(xiě)一個(gè)簡(jiǎn)單的頁(yè)面

    如下: // Index.ets@Entry@Componentstruct Index { @State message: string = 'Hello World'; build() {Row
    發(fā)表于 04-24 07:36

    如何將ENWF9408AVEF Wi-Fi模塊添加到1064EVK wifi_cli SDK項(xiàng)目中?

    如何將 松下 ENWF9408AVEF (NXP 88W8977) Wi-Fi 模塊添加到 1064EVK wifi_cli SDK 項(xiàng)目中? 使用不同的 88W8977 定義初始化失敗
    發(fā)表于 04-02 07:50

    使用ConfigTools for USB創(chuàng)建項(xiàng)目時(shí)遇到的問(wèn)題求解

    使用 ConfigTools for USB 創(chuàng)建項(xiàng)目時(shí),存在缺少資源的問(wèn)題,無(wú)法添加它: 該問(wèn)題從 SDK 24.12.00 開(kāi)始出現(xiàn)。適用于 macOS 的 MCUXpresso。經(jīng)過(guò) LPC55s69、MCX A153
    發(fā)表于 03-26 08:06

    在mimxrt1170_evk調(diào)試hello_world出現(xiàn)硬件傳輸錯(cuò)誤怎么解決?

    我按照視頻在 cm7 中調(diào)試hello_world示例,我的鏈接服務(wù)器正在運(yùn)行, debug prove 的 FW 也是最新的。 但是我仍然收到這個(gè)錯(cuò)誤。 16:status-poll 中的目標(biāo)
    發(fā)表于 03-25 07:31

    加載示例圖像時(shí),COM7的調(diào)試控制臺(tái)hello_world不顯示消息怎么解決?

    板是 mimxrt1180_evk。 我無(wú)法從板中找到 JP5。 使用示例映像進(jìn)行測(cè)試時(shí),調(diào)試控制臺(tái)(通過(guò) Windows11 電腦中的 J53、COM7 連接hello_world不顯示任何消息。 但是 gdb 在源文件中顯示了我的簡(jiǎn)單代碼更改。 請(qǐng)盡快發(fā)現(xiàn),謝謝!
    發(fā)表于 03-25 07:01

    何在SonarWiz中導(dǎo)入和處理海底數(shù)據(jù)

    和 EGN 調(diào)整和修整數(shù)據(jù) 創(chuàng)建勘測(cè)馬賽克地圖 指南 1. 單擊 “新建項(xiàng)目 ”圖標(biāo),打開(kāi) “創(chuàng)建項(xiàng)目 ”對(duì)話(huà)框 2. 輸入項(xiàng)目名稱(chēng)和
    的頭像 發(fā)表于 02-18 14:16 ?925次閱讀
    如<b class='flag-5'>何在</b>SonarWiz中導(dǎo)入和處理海底數(shù)據(jù)

    遠(yuǎn)心鏡頭應(yīng)用手機(jī)按鍵檢測(cè)

    遠(yuǎn)心鏡頭的手機(jī)按鍵檢測(cè)方案具有高效、準(zhǔn)確、穩(wěn)定等優(yōu)點(diǎn)。該方案能夠?qū)崿F(xiàn)對(duì)手機(jī)按鍵的全方位檢測(cè),包括按鍵的位置、高度、間隙以及彈力等參數(shù)。同時(shí),
    的頭像 發(fā)表于 01-20 10:18 ?614次閱讀
    遠(yuǎn)心鏡頭應(yīng)用手機(jī)<b class='flag-5'>按鍵</b><b class='flag-5'>檢測(cè)</b>

    使用MCUXpresso for VS Code插件開(kāi)發(fā)Zephyr的hello world

    本期來(lái)到Zephyr實(shí)戰(zhàn)經(jīng)驗(yàn)演練,小編帶著大家一起使用MCUXpresso for VS Code插件來(lái)開(kāi)發(fā)一個(gè)屬于Zephyr的hello world。
    的頭像 發(fā)表于 01-03 09:21 ?1628次閱讀
    使用MCUXpresso for VS Code插件開(kāi)發(fā)Zephyr的<b class='flag-5'>hello</b> <b class='flag-5'>world</b>

    米爾-紫光PG2L100H國(guó)產(chǎn)FPGA開(kāi)發(fā)板試用】按鍵功能測(cè)試報(bào)告

    、改進(jìn)建議 硬件方面 可增加按鍵數(shù)量 優(yōu)化按鍵布局 添加按鍵指示燈 考慮防塵設(shè)計(jì) 軟件方面 增加更多交互效果 提供狀態(tài)顯示功能 完善調(diào)試信息 添加按
    發(fā)表于 12-06 11:04