【CC2530強化實訓03】定時器間隔定時實現按鍵長按與短按
【題目要求】
雖然用普通的延時函數能夠實現按鍵長按與短按的判別,但是在實際的工程應用和項目開發中並不好用也不靈活。更多得是借助定時器的間隔定時來計算按鍵從按下到松開的時間間隔,然后通過判斷該時間值來區分按鍵長按與短按的狀態。
在新大陸國賽設備的黑色Zigbee模塊上,或者小蜜蜂制作的XMF09B和XMF09C中,按鍵SW1短按,切換D5燈的開關狀態;按鍵SW1長按,切換D6燈的開關狀態。
按鍵SW1----------P1_2
D5燈--------------P1_3(高電平點亮)
D6燈--------------P1_4(高電平點亮)
【實現思路】
<1> 定義一個變量K_Press,標志按鍵狀態。按鍵在按下狀態時,值為1;按鍵在松開狀態時,值為0。
<2> 定義一個變量count_t,計算按鍵處在按下狀態的時間,也就是K_Press為1時的時間。
<3> 在按鍵松開后,通過判斷count_t的值來區分按鍵長按與短按狀態。
<4> 每處理完一個按鍵狀態,隨即將count_t清0。
【實現代碼】
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 9 unsigned char K_Press = 0; 10 unsigned char count_t = 0; 11 12 /*=======================簡單的延時函數========================*/ 13 void Delay(unsigned int t) 14 { 15 while(t--); 16 } 17 18 /*======================端口初始化函數========================*/ 19 void Init_Port() 20 { 21 P1SEL &= ~0x1b; //P1_0、P1_1、P1_3和P1_4作為通用I/O端口 22 P1DIR |= 0x1b; //P1_0、P1_1、P1_3和P1_4端口輸出 23 24 P1SEL &= ~0x04; //P1_2作為通用I/O端口 25 P1DIR &= ~0x04; //P1_2端口輸入 26 P1INP &= ~0x04; //P1_2設置為上拉/下拉模式 27 P2INP &= ~0x40; //P1_2設置為上拉 28 29 D3 = 0; 30 D4 = 0; 31 D5 = 0; 32 D6 = 0; 33 } 34 35 /*=======================定時器1初始化========================*/ 36 void Init_Timer1() 37 { 38 T1CC0L = 0xd4; 39 T1CC0H = 0x30; //16MHz時鍾,128分頻,定時0.1秒 40 T1CCTL0 |= 0x04; //開啟通道0的輸出比較模式 41 T1IE = 1; 42 EA = 1; 43 T1CTL = 0x0e; //分頻系數是128,模模式 44 } 45 46 /*====================定時器1服務函數========================*/ 47 #pragma vector = T1_VECTOR 48 __interrupt void Timer1_int() 49 { 50 T1STAT &= ~0x20; //清除定時器1的溢出中斷標志位 51 if(K_Press != 0) //按鍵按下 52 { 53 count_t++; //計算按下按下的時間值 54 } 55 } 56 /*====================按鍵掃描處理函數========================*/ 57 void Scan_Keys() 58 { 59 if(SW1 == 0) 60 { 61 Delay(100); //去抖動處理 62 if(SW1 == 0) 63 { 64 K_Press = 1; //標志按鍵正在按下 65 while(SW1 == 0); //等待按鍵松開 66 K_Press = 0; //標志按鍵已經松開 67 68 if(count_t > 5) //按鍵長按 69 { 70 D6 = ~D6; 71 } 72 else //按鍵短按 73 { 74 D5 = ~D5; 75 } 76 count_t = 0; //按鍵計數值清零 77 } 78 } 79 } 80 81 /*=========================主函數=============================*/ 82 void main() 83 { 84 Init_Port(); 85 Init_Timer1(); 86 87 while(1) 88 { 89 Scan_Keys(); 90 } 91 }
【廣東職業技術學院 歐浩源 <小蜜蜂老師> ohy3686@qq.com】