找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1645|回復: 4
打印 上一主題 下一主題
收起左側(cè)

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

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

                 switch(key)
                   {
                      case 0x7F:     執(zhí)行短按任務;          break;                                                                                                        
                      case 0xfe:      執(zhí)行短按任務;          break;        
                      case 0xFB:     執(zhí)行短按任務;          break;
                      case 0xBF:     執(zhí)行短按任務;          break;               
                      case 0xF7:          執(zhí)行短按任務;          break;                                
                      case 0xEF:          執(zhí)行短按任務;          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:   此鍵執(zhí)行長按任務 ;    break;                                                
                        }                                                
                    }
               else if (++cnt>=200)       //連按
                        {
                            cnt = 190;               //100ms觸發(fā)一次
                         switch(key)
                           {
                              case 0x7F:     執(zhí)行連按任務;          break;                             
                              case 0xFB:     執(zhí)行連按任務;          break;                                                                                       
                          default:break;               
                        }                           
          break;        
                                                                                                
         }
}        

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

使用道具 舉報

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

回復

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表