本期我們將講解,如何在之前創建的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
在mian()函數中調用app_key_init()
實現效果一樣:
-
函數
+關注
關注
3文章
4344瀏覽量
62862 -
線程
+關注
關注
0文章
505瀏覽量
19720
原文標題:【RT-Thread Studio入門】使用輪詢法檢測按鍵
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論