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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求指導:按鍵處理方法,長按3秒進入菜單,長按1秒退出,單擊實現其它功能

  [復制鏈接]
跳轉到指定樓層
樓主
想實現如圖的功能,具體按鍵處理方法為:長按3秒進入菜單,長按1秒退出,單擊實現其它功能。其中“長按3秒進入菜單,長按1秒退出”一點思路也沒有,想了好多辦法都沒法實現,請各位指導!


按鍵操作方式.jpg (37.93 KB, 下載次數: 75)

紅框內為按鍵處理方式

紅框內為按鍵處理方式
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:401564 發表于 2020-7-1 17:13 | 只看該作者
如果我沒有記錯的話,哥們你搞這個“按鍵”已經快兩年了,我記得我說過“兩年時間,學一門編程語言都可以了”,更何況只是一個功能而已呢
1:設定一個標志位,用于標志當前是在菜單中,還是已經退出菜單了
2:當按下按鍵之后,去抖動,一邊檢測按鍵有沒有松開,一邊計時
3:按鍵松開之后,通過計時時間的長短來判定功能:
A不到1秒,無效,
B如果是已經進入菜單,大于1秒,小于3秒,退出。大于3秒,無效
C如果是沒有進入菜單,小于3秒的都無效

評分

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

查看全部評分

回復

使用道具 舉報

板凳
ID:91521 發表于 2020-7-1 17:47 | 只看該作者
可是儀表要求的是,按鍵1秒以上退出“初始設定菜單”,即使按鍵超過3秒也不會再次觸發出現“初始設定菜單”,這是個難點,我曾經在手電筒上見識過類似的設置,一直沒能實現,所以反復的發帖,想找到一個編程的方法
回復

使用道具 舉報

地板
ID:781892 發表于 2020-7-1 17:58 來自手機 | 只看該作者
Y_G_G 發表于 2020-7-1 17:13
如果我沒有記錯的話,哥們你搞這個“按鍵”已經快兩年了,我記得我說過“兩年時間,學一門編程語言都可以了 ...

按鍵1秒以上退出“初始設定菜單”,即使按鍵超過3秒也不會再次觸發出現“初始設定菜單”,這是個難點,我曾經在手電筒上見識過類似的設置,一直沒能實現,所以反復的發帖,想找到一個編程的方法
回復

使用道具 舉報

5#
ID:91521 發表于 2020-7-1 18:44 | 只看該作者
根本不能在按鍵松開時判斷,因為這樣無法實現達到三秒立即進入“初始設定菜單”,
回復

使用道具 舉報

6#
ID:7209 發表于 2020-7-1 18:59 | 只看該作者
按鍵按下去開始計時
松開按鍵返回時間
(這里 需要用到電平反轉 中斷
  啟用定時器
  實際上就是 一鍵多功能 的實現
你可以查查  ,
)

tiime  = duqu_k1_time(); //讀取定時中斷中按鍵按下去的時間
switch(time)
   {
   case 1:  //處理1s 的功能代碼  
   baeak;
   case 2:  //處理2s 的功能代碼
   break;
   case 3: //處理3s 的功能代碼
   break;
  default:  //處理不再按鍵保持時間功能
  break;

   }
//偽代碼
回復

使用道具 舉報

7#
ID:401564 發表于 2020-7-1 19:08 | 只看該作者
gl960530484 發表于 2020-7-1 17:58
按鍵1秒以上退出“初始設定菜單”,即使按鍵超過3秒也不會再次觸發出現“初始設定菜單”,這是個難點,我 ...

按下按鍵超過3秒就認為是已經達到開機或者其它功能的條件了,然后就調用處理程序,處理玩之后再回來判斷按鍵有沒有松開,沒有松開就一直等到它松開再進行下一次的檢測,這樣就不會出現一直按下按鍵就一直有功能的現象了,我會上傳一個LED燈的程序,你試著看一下,我用的是匯編,你要是不會匯編,那就沒有辦法了
回復

使用道具 舉報

8#
ID:401564 發表于 2020-7-1 19:10 | 只看該作者
這是一個已經驗證過的匯編程序,雙擊和長按是開關機,短按是功能切換,你參考一下,如果不會匯編,那就沒有辦法了 LED V8.0.rar (11.1 KB, 下載次數: 21)
回復

使用道具 舉報

