欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4291|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

單片機單鍵長按,單擊、雙擊及三擊響應(yīng)程序請教

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

使用道具 舉報

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

使用道具 舉報

板凳
ID:162664 發(fā)表于 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è)將近十年!手把手教你單片機程序框架(連載)
回復(fù)

使用道具 舉報

地板
ID:681584 發(fā)表于 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
回復(fù)

使用道具 舉報

5#
ID:715652 發(fā)表于 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
        }
}
回復(fù)

使用道具 舉報

6#
ID:715652 發(fā)表于 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;   //長時間不按鍵,清除按鍵次數(shù)
  33.         }
  34. }
  35. //希望有用,我也是新手!
復(fù)制代碼
回復(fù)

使用道具 舉報

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

使用道具 舉報

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

5樓好奇妙的算法,似乎有問題,在實驗板上實現(xiàn)不了
回復(fù)

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表