【CC2530強化實訓01】普通延時函數實現按鍵的長按與短按
【題目要求】
用一個按鍵實現長按與短按的功能已經是很多嵌入式產品的常用手法。使用定時器的間隔定時來進行按鍵按下的時間是通用的做法,然而對於不太熟悉定時器使用,又沒有嚴格的延時長度的情況下,使用普通的延時函數實現長短按鍵的區分也是一個不錯的選擇。按鍵SW1短按的時候,切換D3燈的開關狀態;按鍵SW1長按的時候,切換D4燈的開關狀態。其中:
按鍵SW1---------P1_2
D3燈-------------P1_0(高電平點亮)
D4燈-------------P1_1(高電平點亮)
【實現思路】
<1> 定義一個普通的延時函數Delay()和一個計算時間的變量count。
<2> 在按鍵掃描函數中,當SW1按下的時候,不斷調用延時函數Delay()並對調用的次數進行累計保存在count中。
<3> 當SW1松開的時候,停止調用延時函數Delay(),對count變量進行判斷,大於某個閾值屬於長按,否則是短按。
【實現代碼】
#include "ioCC2530.h" #define D3 P1_0 #define D4 P1_1 #define K1 P1_2 #define TT 20 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) //確認有按鍵按下 { count = 0; //延時技術變量清0 while(K1 == 0) //按鍵按下狀態 { Delay(10000); count++; //計算按鍵按下的時間 } if(count < TT) //短按 { D3 = ~D3; } else //長按 { D4 = ~D4; } } } } void main() { Init_Port(); //初始化端口 D3 = 1; D4 = 1; Delay(50000); D3 = 0; D4 = 0; while(1) { Scan_Keys(); //掃描按鍵 } }
【廣東職業技術學院 歐浩源 <小蜜蜂老師> ohy3686@qq.com】