1. 程式人生 > >【CC2530強化實訓02】普通延時函數實現按鍵的長按與短按

【CC2530強化實訓02】普通延時函數實現按鍵的長按與短按

掃描 -- 技術 unsigned int 切換 pan code count

【CC2530強化實訓02】普通延時函數實現按鍵的長按與短按

【題目要求】
用一個按鍵實現單擊與雙擊的功能已經是很多嵌入式產品的常用手法。使用定時器的間隔定時來計算按鍵按下的時間是通用的做法,然而,使用普通的延時函數實現按鍵單擊與雙擊的區分也是一個快速的處理手段。按鍵SW1單擊的時候,切換D3燈的開關狀態;按鍵SW1雙擊的時候,切換D4燈的開關狀態。其中:
按鍵SW1-------P1_2
D3燈-----------P1_0(高電平點亮)
D4燈-----------P1_1(高電平點亮)

技術分享圖片

【實現思路】
<1> 定義一個普通的延時函數Delay()、一個計算時間的變量count和一個延時閾值TT。


<2> 當SW1第1次按下的時候,等待按鍵松開,只要count小於TT時,調用Delay()進行延時,累計count變量。
<3> 在count小於TT時,發現SW1按鍵再次按下,則為雙擊按鍵。
<4> 如果在count大於等於TT的延時過程中都沒有第二次按鍵按下,則為單擊按鍵。


【實現代碼】

#include "ioCC2530.h"

#define D3 P1_0
#define D4 P1_1
#define K1 P1_2
#define TT 2000
unsigned int count = 0;

void Delay(unsigned int
t) { while(t--); } void Init_Port() { P1SEL &= ~0x03; //將P1_0和P1_1設置為通用I/O端口 P1DIR |= 0x03; //將P1_0和P1_1設置為輸出模式 P1SEL &= ~0x04; //將P1_2設置為通用I/O端口 P1DIR &= ~0x04; //將P1_2設置為輸入模式 } void Scan_Keys() { if(K1 == 0) { Delay(100); //按鍵去抖動處理 if(K1 == 0) //確認有按鍵按下 {
while(K1 == 0); while(count < TT) { Delay(100); count++; if(K1 == 0) //雙擊處理 { Delay(100); if(K1 == 0) { while(K1 == 0); D4 = ~D4; count = 0; break; } } } if(count >= TT) //單擊處理 { D3 = ~D3; count = 0; } } } } void main() { Init_Port(); //初始化端口 D3 = 1; D4 = 1; Delay(50000); D3 = 0; D4 = 0; while(1) { Scan_Keys(); //掃描按鍵 } }

廣東職業技術學院 歐浩源 <小蜜蜂老師> [email protected]

技術分享圖片

技術分享圖片

【CC2530強化實訓02】普通延時函數實現按鍵的長按與短按