【CC2530強化實訓02】普通延時函數實現按鍵的長按與短按


【CC2530強化實訓02】普通延時函數實現按鍵的長按與短按

【題目要求】
      用一個按鍵實現單擊與雙擊的功能已經是很多嵌入式產品的常用手法。使用定時器的間隔定時來計算按鍵按下的時間是通用的做法,然而,使用普通的延時函數實現按鍵單擊與雙擊的區分也是一個快速的處理手段。按鍵SW1單擊的時候,切換D3燈的開關狀態;按鍵SW1雙擊的時候,切換D4燈的開關狀態。其中:
      按鍵SW1-------P1_2
      D3燈-----------P1_0(高電平點亮)
      D4燈-----------P1_1(高電平點亮)

【實現思路】
  <1> 定義一個普通的延時函數Delay()、一個計算時間的變量count和一個延時閾值TT。
  <2> 當SW1第1次按下的時候,等待按鍵松開,只要count小於TT時,調用Delay()進行延時,累計count變量。
  <3> 在count小於TT時,發現SW1按鍵再次按下,則為雙擊按鍵。
  <4> 如果在count大於等於TT的延時過程中都沒有第二次按鍵按下,則為單擊按鍵。


【實現代碼】

#include "ioCC2530.h"

#define D3 P1_0
#define D4 P1_1
#define K1 P1_2
#define TT 2000
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)       //確認有按鍵按下
    {
      while(K1 == 0);
      while(count < TT)
      {
        Delay(100);
        count++;
        
        if(K1 == 0)         //雙擊處理
        {
          Delay(100);
          if(K1 == 0)
          {
            while(K1 == 0);
            D4 = ~D4;
            count = 0;
            break;
          }
        }
      }
      
      if(count >= TT)       //單擊處理
      {
        D3 = ~D3;
        count = 0;
      }
    }
  }
}

void main()
{
  Init_Port();      //初始化端口
  D3 = 1;
  D4 = 1;
  Delay(50000);
  D3 = 0;
  D4 = 0;
  while(1)
  {
    Scan_Keys();    //掃描按鍵
  }
}

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


免責聲明!

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



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