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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于單片機按鍵長按過程中觸發短按的問題?萌新求各位指導

  [復制鏈接]
跳轉到指定樓層
樓主
ID:540927 發表于 2020-8-29 11:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我的程序在按鍵長按過程中會觸發短按,一般一次長按在開始和結束時各觸發一次短按,不知道怎么改程序才合適,求各位指導

捕獲.PNG (12.82 KB, 下載次數: 122)

捕獲.PNG
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:816093 發表于 2020-8-29 12:15 | 只看該作者
應該是按下的時候 按鍵的機械抖動 造成側毛刺信號 所以觸發了短按檢測 在按下和結束的時候加延時再檢測試一下
回復

使用道具 舉報

板凳
ID:236035 發表于 2020-8-29 13:31 | 只看該作者
if(exKeyValueFlag != 0)
{
        if(i<1000)
        {
                i++;
                if(i > 1500)
                {
                        longkeyflag = 1;
                        i = 0;
                }
        }
}
else
{
        if(i>50)
        {
                shortkeyflag = 1;
                i = 0;
        }
        else
                i = 0;
}
回復

使用道具 舉報

地板
ID:236035 發表于 2020-8-29 13:32 | 只看該作者
1 上面的回復是純手打,因為樓主位的程序無法復制
2 有問題先百度下,有很多經典例程,如果實在解決不了,再發貼提問 。
回復

使用道具 舉報

5#
ID:540927 發表于 2020-8-29 14:14 | 只看該作者
meitao 發表于 2020-8-29 12:15
應該是按下的時候 按鍵的機械抖動 造成側毛刺信號 所以觸發了短按檢測 在按下和結束的時候加延時再檢測試一 ...

感謝您的回復,消抖已經處理過了,我只粘貼出來計數部分
回復

使用道具 舉報

6#
ID:540927 發表于 2020-8-29 14:18 | 只看該作者
ly1972001 發表于 2020-8-29 13:32
1 上面的回復是純手打,因為樓主位的程序無法復制
2 有問題先百度下,有很多經典例程,如果實在解決不了, ...

辛苦了,感謝您的程序和建議
回復

使用道具 舉報

