色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    4344

    瀏覽量

    62862
  • 線程
    +關注

    關注

    0

    文章

    505

    瀏覽量

    19720

原文標題:【RT-Thread Studio入門】使用輪詢法檢測按鍵

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    使用MCUXpresso for VS Code插件開發Zephyr的hello world

    本期來到Zephyr實戰經驗演練,小編帶著大家一起使用MCUXpresso for VS Code插件來開發一個屬于Zephyr的hello world
    的頭像 發表于 01-03 09:21 ?577次閱讀
    使用MCUXpresso for VS Code插件開發Zephyr的<b class='flag-5'>hello</b> <b class='flag-5'>world</b>

    米爾-紫光PG2L100H國產FPGA開發板試用】按鍵功能測試報告

    、改進建議 硬件方面 可增加按鍵數量 優化按鍵布局 添加按鍵指示燈 考慮防塵設計 軟件方面 增加更多交互效果 提供狀態顯示功能 完善調試信息 添加按
    發表于 12-06 11:04

    AD原理圖如何添加第二頁

    新的項目(Project)。 在項目中創建一個新的原理圖文件(Schematic File)。 3. 添加第二頁原理圖 步驟一:創建新的圖紙
    的頭像 發表于 09-02 15:33 ?2077次閱讀

    何在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

    請問vscoed的esp32工程如何添加新文件?

    創建了一個hello world模板,但我自己寫的.c和.h該怎么添加進來呢?
    發表于 06-21 12:54

    鴻蒙OpenHarmony【輕量系統 編寫“Hello World”程序】 (基于Hi3861開發板)

    下方將通過修改源碼的方式展示如何編寫簡單程序,輸出“Hello world”。請在下載的源碼目錄中進行下述操作。
    的頭像 發表于 05-16 18:15 ?1022次閱讀
    鴻蒙OpenHarmony【輕量系統 編寫“<b class='flag-5'>Hello</b> <b class='flag-5'>World</b>”程序】 (基于Hi3861開發板)

    鴻蒙OpenHarmony【小型系統 編寫“Hello World”程序】 (基于Hi3516開發板)

    展示如何在單板上運行第一個應用程序,其中包括新建應用程序、編譯、燒寫、運行等步驟,最終輸出“Hello World!”。
    的頭像 發表于 05-10 16:26 ?734次閱讀
    鴻蒙OpenHarmony【小型系統 編寫“<b class='flag-5'>Hello</b> <b class='flag-5'>World</b>”程序】 (基于Hi3516開發板)

    鴻蒙OpenHarmony【標準系統 編寫“Hello World”程序】(基于RK3568開發板)

    下方將展示如何在單板上運行第一個應用程序,其中包括新建應用程序、編譯、燒寫、運行等步驟,最終輸出“Hello World!”。
    的頭像 發表于 05-09 17:58 ?935次閱讀
    鴻蒙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 ?906次閱讀
    鴻蒙OpenHarmony【標準系統編寫“<b class='flag-5'>Hello</b> <b class='flag-5'>World</b>”程序】 (基于RK3568開發板)

    鴻蒙OpenHarmony【小型系統編寫“Hello World”程序】 (基于Hi3516開發板)

    下方將展示如何在單板上運行第一個應用程序,其中包括新建應用程序、編譯、燒寫、運行等步驟,最終輸出“Hello World!”。
    的頭像 發表于 04-22 21:55 ?386次閱讀
    鴻蒙OpenHarmony【小型系統編寫“<b class='flag-5'>Hello</b> <b class='flag-5'>World</b>”程序】 (基于Hi3516開發板)

    鴻蒙OpenHarmony【輕量系統編寫“Hello World”程序】 (基于Hi3861開發板)

    下方將通過修改源碼的方式展示如何編寫簡單程序,輸出“Hello world”。請在下載的源碼目錄中進行下述操作。
    的頭像 發表于 04-21 21:44 ?371次閱讀
    鴻蒙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
    主站蜘蛛池模板: 亚洲激情一区| 性一交一无一伦一精一品| 免费国产成人高清在线看软件 | 快播可乐网| 日本动漫henta videos| 亚洲视频黄| qovd电影| 美女久久久| 亚洲黄色在线播放| 高h 大尺度纯肉 np快穿| 玛雅成人网| 一区三区在线专区在线| 国产三级影院| 色狠狠色狠狠综合天天| GAY空少被体育生开菊| 巨爆乳中文字幕爆乳区| 亚洲精品www久久久久久久软件| 草莓视频在线观看免费观看高清| 99精品亚洲| 久久精品国产欧美日韩99热| 午夜国产一区在线观看| 亚洲欧美精品无码一区二在线| 成人小视频在线观看免费| 麻豆国产人妻欲求不满| 亚洲幼女网| 久草青青在线| 亚洲中文字幕欧美自拍一区| 国产亚洲精品久久久久久禁果TV | 在线观看成年人免费视频| 国产色无码精品视频国产| 日本一区不卡在线播放视频免费| 97一期涩涩97片久久久久久久| 久久99国产视频| 亚洲日本欧美国产在线视| 韩日美无码精品无码| 男男gaygay拳头| 2020年国产精品午夜福利在线观看 | 嫩草影院久久精品| 99热久久这里只精品国产WWW| 久久亚洲这里只有精品18| 中文字幕 日韩 无码 在线|