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


【CC2530強化實訓04】定時器間隔定時實現按鍵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 }

廣東職業技術學院  歐浩源 <小蜜蜂老師>  ohy3686@qq.com】

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM