本期我們將講解,如何在之前創(chuàng)建的Hello World項目中添加按鍵檢測功能。
一、創(chuàng)建一個新的線程用于按鍵檢測
1、使用動態(tài)線程創(chuàng)建方法創(chuàng)建一個線程
首先,定義一個動態(tài)線程句柄結(jié)構(gòu)體指針:
1/*定義一個按鍵檢測線程句柄結(jié)構(gòu)體指針*/ 2staticrt_thread_tkey_thread=RT_NULL;
然后使用動態(tài)線程創(chuàng)建函數(shù)創(chuàng)建一個線程,其中線程優(yōu)先級的范圍根據(jù)系統(tǒng)配置情況不同, 可以在rtconfig.h中查看RT_THREAD_PRIORITY_MAX宏定義
1/*創(chuàng)建按鍵檢測線程*/ 2key_thread=rt_thread_create("keythread",/*線程的名稱*/ 3key_thread_entry,/*線程入口函數(shù)*/ 4RT_NULL,/*線程入口函數(shù)的參數(shù)*/ 5256,/*線程棧大小,單位是字節(jié)*/ 65,/*線程的優(yōu)先級,數(shù)值越小優(yōu)先級越高*/ 710);/*線程的時間片大小*/
線程創(chuàng)建成功后會返回該創(chuàng)建成功的線程句柄,如果線程創(chuàng)建失敗,則返回RT_NULL,當(dāng)線程創(chuàng)建成功后,我們啟動該線程,讓該線程進(jìn)入就緒態(tài)
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、使用靜態(tài)線程創(chuàng)建方法創(chuàng)建一個線程
靜態(tài)線程創(chuàng)建需要提供線程棧和句柄:
1/*定義一個按鍵檢測靜態(tài)線程棧*/ 2staticcharkey_thread_stack[256]; 3/*定義一個按鍵檢測靜態(tài)線程句柄*/ 4staticstructrt_threadkey_thread;
然后使用靜態(tài)線程初始化函數(shù)初始化靜態(tài)線程對象
1/*初始化按鍵檢測線程,名稱是thread2,入口是thread2_entry*/ 2rt_err=rt_thread_init(&key_thread,/*線程句柄*/ 3"keythread",/*線程的名稱*/ 4key_thread_entry,/*線程入口函數(shù)*/ 5RT_NULL,/*線程入口函數(shù)的參數(shù)*/ 6&key_thread_stack[0],/*線程棧起始地址*/ 7sizeof(key_thread_stack),/*線程棧大小,單位是字節(jié)*/ 85,/*線程的優(yōu)先級,數(shù)值越小優(yōu)先級越高*/ 910);/*線程的時間片大小*/
線程創(chuàng)建成功后返回值為RT_EOK,創(chuàng)建失敗則返回-RT_ERROR,當(dāng)線程創(chuàng)建成功后,我們啟動該線程,讓該線程進(jìn)入就緒態(tài)
1/*如果線程創(chuàng)建成功,啟動這個線程*/ 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. ");
二、編寫線程入口函數(shù)
首先,我們需要獲取按鍵對應(yīng)的引腳編號,使用GET_PIN宏定義,查看原理圖,獲取按鍵對應(yīng)的引腳
1/*獲取相應(yīng)的引腳編號*/ 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)
接下來,我們編寫一下按鍵檢測線程入口函數(shù),因為硬件上已經(jīng)有上下拉了,所以就不配置內(nèi)部上下拉了
1/*按鍵檢測線程入口函數(shù)*/ 2staticvoidkey_thread_entry(void*parameter) 3{ 4staticrt_uint8_tkey_up=1;/*按鍵松開標(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/*檢測按鍵是否按下*/ 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}
三、實現(xiàn)效果
構(gòu)建并下載程序,查看串口終端輸出:
可以看到,按鍵檢測線程啟動成功,按鍵功能也實現(xiàn)了
四、代碼優(yōu)化
上面我們的代碼都寫在了mian.c里,我們可以將其放在一個單獨(dú)的app_key.c文件中右鍵選中【applications】,選擇新建源文件
輸入app_key.c文件名,點(diǎn)擊確定:
將之前編寫的代碼都遷移到該文件中來,并提供一個app_key_init()函數(shù)供main()函數(shù)調(diào)用
1#include
在mian()函數(shù)中調(diào)用app_key_init()
實現(xiàn)效果一樣:
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4371瀏覽量
64230 -
線程
+關(guān)注
關(guān)注
0文章
507瀏覽量
20082
原文標(biāo)題:【RT-Thread Studio入門】使用輪詢法檢測按鍵
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
DevEco Studio 寫一個簡單的頁面
在mimxrt1170_evk調(diào)試hello_world出現(xiàn)硬件傳輸錯誤怎么解決?
加載示例圖像時,COM7的調(diào)試控制臺hello_world不顯示消息怎么解決?
使用MCUXpresso for VS Code插件開發(fā)Zephyr的hello world

評論