7#
ID:540927 發表于 2020-8-29 14:33 | 只看該作者
ly1972001 發表于 2020-8-29 13:31
if(exKeyValueFlag != 0)
{
        if(i 1500)

謝謝您的代碼,參考了您的代碼,抬起手的時候不觸發短按了,但是剛開始的時候還是觸發了短按
回復

使用道具 舉報

8#
ID:540927 發表于 2020-8-29 15:08 | 只看該作者
ly1972001 發表于 2020-8-29 13:31
if(exKeyValueFlag != 0)
{
        if(i 1500)


這是修改后的程序

捕獲.PNG (11.19 KB, 下載次數: 146)

捕獲.PNG
回復

使用道具 舉報

9#
ID:89515 發表于 2020-8-30 11:43 來自手機 | 只看該作者
山水間 發表于 2020-8-29 15:08
這是修改后的程序

按鍵按下
{
}
回復

使用道具 舉報

10#
ID:89515 發表于 2020-8-30 12:11 來自手機 | 只看該作者
山水間 發表于 2020-8-29 15:08
這是修改后的程序

按鍵按下
{
1:確定按下實現短按鍵功能退出
2:按鍵是否彈起?
     彈起退出進入3
按鍵沒彈起,延時變量加,
      延時變量是否達到設定值?
達到,實現長按鍵功能退出進入3
未達到,退出返回2
3:清除變量退出返回1
}
無論你要做什么按鍵邏輯上首先要保證按鍵按下
吧,你的程序就算勉強實現,邏輯也有很大的問題。
回復

使用道具 舉報

11#
ID:89515 發表于 2020-8-30 12:14 來自手機 | 只看該作者
山水間 發表于 2020-8-29 15:08
這是修改后的程序


1:確定按下實現短按鍵功能退出
2:按鍵是否彈起?
     彈起退出進入3
按鍵沒彈起,延時變量加,
      延時變量是否達到設定值?
達到,實現長按鍵功能退出進入3
未達到,退出返回2
3:清除變量退出返回1

無論你要做什么按鍵邏輯上首先要保證按鍵按下
過吧,你的程序就算勉強實現,邏輯也有很大的問題。
回復

使用道具 舉報

12#
ID:89515 發表于 2020-8-30 12:17 來自手機 | 只看該作者
這種程序用狀態機最簡單,單個按鍵所有的按鍵功能都可以在里面實現
回復

使用道具 舉報

13#
ID:808485 發表于 2020-8-31 14:39 | 只看該作者
一般區分長短,是在抬起的時候判斷,
如果還未抬起的情況下要做出判斷,那長按過程肯定會經過短按的時間,這個邏輯應該容易理解,就像走路100步,會先走過30步。
對于單鍵多用,建議用單擊/雙擊的方法,像鼠標那樣。
回復

使用道具 舉報

14#
ID:540927 發表于 2020-8-31 14:52 | 只看該作者
本帖最后由 山水間 于 2020-8-31 15:27 編輯
mengzhixinheng 發表于 2020-8-30 12:17
這種程序用狀態機最簡單,單個按鍵所有的按鍵功能都可以在里面實現

感謝您的回復,現在我用狀態機了,可惜連短按都無法實現
void key()
{
        static CHAR keystate = keystate0;
        INT16U keytime = 0;
        CHAR keypress;
        keypress = exKeyValueFlag;            //讀取按鍵
        switch(keystate)
        {
                case keystate0:
                        if(keypress != 0)
                        {
                                keystate =keystate1;
                        }
                        break;
                        
                case keystate1:                      //計時狀態
                        if(keypress != 0)
                        {
                                keytime++;
                                keystate = keystate2;
                        }
                       
                        break;
                        
                case keystate2:                      //按鍵判斷狀態
                        if(keypress == 0)
                        {
                                if((keytime >= 10)&&(keytime <= 1000))
                                {
                                        keytime = 0;
                                        shortkeyflag = 1;
                                        keystate = keystate0;
                                }
                                else if(keytime >= 3000)
                                {
                                        keytime = 0;
                                        longkeyflag =1;
                                        keystate = keystate0;
                                }
                        }
                        else
                        {
                                keystate = keystate1;
                        }
                break;     
        }
}
回復

使用道具 舉報

15#
ID:540927 發表于 2020-8-31 14:53 | 只看該作者
gbchang 發表于 2020-8-31 14:39
一般區分長短,是在抬起的時候判斷,
如果還未抬起的情況下要做出判斷,那長按過程肯定會經過短按的時間, ...

好的,謝謝您的回復,我試著這么做
回復

使用道具 舉報

16#
ID:511890 發表于 2020-9-1 00:23 | 只看該作者
有很多問題。if語句的用法問題。if語句每一個分支都必須是唯一的。你的if語句第一個i<10000,和第二個i>50,當i=51---9999的時候,兩個if分支是同事觸發的。
然后是按鍵事件問題,一般這個情況都是在按鍵抬起(exKeyValueFlag == 0)時進行事件處理。

修改程序如下:
if(exKeyValueFlag != 0)
{
    if(i<10000) {
           i++;
    }
    else{
         i=10000;//i達到最大值時定住,防止溢出
     }
}
else   //當按鍵抬起時做判斷
{
        if(i > 1500) {
                        longkeyflag = 1;
                }
        else{                           //這里也可以按照你的意思:if(i>50 && i<200)
               shortkeyflag = 1;
        }
        }
     i = 0;//i初始化
}
--------------------------------------
前天發的好像不見了。再發以下。
有很多問題。if語句的用法問題。if語句每一個分支都必須是唯一的。你的if語句第一個i<10000,和第二個i>50,當i=51---9999的時候,兩個if分支是同事觸發的。
然后是按鍵事件問題,一般這個情況都是在按鍵抬起(exKeyValueFlag == 0)時進行事件處理。


if(exKeyValueFlag != 0)
{
    if(i<10000) {
           i++;
    }
    else{
         i=10000;//i達到最大值時定住,防止溢出
     }
  //if(i > 1500) {
  //                      longkeyflag = 1;
   //             }

}
else   //當按鍵抬起時做判斷
{
        if(i > 1500) {
                        longkeyflag = 1;
                }
        else{                           //這里也可以按照你的意思:if(i>50 && i<200)
               shortkeyflag = 1;
        }
        }
     i = 0;//i初始化
}