9#
ID:213173 發表于 2020-7-1 20:50 | 只看該作者
給你寫一個短、中、長按鍵示例,具體任務自行完善。有詳細注釋,不難理解。
  1. #include<reg52.h>
  2. sbit LED1=P1^0;
  3. sbit LED2=P1^1;
  4. sbit LED3=P1^2;
  5. sbit key=P1^7;

  6. void Timer0Init()        //10毫秒@12.000MHz
  7. {
  8.         TMOD= 0x01;                //設置定時器模式
  9.         TL0 = 0xF0;                //設置定時初值
  10.         TH0 = 0xD8;                //設置定時初值
  11.         TR0 = 1;                        //定時器0開始計時
  12.         EA  = 1;       //開總中斷
  13.         ET0 = 1;       //開T0中斷
  14. }

  15. //按鍵掃描
  16. void keyscan()
  17. {
  18.         static unsigned int time=0;//計數變量
  19.         static bit key_sign=0;                //按鍵狀態標志
  20.         if(!key)//按鍵按下
  21.         {
  22.                 time++;
  23.                 if(time>300)
  24.                         time=301;//防止溢出
  25.                 if(time>1 && key_sign==0)//10ms消抖
  26.                         key_sign=1;//確認按鍵按下
  27.                 if(time==300)//判斷按下3s有效
  28.                         LED3=~LED3;//任務3
  29.         }
  30.         else //沒有按或按下后松手
  31.         {
  32.                 if(key_sign==1)//判斷是按鍵按下后松手
  33.                 {
  34.                         key_sign=0;
  35.                         if(time<100)//小于1s判斷短按
  36.                                 LED1=~LED1;//任務1
  37.                         if(time>=100 && time<300)//大于1s有效
  38.                                 LED2=~LED2;//任務2
  39.                 }
  40.                 time=0;
  41.         }
  42. }
  43. //主函數
  44. void main()
  45. {
  46.         Timer0Init();//定時器初始化函數
  47.         while(1)
  48.         {
  49.                 //其它任務
  50.         }
  51. }
  52. //T0中斷服務函數
  53. void Timer0Interrupt() interrupt 1
  54. {
  55.         TL0 = 0xF0;                //設置定時初值
  56.         TH0 = 0xD8;                //設置定時初值
  57.         keyscan();                //按鍵掃描
  58. }
復制代碼
回復

使用道具 舉報

10#
ID:633559 發表于 2020-7-1 22:41 | 只看該作者
該我出場的時候了,如果人人都獻出一份愛~~~,咳咳,我的截圖工具今晚不給力啊,只能分兩張了

評分

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

查看全部評分

回復

使用道具 舉報

11#
ID:592807 發表于 2020-7-2 11:43 | 只看該作者
daiya 發表于 2020-7-1 18:44
根本不能在按鍵松開時判斷,因為這樣無法實現達到三秒立即進入“初始設定菜單”,

3秒和1秒,這么精準的嗎?
我按兩秒會怎么樣?按4秒怎么樣?
就不能多弄按鍵復用嗎?按鍵掃描和處理都要時間,人手按鍵時間也不精準啊,誰也保證不了。


if(按下按鍵)
{
   延時500毫秒;
  if(按鍵松開)//單擊  {
      功能1;
  }
else//長按
{
     延時500毫秒;
     if(按鍵松開)
     {
        功能2;
     }
    延時1500毫秒;
    else
      {
          功能3;
      }
}
}

回復

使用道具 舉報

