1. 程式人生 > >【CC2530強化實訓03】定時器間隔定時實現按鍵N連擊

【CC2530強化實訓03】定時器間隔定時實現按鍵N連擊

eight -- del 周期 sta 通用 學院 處理 char

【CC2530強化實訓03】定時器間隔定時實現按鍵N連擊

【題目要求】
2018年全國職業院校技能大賽“物聯網技術應用”國賽(高職組)中關於感知層開發的難度陡然增大,三個題目均在Zigbee協議棧下完成。其中第一個題目“倉庫溫濕度智能控制系統”考查了按鍵單擊、雙擊和三連擊。為了讓大家更好的掌握按鍵的復雜處理思路,在這裏通過一個具體的實訓案例,講述通過間隔定時實現按鍵N連擊的基本思路。
在新大陸國賽設備的黑色Zigbee模塊上,或者小蜜蜂制作的XMF09B和XMF09C中,按鍵SW1單擊,切換D5燈的開關狀態;按鍵SW1雙擊,切換D6燈的開關狀態;按鍵SW1三連擊,切換D3燈的開關狀態;按鍵SW1四連擊

,切換D4燈的開關狀態
按鍵SW1----------P1_2
D5燈--------------P1_3(高電平點亮)
D6燈--------------P1_4(高電平點亮)
D3燈--------------P1_0(高電平點亮)
D4燈--------------P1_1(高電平點亮)

技術分享圖片

【實現思路】
每個按鍵按下都定義一個生命周期,假如是0.5秒,生命周期結束的時候才確定按鍵的最終狀態。如果在按鍵的生命周期內有新的按鍵按下,將會重新計算生命周期,這時候就是雙擊。在雙擊的生命周期中,又有新的按鍵按下,則生命周期會重新計算,這時候就是三連擊。在整個生命周期中如果沒有新的按鍵按下,那麽最終的按鍵狀態就是三連擊。如此類推。

技術分享圖片

【實現代碼】

  1 #include "ioCC2530.h"
  2 
  3 #define D3  P1_0
  4 #define D4  P1_1
  5 #define D5  P1_3
  6 #define D6  P1_4
  7 #define SW1 P1_2
  8 #define SW2 P0_1
  9 
 10 unsigned char count_t = 0;
 11 unsigned char K_Num = 0;
 12 
 13 /*=======================簡單的延時函數========================*/
 14 void
Delay(unsigned int t) 15 { 16 while(t--); 17 } 18 19 /*======================端口初始化函數========================*/ 20 void Init_Port() 21 { 22 P1SEL &= ~0x1b; //P1_0、P1_1、P1_3和P1_4作為通用I/O端口 23 P1DIR |= 0x1b; //P1_0、P1_1、P1_3和P1_4端口輸出 24 25 P1SEL &= ~0x04; //P1_2作為通用I/O端口 26 P1DIR &= ~0x04; //P1_2端口輸入 27 P1INP &= ~0x04; //P1_2設置為上拉/下拉模式 28 P2INP &= ~0x40; //P1_2設置為上拉 29 } 30 31 /*=======================定時器1初始化========================*/ 32 void Init_Timer1() 33 { 34 T1CC0L = 0xd4; 35 T1CC0H = 0x30; //16MHz時鐘,128分頻,定時0.1秒 36 T1CCTL0 |= 0x04; //開啟通道0的輸出比較模式 37 T1IE = 1; 38 EA = 1; 39 T1CTL = 0x0e; //分頻系數是128,模模式 40 } 41 42 /*====================定時器1服務函數========================*/ 43 #pragma vector = T1_VECTOR 44 __interrupt void Timer1_int() 45 { 46 T1STAT &= ~0x20; //清除定時器1的溢出中斷標誌位 47 if(K_Num != 0 && SW1 != 0) //按鍵不松開不計算生命周期 48 { 49 count_t++; //定時器1溢出一次加1,溢出周期為0.1S 50 } 51 } 52 53 /*====================按鍵掃描處理函數========================*/ 54 void Scan_Keys() 55 { 56 if(SW1 == 0) 57 { 58 Delay(100); //去抖動處理 59 if(SW1 == 0) 60 { 61 while(SW1 == 0); //等待按鍵松開 62 count_t = 0; //重新開始計算按鍵的生命周期 63 K_Num++; //改變按鍵狀態 64 if(K_Num > 4) //四連擊以上均判為四連擊 65 { 66 K_Num = 4; 67 } 68 } 69 } 70 if(count_t > 5) //按鍵生命周期結束 71 { 72 switch(K_Num) 73 { 74 case 1: //按鍵單擊 75 D5 = ~D5; 76 break; 77 case 2: //按鍵雙擊 78 D6 = ~D6; 79 break; 80 case 3: //按鍵三連擊 81 D3 = ~D3; 82 break; 83 case 4: //按鍵四連擊 84 D4 = ~D4; 85 break; 86 } 87 K_Num = 0; //每處理完一次按鍵,狀態清零 88 count_t = 0; //計時清零 89 } 90 } 91 92 /*=========================主函數=============================*/ 93 void main() 94 { 95 Init_Port(); 96 Init_Timer1(); 97 D3 = 0; 98 D4 = 0; 99 D5 = 0; 100 D6 = 0; 101 while(1) 102 { 103 Scan_Keys(); 104 } 105 }

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

技術分享圖片

技術分享圖片

【CC2530強化實訓03】定時器間隔定時實現按鍵N連擊