一般這種情況都是按鍵抬起時再做事件。當然,也可以分成兩部分,長按的放在按鍵按下時處理,也就是我注釋掉的那三行。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

17#
ID:469932 發表于 2020-9-1 08:24 | 只看該作者
很簡單的問題繞了這么遠,你不會在短按鍵時加1個標志位,在長按鍵中約束這個標志位?
比如if(SW長==0){.........FLAG1=0;//短按鍵失控......}
if(SW短 == 0  && FLAG == 1)這時的短按鍵無論如何不會觸發......你品,你細品!
回復

使用道具 舉報

18#
ID:540927 發表于 2020-9-1 11:41 | 只看該作者
幻劍心 發表于 2020-9-1 00:23
前天發的好像不見了。再發以下。
有很多問題。if語句的用法問題。if語句每一個分支都必須是唯一的。你的if ...

感謝您的回復,您的這個方案我嘗試了,不過長按不能觸發,在長按的過程中短按也觸發了,出發的時候按鍵還沒有抬起,這與程序不符,可能是我用的彈簧按鍵有點特殊吧
回復

使用道具 舉報

19#
ID:540927 發表于 2020-9-1 11:44 | 只看該作者
Sawardeakar 發表于 2020-9-1 08:24
很簡單的問題繞了這么遠,你不會在短按鍵時加1個標志位,在長按鍵中約束這個標志位?
比如if(SW長==0){... ...

感謝您的建言,加個標志位我也有考慮過,不過關鍵是要在什么地方把標志位置1
回復

使用道具 舉報

20#
ID:540927 發表于 2020-9-1 11:48 | 只看該作者
gbchang 發表于 2020-8-31 14:39
一般區分長短,是在抬起的時候判斷,
如果還未抬起的情況下要做出判斷,那長按過程肯定會經過短按的時間, ...

我的短按就是在抬起時才判斷的,但是實際執行過程中長按下去還沒抬起就觸發了短按
回復

使用道具 舉報

21#
ID:474670 發表于 2020-9-1 14:27 | 只看該作者
山水間 發表于 2020-9-1 11:44
感謝您的建言,加個標志位我也有考慮過,不過關鍵是要在什么地方把標志位置1

有句話叫經驗不夠,汗水來湊!別人將思路很明確的告訴你了,就是不知道去動動手,一味在那里干站著干問!很明顯不要短按鍵誤動作就放FLAG=0,要短按鍵動作就放FLAG=1;比如你手機。短按是開關機畫面,按時間長一點就是重啟與真正關機(這個時候的長按鍵與短按鍵都有效)
回復

使用道具 舉報

22#
ID:89515 發表于 2020-9-1 15:34 來自手機 | 只看該作者
gbchang 發表于 2020-8-31 14:39
一般區分長短,是在抬起的時候判斷,
如果還未抬起的情況下要做出判斷,那長按過程肯定會經過短按的時間, ...

你說的是常規方法,一直按下自然要經過短按鍵
但是如果用狀態機把長按鍵放在下一個狀態。與短按鍵不會互相影響,因為無論怎么做,每次按下傳回的鍵值只能有一個。還有長按鍵,連續按鍵都是在按下狀態去判斷的,怎么可能彈起再判斷,不符合邏輯。你想我按下按鍵,當延時到了就返回長按鍵鍵值實現功能,然后我松開按鍵這是正常的過程。如果抬起判斷,你知道是什么后果嗎?很簡單,長按鍵的時間只能靠人為去感知,可能按短了實現不了,也可能按長了,功能倒是實現了,但你這樣做了就知道很不爽的。
回復

使用道具 舉報

23#
ID:89515 發表于 2020-9-1 15:52 來自手機 | 只看該作者
山水間 發表于 2020-8-31 14:52
感謝您的回復,現在我用狀態機了,可惜連短按都無法實現
void key()
{

函數內靜態變量別賦值,要賦值就用全局變量,
怕變量多凌亂就就用結構體把相關的放一起。這個用狀態機絕對很好,它可以讓你避開一些互鎖標志,過程很清晰,也不用管消抖,把按鍵程序寫好了,做個20ms的時基,往里面一放就好了。你要用的只是返回的不同鍵值,與你實現的功能不要有太多的耦合。如果還是很久都搞不好,就做個簡單的按鍵仿真,先把方法學會。
回復

使用道具 舉報

24#
ID:89515 發表于 2020-9-1 16:06 來自手機 | 只看該作者
山水間 發表于 2020-8-31 14:52
感謝您的回復,現在我用狀態機了,可惜連短按都無法實現
void key()
{

函數內靜態變量別賦常值,不然它怎么變化。如果不行,就做個仿真,把一個按鍵搞會,在嵌入你的程序。如果還不會再問吧!
回復

使用道具 舉報

25#
ID:540927 發表于 2020-9-1 16:24 | 只看該作者
站著說話不腰疼 發表于 2020-9-1 14:27
有句話叫經驗不夠,汗水來湊!別人將思路很明確的告訴你了,就是不知道去動動手,一味在那里干站著干問! ...

感謝您的建議,我會認真思考的
回復

使用道具 舉報

26#
ID:540927 發表于 2020-9-1 16:27 | 只看該作者
mengzhixinheng 發表于 2020-9-1 16:06
函數內靜態變量別賦常值,不然它怎么變化。如果不行,就做個仿真,把一個按鍵搞會,在嵌入你的程序。如果 ...

好的,謝謝您如此詳細又耐心的指導,我試著掌握狀態機的用法
回復

使用道具 舉報

27#
ID:540927 發表于 2020-9-2 10:31 | 只看該作者
感謝所有回復提出寶貴建議的人,我的問題已經解決,真的謝謝大家
回復

使用道具 舉報

28#
ID:130230 發表于 2020-9-2 23:50 | 只看該作者
我再論壇里面發過一個狀態機掃描按鍵的實例,你可以看一下。拿來即用的程序。
回復

使用道具 舉報

29#
ID:540927 發表于 2020-9-3 10:32 | 只看該作者
jizhongbiao 發表于 2020-9-2 23:50
我再論壇里面發過一個狀態機掃描按鍵的實例,你可以看一下。拿來即用的程序。

好的,謝謝您的建議
回復

使用道具 舉報

30#
ID:475858 發表于 2022-9-14 14:01 | 只看該作者
站著說話不腰疼 發表于 2020-9-1 14:27
有句話叫經驗不夠,汗水來湊!別人將思路很明確的告訴你了,就是不知道去動動手,一味在那里干站著干問! ...

這樣操作的話,短按一直不起作用了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品在线一区 | 精品久久久久久久久久久 | 亚洲精品综合一区二区 | 成人欧美一区二区三区黑人孕妇 | a级在线 | 伊人久久大香线 | 中文字幕精 | 色婷婷精品久久二区二区蜜臂av | 伊人av在线播放 | 日韩视频在线观看 | 成人免费在线播放 | 国产一区二区三区视频 | 看真人视频一级毛片 | av在线三级| 免费观看一级特黄欧美大片 | av网站免费在线观看 | 97人人干 | 91在线看视频 | 宅女噜噜66国产精品观看免费 | 午夜a√| 国产精品美女久久久久 | 九九热精品视频 | heyzo在线| 99九色| 一区二区三区高清 | 欧美日韩在线免费 | 国产美女久久久 | 蜜桃视频在线观看免费视频网站www | 亚洲欧美日韩在线 | 国产亚洲一区二区三区在线 | 精品一区av | 亚州精品天堂中文字幕 | 亚洲综合在| 国产高清一区二区三区 | 日韩av高清 | 国产日韩免费视频 | 亚洲小视频 | 亚洲精品视频在线 | 欧美日韩一二三区 | 国产精品美女久久久久久免费 | 国产成人福利 |