12#
ID:548551 發表于 2020-7-2 17:18 | 只看該作者
我不知道你是學生還是已經在工作了,  如果是學生的話還可以理解.如果是出來工作了不應該一個按鍵的長短按還弄不清楚啊. 我給你一個程序,上面的注釋很清楚 ,如果你還不理解的話就不要做單片機了.這個是我所有項目都那樣寫的. 有三個點要注意:1  你要用到的那個IO口,也就是按鍵IO口必須是輸入設置,并且打開上拉,2 我的程序是4MS 一個定時. 3 不要用延時程序, 你用了延時程序以后這個就程序讀取的電平就不準了, 時間也不準了.
void KEY_SCAN(void)                                        //掃描按鍵
{
    if(!f_key_press)                                        //判斷是按下還是彈起狀態 1 按下狀態 0 彈起狀態
    {
        if(P_KEY){key_cnt=0;}                        // 讀取IO口的電平 因為開了上拉,沒有按按鍵的時候讀取到的為高 所以只要是高就清零計數
        key_cnt++;                                        // ++
        if(key_cnt>=10)                                        // 連續讀取IO口電平10次證明按下按鍵了, 并且穩定了這也可以理解為消抖
        {
            key_cnt=0;                                        // 清零按鍵計數 記得你一定要清零
            f_key_press=1;                                //置按下按鍵標志位 并且置長按按鍵標志位
            f_key_ctrl=1;                                        // 長按標志位置起來后面要用到
        }
    }
    else                                                        //判斷按鍵是按下還是彈起狀態 按下狀態 0 彈起狀態
    {
        if(!P_KEY){key_cnt=0;}                        //讀取IO口電平 ,開上拉的緣故 置要讀取到為低就證明還在按下狀態中 所以要清零按鍵計數
        key_cnt++;                                        //++
        if(key_cnt>=10)                                        // 連續讀取到10次高電平就證明已經彈起按鍵了.
        {
            key_cnt=0;                                        // 清零彈起計數
            f_key_press=0;                                //清按下標志位
            // 敲重點  這里仔細看
            if(f_key_ctrl)                                        //去讀取這個標志位還在不在, 如果這個標志位不在就說明已經按下有3S了.直接跳過這里.執行下一條命令;
                                                                    //如果這標志位還在就說明按下不到3S ,只能是短按,或者按下1S-3s之間.所以我們要來判斷ctrl_cnt的個數                                         
            {
                if(ctrl_cnt>=250)                        //判斷之前的計數是多少 如果大于250*4MS =1000MS 就是長按1S的動作,那么執行長按1s的程序就可以了
                {
                        ctrl_cnt=0;                        // 記得判斷后要立即清零
                        f_key_1s=1;                        //和f_key_3s一樣, 后面去讀取這個標志位 有就執行相應動作,沒有就不執行
                }
                else                                                //不大于1S就短按  我們執行短按的程序
                {
                        ctrl_cnt=0;
                        f_key_short=1;
                }
             }
             //敲重點因為前面判斷了f_key_ctrl標志位還在不在,所以判斷完以后一定要清零 ,并且清理的位置不能錯
             f_key_ctrl=0;                                // 清零長按標志位               
        }       
    }
    //
    if(f_key_ctrl)                                                // 這個長按只管3S的長按 1 S 的在彈起里面處理
    {
        ctrl_cnt++;                                        // 只要一讀取到f_key_ctrl為1 就開始++計數
        if(ctrl_cnt>=750)                                //計數到750*4ms=3000ms 就清零 說明長按3S時間到了
        {
                ctrl_cnt=0;                                // 清零計數
                f_key_ctrl=0;                                // 清零標志位
                f_key_3s=1;                                // 這個標志位是長按3s的標志位,你自己另外寫一個函數,然后來讀取這個標志位 為1就執行長按3S的動作
                                                                //否則就不執行
        }
     }
     else
     {
        ctrl_cnt=0;
     }
}
void WORK_APP(void)
{
        if(f_key_3s)                        //讀取上面按鍵的標志位 3S
        {
                // 自己添加相應的功能
        }
        else if(f_key_1s)                        // 讀取上面按鍵的標志位1s
        {
                // 自己添加功能
        }
        else if(f_key_short)                // 讀取上面短按標志位
        {       
                // 自己添加功能
        }
}
回復

使用道具 舉報

13#
ID:91521 發表于 2022-2-4 18:45 | 只看該作者
沒有各位想的那么復雜,一個While循環搞定
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品日韩欧美一区二区 | 日韩精品一二三区 | 欧美精品一区二区免费 | 久久国产精品-国产精品 | 国产乱码精品一区二区三区五月婷 | 在线看黄免费 | 日本亚洲欧美 | 好姑娘影视在线观看高清 | 色播视频在线观看 | 国产成人99久久亚洲综合精品 | 欧美一级α片 | 一区二区三| 国产在线a| 欧美韩一区二区 | 综合九九| 国产欧美精品一区 | 91欧美 | 九九亚洲 | 在线免费毛片 | 欧美黄色一级毛片 | 成人久久 | 精品99久久久久久 | 欧美福利视频一区 | 欧美黑人一级爽快片淫片高清 | 欧美成人精品欧美一级 | 久久99蜜桃综合影院免费观看 | 日日夜夜狠狠操 | 久久性色 | 午夜视频在线视频 | 欧美一级二级三级视频 | 秋霞影院一区二区 | 欧美激情一区二区三级高清视频 | 久久久免费 | 99久久久久久 | 国产91久久久久久久免费 | 日韩欧美高清 | 成人av一区二区三区 | 国产一级片精品 | 97国产超碰 | 国外成人在线视频网站 | 日韩欧美二区 |