久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4092|回復: 9
打印 上一主題 下一主題
收起左側

單片機單鍵長按,單擊、雙擊及三擊響應程序請教

[復制鏈接]
跳轉到指定樓層
樓主
ID:91521 發表于 2020-5-30 15:25 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我要做一個警告燈小程序,需要單片機識別單按鍵,實現對長按,單擊、雙擊及三擊的響應,由于是初學,一點頭緒也沒有,請各位高人指導!另外還有要對各種按鍵響應程序融會貫通,需要掌握什么基礎知識呢?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:332444 發表于 2020-5-30 17:17 | 只看該作者
三擊的響應?有單擊 雙擊 長按可參:https://blog.csdn.net/xianfajushi/article/details/82281411
回復

使用道具 舉報

板凳
ID:162664 發表于 2020-5-30 22:22 | 只看該作者
初學啊。
簡單說需要幾點:
1:mcu的定時器設置、中斷設置。
2:io口輸入輸出、讀取。內部結構暫時不需要太深刻的理解。
3:基本的c51語言。
4:了解按鍵的消抖的問題。
5:因為你目前的功能,是對于上升沿、下降沿、的判斷問題。可以考慮看看自己度娘下邊的紅字部分。吳堅鴻講的東西嘛,干這行的普遍已經用到了的東西,可能沒意識到或者不屑于將這種東西的問題,有人總結還是可以收藏看看的。
從業將近十年!手把手教你單片機程序框架(連載)
回復

使用道具 舉報

地板
ID:681584 發表于 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
回復

使用道具 舉報

5#
ID:715652 發表于 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
        }
}
回復

使用道具 舉報

6#
ID:715652 發表于 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. //希望有用,我也是新手!
復制代碼
回復

使用道具 舉報

7#
ID:719007 發表于 2020-6-1 09:12 | 只看該作者
用狀態機
可以參考www點amobbs點com/thread-4991902-1-1.html
回復

使用道具 舉報

8#
ID:91521 發表于 2020-6-2 18:01 | 只看該作者
本帖最后由 daiya 于 2020-6-3 10:45 編輯

5樓好奇妙的算法,似乎有問題,在實驗板上實現不了
回復

使用道具 舉報

9#
ID:91521 發表于 2020-6-3 10:33 | 只看該作者

我在實驗板上試了,行不通,每次都由1擊逐漸過渡到3擊
回復

使用道具 舉報

10#
ID:401564 發表于 2020-6-3 19:37 | 只看該作者
你已經懂得看別人的算法了,那就自己寫代碼了,不要等別人的代碼,這是不現實的,大多的只能給你一個參考意見或者直接復制一段代碼給你,網上很多是沒有真正驗證過的
你先畫個流程圖,然后寫代碼,燒錄驗證,不要仿真
不行,改代碼,燒錄驗證,不要仿真
再不行,再改代碼,再燒錄驗證,不要仿真
再不行,再改代碼.............
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲成人自拍 | av网站免费 | 亚洲欧美日韩精品久久亚洲区 | 91精品国产色综合久久不卡98 | 福利视频二区 | 久久av一区 | 国产精品18久久久久久白浆动漫 | 欧美激情综合网 | 久久99精品久久久久蜜桃tv | 色综合视频 | 精品三区 | 日本久久久一区二区三区 | 精品国产鲁一鲁一区二区张丽 | 日韩电影一区 | 亚洲人成人一区二区在线观看 | 日韩a在线| www.天天操.com | 久久香焦 | 久久成人人人人精品欧 | 视频在线一区二区 | 国产精品99久久久久久宅男 | 91福利在线观看 | 伊人网综合 | 欧美在线a | 草草视频在线观看 | 日韩精品一区中文字幕 | 精品亚洲一区二区 | 亚洲欧美国产精品久久 | 九九热精品视频 | 99久久久国产精品 | 91在线视频观看免费 | 国产在线播 | 91伊人网 | 99久久久国产精品 | 成人av免费在线观看 | 日韩高清www | 韩日一区 | 久久久久久成人 | 91精品国产777在线观看 | 日韩成人av在线 | 国产最新网址 |