欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機單鍵長按,單擊、雙擊及三擊響應程序請教
[打印本頁]
作者:
daiya
時間:
2020-5-30 15:25
標題:
單片機單鍵長按,單擊、雙擊及三擊響應程序請教
我要做一個警告燈小程序,需要單片機識別單按鍵,實現對長按,單擊、雙擊及三擊的響應,由于是初學,一點頭緒也沒有,請各位高人指導!另外還有要對各種按鍵響應程序融會貫通,需要掌握什么基礎知識呢?
作者:
xianfajushi
時間:
2020-5-30 17:17
三擊的響應?有單擊 雙擊 長按可參:
https://blog.csdn.net/xianfajushi/article/details/82281411
作者:
gxslxxm
時間:
2020-5-30 22:22
初學啊。
簡單說需要幾點:
1:mcu的定時器設置、中斷設置。
2:io口輸入輸出、讀取。內部結構暫時不需要太深刻的理解。
3:基本的c51語言。
4:了解按鍵的消抖的問題。
5:因為你目前的功能,是對于上升沿、下降沿、的判斷問題。可以考慮看看自己度娘下邊的紅字部分。吳堅鴻講的東西嘛,干這行的普遍已經用到了的東西,可能沒意識到或者不屑于將這種東西的問題,有人總結還是可以收藏看看的。
從業將近十年!手把手教你單片機程序框架(連載)
作者:
12356742
時間:
2020-5-31 17:09
#define key_state_0 0#define key_state_1 1#define key_state_2 2#define key_state_3 3 #define key_no 0#define key_click 1#define key_double 2#define key_long 3 #define key_input P30/***************************************************************************程序功能:一個按鍵的單擊、雙擊、長按。三種按鍵方式,然后做不同的處理。 ***************************************************************************/ static unsigned char key_driver(void){ static unsigned char key_state_buffer1 = key_state_0; static unsigned char key_timer_cnt1 = 0; unsigned char key_return = key_no; unsigned char key; key = key_input; //read the I/O states switch(key_state_buffer1) { case key_state_0: if(key == 0) key_state_buffer1 = key_state_1; //按鍵被按下,狀態轉換到按鍵消抖和確認狀態// break; case key_state_1: if(key == 0) { key_timer_cnt1 = 0; key_state_buffer1 = key_state_2; //按鍵仍然處于按下狀態 //消抖完成,key_timer開始準備計時 //狀態切換到按下時間計時狀態 } else key_state_buffer1 = key_state_0; //按鍵已經抬起,回到按鍵初始狀態 break; //完成軟件消抖 case key_state_2: if(key == 1) { key_return = key_click; //按鍵抬起,產生一次click操作 key_state_buffer1 = key_state_0; //轉換到按鍵初始狀態 } else if(++key_timer_cnt1 >= 100) //按鍵繼續按下,計時超過1000ms { key_return = key_long; //送回長按事件 key_state_buffer1 = key_state_3; //轉換到等待按鍵釋放狀態 } break; case key_state_3: //等待按鍵釋放 if(key == 1) //按鍵釋放 key_state_buffer1 = key_state_0; //切回按鍵初始狀態 break; } return key_return;} /***************************************************************************函數功能:中層按鍵處理函數,調用底層函數一次,處理雙擊事件的判斷, 返回上層正確的無鍵、單擊、雙擊、長按四種狀態本函數由上層循環調用,間隔10ms***************************************************************************/unsigned char key_read(void){ static unsigned char key_state_buffer2 = key_state_0; static unsigned char key_timer_cnt2 = 0; unsigned char key_return = key_no; unsigned char key; key = key_driver(); switch(key_state_buffer2) { case key_state_0: if(key == key_click) { key_timer_cnt2 = 0; //第一次單擊,不返回,到下個狀態判斷是否會出現雙擊 key_state_buffer2 = key_state_1; } else key_return = key; //對于無鍵、長按,返回原事件 break; case key_state_1: if(key == key_click) //又一次單擊,時間間隔小于500ms { key_return = key_double; //返回雙擊事件,回到初始狀態 key_state_buffer2 = key_state_0; } else if(++key_timer_cnt2 >= 50) { //這里500ms內肯定讀到的都是無鍵事件,因為長按大于1000ms //在1s前底層返回的都是無鍵 key_return = key_click; //500ms內沒有再次出現單擊事件,返回單擊事件
直接貼上源碼
key_state_buffer2 = key_state_0; //返回初始狀態 } break; } return key_return;}
————————————————
版權聲明:本文為CSDN博主「沉默的小宇宙」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:
https://blog.csdn.net/qq997758497/java/article/details/80606710
作者:
渣渣馬
時間:
2020-5-31 23:03
#include<reg51.h>
sbit KEY=P1^0; //檢測端口
int t0=0; //按鍵次數變量
void DelayMs(int x) //延時
{
int i;
while(x--) for(i=0;i<120;i++);
}
int KEY_SCAN(bit a) //按鍵檢測
{
int t=0;
if(!a)
{
DelayMs(5);
while(!a) t=++t%50,DelayMs(50); //按鍵時長
t0=++t0%4; //按鍵次數
}
if(t0==1 && t<5) return 1; //單擊
if(t0==2 && t<5) return 2; //雙擊
if(t0==3 && t<5) return 3; //三擊
if(t>5) return 4; //長按
return 0;
}
void main()
{
int i=0,j=0;
while(1)
{
i=KEY_SCAN(KEY); //會進行覆蓋
DelayMs(100);
j++;
if(j==20) t0=0; //長時間不按,清除按鍵次數為0
}
}
作者:
渣渣馬
時間:
2020-5-31 23:12
#include<reg51.h>
sbit KEY=P1^0;
int t0=0;
void DelayMs(int x)
{
int i;
while(x--) for(i=0;i<120;i++);
}
int KEY_SCAN(bit a)
{
int t=0;
if(!a)
{
DelayMs(5);
while(!a) t=++t%50,DelayMs(50); //按鍵的時長
t0=++t0%4;
}
if(t0==1 && t<5) return 1; //單擊
if(t0==2 && t<5) return 2; //雙擊
if(t0==3 && t<5) return 3; //三擊
if(t>5) return 4; //長按
return 0;
}
void main()
{
int i=0,j=0;
while(1)
{
i=KEY_SCAN(KEY); //按鍵返回的值會覆蓋
DelayMs(100);
j++;
if(j==20) t0=0; //長時間不按鍵,清除按鍵次數
}
}
//希望有用,我也是新手!
復制代碼
作者:
渣渣123
時間:
2020-6-1 09:12
用狀態機
可以參考www點amobbs點com/thread-4991902-1-1.html
作者:
daiya
時間:
2020-6-2 18:01
本帖最后由 daiya 于 2020-6-3 10:45 編輯
5樓好奇妙的算法,似乎有問題,在實驗板上實現不了
作者:
daiya
時間:
2020-6-3 10:33
渣渣馬 發表于 2020-5-31 23:12
我在實驗板上試了,行不通,每次都由1擊逐漸過渡到3擊
作者:
Y_G_G
時間:
2020-6-3 19:37
你已經懂得看別人的算法了,那就自己寫代碼了,不要等別人的代碼,這是不現實的,大多的只能給你一個參考意見或者直接復制一段代碼給你,網上很多是沒有真正驗證過的
你先畫個流程圖,然后寫代碼,燒錄驗證,不要仿真
不行,改代碼,燒錄驗證,不要仿真
再不行,再改代碼,再燒錄驗證,不要仿真
再不行,再改代碼.............
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1