亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
51單片機實現按鍵短按雙擊長按程序
[打印本頁]
作者:
幸福來陪伴
時間:
2023-9-13 14:32
標題:
51單片機實現按鍵短按雙擊長按程序
這個程序使用狀態機實現長按,雙擊,短按識別程序,很好的用,歡迎大家參考和指導
/*-----------------------------------------------
名稱:按鍵
------------------------------------------------*/
#include"key.h"
extern unsigned char keyvalue;
unsigned char keyscan()
{
unsigned char keynumber;
if(!KEY1) keynumber = 1; //!!!修改此處,可以增加/減少按鍵數量
else if(!KEY2) keynumber = 2; //!!!修改此處,可以增加/減少按鍵數量
else if(!KEY3) keynumber = 3; //!!!修改此處,可以增加/減少按鍵數量
else if(!KEY4) keynumber = 4; //!!!修改此處,可以增加/減少按鍵數量
else keynumber = 0;
return keynumber;
}
unsigned char key_multi(void)
{
static uchar key_state; //按鍵狀態變量
static uint key_time; //按鍵計時變量
static uchar key_press_nums; //按鍵次數變量
static uint key_time_double; //按鍵雙擊時間
static uchar keynum; //鍵值
static uchar new_keynum; //新的鍵值
uchar key_press, key_return; //鍵值和返回值
key_return = None_click; //清除返回按鍵值
switch(keyscan())
{
case 1:key_press = KEY1;new_keynum = 1;break; //!!!修改此處,可以增加/減少按鍵數量
case 2:key_press = KEY2;new_keynum = 2;break; //!!!修改此處,可以增加/減少按鍵數量
case 3:key_press = KEY3;new_keynum = 3;break; //!!!修改此處,可以增加/減少按鍵數量
case 4:key_press = KEY4;new_keynum = 4;break; //!!!修改此處,可以增加/減少按鍵數量
default:key_press = 1;break;
}
if(key_press_nums > 0) //按鍵次數大于0,說明有按鍵
{
key_time_double++; //是否開始雙擊計
if(key_time_double >= DOUBLE_KEY_TIME && key_time_double < LONG_KEY_TIME) key_state = KEY_STATE_2;//如果時間到了在雙擊和長按之間,切換到狀態2
}
switch (key_state)
{
case KEY_STATE_0: //按鍵狀態0:判斷有無按鍵按下
{
if (!key_press) //是否有按鍵按下,沒有按下就退出
{
key_time = 0; //清零時間間隔計數
key_state = KEY_STATE_1; //然后進入 按鍵狀態1
}
}break;
case KEY_STATE_1: //按鍵狀態1:軟件消抖(確定按鍵是否有效,而不是誤觸)。按鍵有效的定義:按鍵持續按下超過設定的消抖時間。
{
if (!key_press)
{
key_time++; //一次10ms
if(key_time>=SINGLE_KEY_TIME) //消抖時間為:SINGLE_KEY_TIME*10ms = 10ms;
{
key_state = KEY_STATE_2; //如果按鍵時間超過 消抖時間,即判定為按下的按鍵有效。進入按鍵狀態2,繼續判定到底是單擊、雙擊還是長按
key_press_nums++; //按鍵次數+1
}
}
else key_state = KEY_STATE_0; //如果按鍵時間沒有超過,判定為誤觸,按鍵無效,返回 按鍵狀態0,繼續等待按鍵
}break;
case KEY_STATE_2: //按鍵狀態2:判定按鍵有效的種類:是單擊,雙擊,還是長按
{
if(key_press) //如果按鍵在 設定的雙擊時間內釋放,則判定為單擊/雙擊
{
if(key_time_double < DOUBLE_KEY_TIME ) key_state = KEY_STATE_0; //雙擊時間達到前,再次掃描按鍵,看還有沒有按鍵按下
if(key_time_double >= DOUBLE_KEY_TIME && key_time_double < LONG_KEY_TIME) //達到雙擊設定時間后,如果時間超過雙擊的時間則判斷按鍵按下的次數
{
if(key_press_nums == 1) key_return = Single_click + new_keynum*10; //判斷只按了1次,返回有效按鍵值:單擊,通過不同的值判斷是哪個按鍵按下的單擊
else if(key_press_nums ==2 && new_keynum == keynum) key_return = Double_click + new_keynum*10; //判斷按了2次和兩次按鍵按的一樣,返回有效按鍵值:雙擊,通過不同的值判斷是哪個按鍵按下的雙擊
key_state = KEY_STATE_0; //返回 按鍵狀態0,繼續等待按鍵
key_press_nums = 0; //清空按鍵次數
key_time_double = 0; //清空雙擊計時
}
if(key_time_double >LONG_KEY_TIME ) key_state = KEY_STATE_3; //如果長按之后才松開的,則切換到狀態3清0
}
else
{
key_time++; //按鍵一直按著的話,長按計時
if(key_time >= LONG_KEY_TIME) //如果按鍵時間超過 設定的長按時間(LONG_KEY_TIME*10ms=80*10ms=800ms), 則判定為 長按
{
key_return = Long_click + new_keynum*10; //返回有效鍵值值:長按,通過不同的值判斷是哪個按鍵按下的長按了
//key_state = KEY_STATE_3; //去狀態3,等待按鍵釋放
}
}
}break;
case KEY_STATE_3: //等待按鍵釋放
{
if (key_press)
{
key_state = KEY_STATE_0; //按鍵釋放后,進入 按鍵狀態0 ,進行下一次按鍵的判定
key_press_nums = 0; //清空按鍵次數
key_time_double = 0; //清空雙擊計時
}
}break;
default:key_state = KEY_STATE_0;break; //特殊情況:key_state是其他值得情況,清零key_state。這種情況一般出現在 沒有初始化key_state,第一次執行這個函數的時候
}
keynum = new_keynum; //將新獲取的鍵值賦值給鍵值
return key_return; //返回 按鍵值
}
復制代碼
作者:
yzwzfyz
時間:
2023-9-15 15:29
要點:做一個計數器CJ來判定長按與短按,CJ的規則如下:
1、CJ計數只發生于定時器的中斷服務程序中,每次中斷+1,計滿不再計,即不回0。
2、CJ計數只發生于鍵按下的時候,未按下不計。
3、做一個鍵狀態判定觸發標記:B_OK,如果鍵未按下,但CJ<>0,則置B_OK=1,表示是判斷鍵狀態的時候了。
4、當B_OK=1,判斷鍵狀態的界定法則是:CJ<某個值為短按,CJ>某個值為長按,某個值是多少由你決定。建議事先將長短兩個界定值放置在某個寄存器中,這樣可以隨意變更界定值。
5、狀態界定完成后將:B_OK清0、CJ清0以備下次再界定。
雙擊:只是規定的時間內,發生了兩個短按,這不在此敘述了。三擊、多擊如法炮制。
作者:
tyrl800
時間:
2023-9-17 20:37
這個程序太復雜了
作者:
lids
時間:
2024-7-1 10:56
按鍵程序這樣寫太復雜了,你有時間去學學吳堅鴻的程序寫法,比你學這些強多了
作者:
swy1232
時間:
2024-7-1 12:13
有沒有簡單的 程序或者更加詳細的說明
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1