物聯網CC2530按鍵單雙擊分別控制兩燈

行醒發表於2024-10-14

(1)確定思路單擊和雙擊的效果分別是怎樣的(此文章採用簡單的延時函式不涉及中斷)。首先可以定義一個普通延時delay和一個標誌位count變數,這裡需有個延時閾值咱們直接可以宏定義B值(這裡需要注意宏定義的值一定要大一些否則雙擊效果不會觸發)。

(2)在按下按鍵等待鬆開後,讓變數count自增去與B比較,小於B時延時讓count自增,期間按鍵被再次按下則實現雙擊效果

(3)如果在count值自增期間按鍵並沒有被再次按下則實現單擊效果(這裡單擊效果可能略有延時,可透過調節B值解決)
具體程式碼如下

`#include <iocc2530.h>

define B 1000

unsigned int count = 0;//定義計時變數

void Init_port()//引腳初始化
{
P1DIR |= 0x03;
P1SEL &= ~0x03;
}

void delay(unsigned int time)//定義一個簡單延時
{
while(time--);
}

void Scan_P1_2()
{
if(P1_2 == 0)
{
delay(50);//延時消抖
if(P1_2 == 0)//確認按鍵按下
{
while(P1_2 == 0);//迴圈檢測按鍵按下
while(count < B)//上面已定義count值為0,小於B再去檢測按鍵是否被再次按下
{
delay(100);
count++;//讓計數變數自增
if(P1_2 == 0)
{
delay(100);//延時消抖
if(P1_2 == 0)//確認再次被按下
{
while(P1_2 == 0);
P1_0 = ~P1_0;
count = 0;//實現效果後將計數變數置為0
break;//跳出迴圈(while(count < B))
}
}
}
if(count >= B)//如果count值自增到延時閾值B之前按鍵沒有再次按下實現單擊效果
{
P1_1 = ~P1_1;
count = 0;
}
}
}
}
void main(void)
{
Init_port();
while(1)
{
Scan_P1_2();
}
}

CSDN:https://blog.csdn.net/2301_79116943/article/details/142871186?fromshare=blogdetail&sharetype=blogdetail&sharerId=142871186&sharerefer=PC&sharesource=2301_79116943&sharefrom=from_link

相關文章