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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機按鍵長按 短按 和連發程序還是有問題,請大家賜教,不勝感激

[復制鏈接]
跳轉到指定樓層
樓主
ID:686513 發表于 2022-12-3 15:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我需要長按 短按 和連發(連按一直加或減)三個功能,之前發過一        貼,長按后會跟隨一次短按,現在我又加了一個狀態,現在連短按都不對了,請大師們賜教,不勝感激!               
#define PD 0x22|(P1&0x51)|(P2<<1&0x80)|(P3<<2&0x0c)   //P1.0/P3.0 p3.1/P4.2 p4.3組合5個按鍵為1個字節數據
單片機源程序如下:
/*******************************************************************************
* 文件名:按鍵函數
* 描  述: 放入定時器10ms掃描一次
* 功  能:
* 參  數:無
*******************************************************************************/        
void key_scan()
{
        static u8 cnt ;
        static u8 state=S0;
        u8 key;                 
  key = PD&0xFF;                                
  switch(state)   //檢測狀態                              
   {
        case S0:                                          //狀態0
      if(key!= 0xFF) state = S1; break;        //判斷輸入是否為0,為0轉入狀態1      
               
   case S1:                                             //狀態1
      if(key==0xFF) state = S0;                //判斷輸入是否為1,為1返回狀態0
      else                                              //否則,轉入狀態2,執行按鍵程序
        {
         state=S2;
         }
       break;
case S2:                                                 //狀態2
        if(key != 0xff)                            //還是按下的狀態     
           {
            state = S3;
             }
        else                                        //松開了,短按
             {  

                 switch(key)
                   {
                      case 0x7F:     執行短按任務;          break;                                                                                                        
                      case 0xfe:      執行短按任務;          break;        
                      case 0xFB:     執行短按任務;          break;
                      case 0xBF:     執行短按任務;          break;               
                      case 0xF7:          執行短按任務;          break;                                
                      case 0xEF:          執行短按任務;          break;                                                                        
                         default:break;               
                      }                           
              }                                          
          break;        
                                                
                                                                                
        case S3:    //判斷長按短按
               if(key != 0xff)
                {
                if(++cnt > 150)           //1500ms
                   {
                   cnt = 190;
                    state = S4;                                                        
                  }
            }
               
            break;
                                
  case S4:       //長按松手檢測
                if(key == 0xff)   //松開了
                   {
                    cnt = 0;                                         
                     switch(key)
                        {         
                          case 0xfe:   此鍵執行長按任務 ;    break;                                                
                        }                                                
                    }
               else if (++cnt>=200)       //連按
                        {
                            cnt = 190;               //100ms觸發一次
                         switch(key)
                           {
                              case 0x7F:     執行連按任務;          break;                             
                              case 0xFB:     執行連按任務;          break;                                                                                       
                          default:break;               
                        }                           
          break;        
                                                                                                
         }
}        

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

使用道具 舉報

沙發
ID:213173 發表于 2022-12-3 20:37 | 只看該作者
給你一個示例參考 4位冒號數碼管時鐘 單鍵調時 仿真.rar (129.93 KB, 下載次數: 34)

回復

使用道具 舉報

板凳
ID:686513 發表于 2023-1-7 08:27 | 只看該作者
wulin 發表于 2022-12-3 20:37
給你一個示例參考

豐常感謝,但這個鍵只能識別短按和連按,我想實現一個鍵有短按,長按和連按的功能,如短按選項,連按連續加1,我還要增加一個長按關機,就不好實現了!
回復

使用道具 舉報

地板
ID:130230 發表于 2023-1-9 11:31 | 只看該作者
回復

使用道具 舉報

5#
ID:213173 發表于 2023-1-9 14:16 | 只看該作者
zhth1979 發表于 2023-1-7 08:27
豐常感謝,但這個鍵只能識別短按和連按,我想實現一個鍵有短按,長按和連按的功能,如短按選項,連按連續 ...

其實所謂連按就是長按,區別就在于長按執行一次任務,連按重復執行相同任務。例如K1短按進入菜單,再次短按選擇菜單,......,直到退出。長按關機,K2、K3在菜單界面短按為+/-,長按為+++/---。但要在一個鍵里實現短按,長按和連按的功能有點麻煩。例如K1長按關機,短按選擇菜單。在菜單狀態短按為+1,直至允許的最大值后歸0,長按為連加+,直至允許的最大值后歸0。再次短按切換菜單選項,直至短按退出菜單。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品久久久久 | 一区二区三区免费在线观看 | 欧美v免费 | 欧美一区精品 | 久久精品国产一区二区电影 | 国产亚洲一区二区三区 | 日韩av在线一区二区 | 伊人网站在线观看 | 久久精品日产第一区二区三区 | 国产va| 一区在线视频 | 国产精品久久久久久久久久久新郎 | 精品欧美一区二区精品久久久 | 日韩激情在线 | 精品久久久久久红码专区 | 精品国产欧美一区二区三区成人 | 七七婷婷婷婷精品国产 | 日韩成人在线视频 | 久久久久九九九女人毛片 | 久久久久一区 | 亚洲视频第一页 | 欧美性视频在线播放 | 精品九九九 | 日韩精品久久久久久 | 日韩午夜在线播放 | 午夜精品一区二区三区在线视频 | 91精品国产91久久久久久不卞 | 欧美国产精品一区二区三区 | 欧美精品在线一区二区三区 | 热re99久久精品国99热观看 | 国产欧美日韩一区二区三区在线 | 在线中文字幕亚洲 | 韩国欧洲一级毛片 | 国产精品18久久久久久白浆动漫 | 毛片免费在线 | 国产精品夜夜夜一区二区三区尤 | 美女久久| 国产乱码精品1区2区3区 | 成人av电影免费在线观看 | 国产 欧美 日韩 一区 | 久久久蜜桃一区二区人 |