欧美极品高清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
  1. #include<reg51.h>
  2. sbit KEY=P1^0;  
  3. int t0=0;
  4. void DelayMs(int x)  
  5. {
  6.         int i;
  7.         while(x--) for(i=0;i<120;i++);
  8. }
  9. int KEY_SCAN(bit a)  
  10. {
  11.         int t=0;
  12.         if(!a)
  13.         {
  14.                 DelayMs(5);
  15.                 while(!a)        t=++t%50,DelayMs(50);  //按鍵的時長
  16.                 t0=++t0%4;   
  17.         }
  18.         if(t0==1 && t<5)        return 1;   //單擊
  19.         if(t0==2 && t<5)        return 2;   //雙擊
  20.         if(t0==3 && t<5)        return 3;   //三擊
  21.         if(t>5)                return 4;  //長按
  22.         return 0;
  23. }
  24. void main()
  25. {
  26.         int i=0,j=0;
  27.         while(1)
  28.         {
  29.                 i=KEY_SCAN(KEY);  //按鍵返回的值會覆蓋
  30.                 DelayMs(100);
  31.                 j++;
  32.                 if(j==20)        t0=0;   //長時間不按鍵,清除按鍵次數
  33.         }
  34. }
  35. //希望有用,我也是新手!
復制代碼

作者: 渣渣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