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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機C語言單位切換鍵加長按開關機功能,如何實現?

  [復制鏈接]
跳轉到指定樓層
樓主
ID:686513 發表于 2023-1-4 13:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

想實現的功能:unit按鍵短按單位切換,長按3S開關機。
方法1:此鍵連到外部中斷IO口,開機時短按單位切換,長按時可以關機,關機時短按下降沿觸發外部中斷也可以開機,基本可以實現想要的功能。但在短按觸發外部中斷開機時,單位切換也會觸發一次,即關機前是單位1,短按開機后會到單位2。


方法2:就是如上圖連接,硬件觸發開機,unit鍵不連到外部中斷,普通按鍵接法,只負責短按單位切換,長按關機。關機短按UNIT可以開機,但也會出現單位觸發一次,現像與方法1一樣.  


以上兩種方法都是因為按下unit開機的同時,單位短按也執行了,這樣情況如何解決,各路大神快來幫幫小弟吧,這個問題困擾小弟好久了!


下面是單片機按鍵掃描程序:
void key_scan()
{
        static u8 state=S0,key_time,lastkey;
        u8 key;
       key=PD&0xFF;
         
  switch(state)   //檢測狀態                              
   {
    case S0:                                    
             if(key!= 0xFF) state = S1;  break;      
               
   case S1:                                   
           if(key==0xFF)        state = S0;               
          else                                 
             {
                 lastkey=key;
                 state=S2;
            }
          break;

   case S2:
    if(key==0xFF)
        {                        
           state = S0;                //判斷輸入是否為1,為1返回狀態0        
           switch(lastkey)
               {
                 case 0x7F:     執行短按任務         break;
                                                                                                        
                case 0xfe:      執行短按任務         break;         //unit短按單位切換
                                                                                    
               case 0xFB:       執行短按任務         break;
                                                                                                
               case 0xBF:       執行短按任務         break;

               case 0xF7:              執行短按任務         break;                        
                                                         
               case 0xEF:             執行短按任務         break;                        
                                         
              default:break;               
               }
       }                        
     else if(++key_time==200)
         {
            key_time=0;
            switch(key)
             {
               case 0xfe:    執行長按任務 break;         // unit不僅連到單片機普通IO,還連到外部中斷IO口,開機時長按關機,關機時短按下降沿觸發開機。
             }
            state=S3;                                                                                                        
         }      
        break;

  case S3:                                                  
            if(key==0xFF)   state=S0;                                 
      else if(++key_time==5)                                 //否則開始計時,計時結束按鍵連擊
             {
               key_time=0;
               switch(key)
                {
                   case 0x7F:      執行連擊任務         break;        
                                                                                                               
                  case 0xFB:      執行連擊任務         break;                                                                                                                                                                                                                                                                                                                                                 }
              }
      break;
  }
}

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

使用道具 舉報

沙發
ID:686513 發表于 2023-1-4 14:11 | 只看該作者
之前也有幾位大神指點過,但自己太愚笨,沒能實現!
回復

使用道具 舉報

板凳
ID:863657 發表于 2023-1-4 17:01 | 只看該作者
整幾個按鍵狀態,LASTKEY 、NOWKEY,用定時器判斷,只有超過500ms才可以給按鍵狀態賦值,這樣長按和短按可以分開來
回復

使用道具 舉報

地板
ID:1060328 發表于 2023-1-4 18:53 | 只看該作者
每次判斷按鍵按下就觸發定時器TRx=1,并賦初值,再加一個flag計數,再判斷按鍵彈起,若定時溢出就開關機,若沒有進入定時中斷就功能切換
回復

使用道具 舉報

5#
ID:686513 發表于 2023-1-5 09:33 | 只看該作者
hjc5035 發表于 2023-1-4 18:53
每次判斷按鍵按下就觸發定時器TRx=1,并賦初值,再加一個flag計數,再判斷按鍵彈起,若定時溢出就開關機, ...

這個方法可行,有沒有例程,發我一下參考,多謝!
回復

使用道具 舉報

6#
ID:686513 發表于 2023-1-5 09:37 | 只看該作者
zhaomin253 發表于 2023-1-4 17:01
整幾個按鍵狀態,LASTKEY 、NOWKEY,用定時器判斷,只有超過500ms才可以給按鍵狀態賦值,這樣長按和短按可 ...

長按,短按或短按,連按倒都還好區分,但短按,長按,連按三個放在一起都不太好區分吧?(連按大多是在長按的基礎上觸發連按)
回復

使用道具 舉報

7#
ID:301191 發表于 2023-1-10 14:57 | 只看該作者
頂一下
回復

使用道具 舉報

8#
ID:1056056 發表于 2023-1-10 15:08 | 只看該作者
弄一個變量判斷開關機狀態即可
回復

使用道具 舉報

9#
ID:401564 發表于 2023-1-10 19:59 | 只看該作者
這是當初我學單片機的時候寫的,長按和雙擊,定時器開啟中斷
通過在主程序判斷標志位來檢測是長按還是雙擊,并調用函數,在調用的函數中清除對應的標志位
大概是這樣的
void one_pre_disp()                                                //單擊按鍵處理
{       
        ONE_PRE=0;

...............
}
Timer0_Key.rar (1.33 KB, 下載次數: 10)



回復

使用道具 舉報

10#
ID:67199 發表于 2023-1-10 20:31 | 只看該作者
單一執行,設置一個狀態變量,根據當前狀態結合按鍵狀態,進行下一步操作。個人喜歡按下則開啟定時器計數,松開停止,超過多少時間為判定長按判斷。
回復

使用道具 舉報

11#
ID:213173 發表于 2023-1-11 07:36 | 只看該作者
zhth1979 發表于 2023-1-5 09:37
長按,短按或短按,連按倒都還好區分,但短按,長按,連按三個放在一起都不太好區分吧?(連按大多是在長 ...

其實一鍵開關機不需要這么復雜的硬件電路。利用單片機休眠功能即可解決。初次上電自動開機,P3.2作為普通按鍵使用,短按切換菜單,長按執行菜單下不同任務。只要再加一項菜單,長按打開外部中斷,執行睡眠即可關機。在睡眠狀態由外部觸發喚醒,關閉外部中斷,恢復P3.2作為普通按鍵使用。最多只要在P3.2外接一個1K電阻和1個104電容硬件消抖。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人99久久亚洲综合精品 | 久久免费视频观看 | 久久国产一区 | 亚洲高清av在线 | 亚洲精品中文在线 | 91麻豆精品国产91久久久久久 | 国产欧美精品区一区二区三区 | 久国产精品 | 综合色在线 | 国产精品1区2区3区 国产在线观看一区 | 亚洲视频一区在线观看 | 国产精品一区在线 | 91久久久久久久 | 麻豆一区二区三区 | 在线观看日本网站 | 国产高潮好爽受不了了夜夜做 | 视频一区 国产精品 | 久久久久国产精品一区二区 | 国产精品免费高清 | 精品中文字幕久久 | 91社区在线观看播放 | 国产精品美女久久久 | 夜夜爽99久久国产综合精品女不卡 | 日日骚av| 亚洲高清在线 | 性欧美精品一区二区三区在线播放 | 国产免费让你躁在线视频 | 91婷婷韩国欧美一区二区 | 婷婷久久一区 | 日一区二区三区 | 天天影视综合 | 超碰成人在线观看 | 亚洲一二三区免费 | 欧美一级在线观看 | 99热在线观看精品 | 婷婷狠狠 | 最新中文字幕在线 | 久久久久黄 | 亚洲欧美另类在线 | 日韩在线看片 | 日韩在线 |