<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        自寫單片機按鍵松手檢測思路

        作者:小強   來源:本站原創   點擊數:  更新時間:2014年04月09日   【字體:

        一直以來,單片機松手檢測用的都是while(key==0);  這樣,不但浪費CPU 資源,還。。。所以,用松手檢測 是非常好的,很時髦的。
        下面是我晚上做了個小車總結出來的,可以單獨的按鍵,不影響其他按鍵,幾通道都可以。 貼上程序,最后分析整個程序意思。。

         /*----------------------------------------------------------------
         * 文 件 名:KEY.C
         * 芯    片:STC12C5A60S2
         * 晶    振:11.0592MHz
         * 創 建 者:小強
         * 創建日期:2012.3.23
         * 修 改 者:
         * 修改日期:
         * 聯系作者:lyg407@126.com   QQ:5163-806-35
         * 功能描述:按鍵掃描
        -------------------------------------------------------------*/
        //按鍵掃描
        uchar key_scan()
        {
         //前進后退左轉右轉 按鍵
         if(key_up&&(key1==0||key2==0||key3==0||key4==0))   //第一次 key_up=1 那么如果其它按鍵有按下,則為真 執行下面程序
         {
          delay_10ms();         //延時去抖
          if(key_up&&(key1==0||key2==0||key3==0||key4==0))   //再次判斷
          {
           key_up=0;  //松手標志為0 那么下次在檢測, if 結果就為0 則不會則行這里語句
         
           key_down=1;  //按鍵被按下標志。    最后如果 按鍵松手 那么還應該發送一個數據過去,執行關閉
         
           if(key1==0)  //如果按鍵1 按下
            return 1;
           if(key2==0)
            return 2;
           if(key3==0)
            return 3;
           if(key4==0)
            return 4;
          } 
         }
         else
         if(key1==1&&key2==1&&key3==1&&key4==1)   //如果所有按鍵都沒有按下。。注意 所有按鍵都沒按下
         {
          key_up=1;  //必須所有按鍵 沒有按下  松手標志 初始化
             if(key_down==1)   //這里判斷 是否按鍵 按下過, 按下過 就發送一個數據過去, 關閉之前輸出的。
          {
           key_down=0;   //初始化
           return 99;    //返回值  隨意更改
          }
         }
         //第二個 獨立按鍵
         if(flag2_up&&(key5==0))    //意思同上 
         {
          delay_10ms();     //延時去抖
          if(flag2_up&&(key5==0))    //在判斷
          {
           flag2_up=0;
           flag2_down=1;   //意思同上
         
           if(key5==0)
           {
            return 5; 
           }
          }
         }
         else
         if(key5==1)
         {
          flag2_up=1;  //必須所有按鍵為1 沒有按下  松手標志為1
             if(flag2_down==1)
          {
           flag2_down=0;
           return 95;
          }
         }
         //第3個獨立 按鍵
         if(flag3_up&&(key6==0))     //意思同上
         {
          delay_10ms();
          if(flag3_up&&(key6==0))
          {
           flag3_up=0;
           flag3_down=1;   //意思同上
         
           if(key6==0)
           {
            return 6; 
           }
          }
         }
         else
         if(key6==1)
         {
          flag3_up=1;  //必須所有按鍵為1 沒有按下  松手標志為1
             if(flag3_down==1)
          {
           flag3_down=0;  //意思同上
           return 96;
          }
         }
         return 0;
        }
        // 返回的按鍵 做的處理,執行什么功能。。串口輸出數據
         key_num=key_scan();  //讀取 按鍵掃描返回值
          switch(key_num) //判斷
          {
           case 1:
           UART1_Send_Byte(0x11);  //前進
           break;
           case 2:
           UART1_Send_Byte(0x22);  //后退
           break;
           case 3:
           UART1_Send_Byte(0x33); //左轉
           break;
           case 4:
           UART1_Send_Byte(0x44);  //右轉
           break;
           case 5:
           UART1_Send_Byte(0x55);  //按鍵5  控制輸出1
           break;
           case 6:
           UART1_Send_Byte(0x66);  //按鍵6  控制輸出2
           break;
           case 95:
           UART1_Send_Byte(0x95);  //按鍵5  松手后 發送一個數據過去
           break;
           case 96:
           UART1_Send_Byte(0x96);  //按鍵6  松手后 發送一個數據過去
           break;
           case 99:
           UART1_Send_Byte(0x99);   // 小車 前進后退 左轉 右轉  按鍵松手后 發送一個停止信號   。。。
           break;
          }
        //上面是整個發送部分,有按鍵掃描  判斷 發送數據
         
        //下面是接收解碼部分
         
        value=SBUF; //value等于串口接收的字節;
         
        switch(value)  //判斷接收到的數據
          {
           case 0x11:  //執行前進
           go();
           break;
           case 0x22: //執行后退
           back();
           break;
           case 0x33:  //執行左轉函數
           left();
           break;
           case 0x44:  //執行右轉函數
           right();
           break;
           case 0x99: //執行 停止 函數
           stop();
           break;
           case 0x55:  //輸出 控制1  打開
           out1=0;
           break;
           case 0x95: // 控制1 關閉
           out1=1;
           break;
           case 0x66: //輸出控制2 打開
           out2=0;
           break;
           case 0x96:  //控制2 關閉
           out2=1;
           break;
          }
          
         
        OK, 下面整個程序意思分析: 遙控檢測按鍵 是否有按鍵 按下,如果有按鍵按下,發送一個前進 0x11過去,接收機 接收到了11 執行前進函數。 那么此時 前進按鍵 一直按著 則后 左 右 按鍵 按不起作用,因為這幾個共用一個按鍵按下標志, 但是 按鍵5 按鍵 6 是在單獨一個松手檢測程序里,所以,此時 按鍵5 按鍵6 隨意觸發的。 當前進 按鍵松手后, 松手down=1 則執行一次 返回99, 這個時候串口又發送一個 99  停止函數過去,小車停止。 。 不知道這樣是不是有點繁瑣,但是目前沒有其它的好思路,解決這樣的幾個獨立按鍵,按下,松手檢測。 這樣好處是,每次只發送一次數據過去,通訊不是那么頻繁,響應能快一些。 這個就是整個思路,如果有什么問題可以提問哦~   ^_^    又忘記要早點睡覺了。。

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