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