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

來源:互聯網
上載者:User

標籤:dir   國賽   開關   物聯網   下拉   分享圖片   void   ++   單擊   

【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連擊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.