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

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

        單片機按鍵處理程序(長按 短按 松手檢測)

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

        一個很精妙的單鍵程序:

         bit flag=0; 定義標志
        以下是鍵盤處理程序:
        void scankey()   //掃描按鍵
        {

        if(p10= =0&&flag= =0)  //p10口按鍵及處理程序,其中flag如果為1就不用再掃描    就是這里,沒有消抖動了~是怎么回事咧
        {
        delay(10);
        flag=1;
        delay(5);
        }
        if(p10= =1&&flag= =1)  //如果p10為1,flag為1說明已經被按下并抬起
        {
        TR0=!TR0;    //松開時相應
        flag=0;    //標志清零,為下次按鍵做準備(其實為一次處理)
        }
        }

        以下是另一個一個檢測的主要部分:

        #include <reg51.h>
        #include <intrins.h>
        #define key_port P0    //鍵盤接口定義
        sbit key_port_0=key_port^0;
        sbit key_port_1=key_port^1;
        sbit key_port_2=key_port^2;
        sbit key_port_3=key_port^3;


        if(Key_down==PRESSED)
        {
             while(Key_down==PRESSED)          //計數,用來判斷是長按還是短按
             {
         
              if( (counter++) > Long_cnt) //counter>65534:長按,
                {
             Key_Code=KEY_FP_DOWN;             //KEY1長按時返回的鍵值
            // counter=0;
                   return;
                }
             }
             if(counter<=Long_cnt && counter>Short_cnt)   //counter<=65534:短按,counter>20:消抖動
             {   
            
              Key_Code=KEY_FP_DOWN;             //KEY1短按時返回的鍵值
           // counter=0;
                   return;       
             }
        }
         

        以下程序可以作為一個單獨的 key.c 文件包含在項目里面:

        #define KEYDELAY 25    /*首鍵延遲次數*/
        #define KEYLOOP 10    /*連續鍵間隔次數,需小于KEYDELAY*/
        unsigned char key_bak;
        unsigned char key_temp;
        unsigned char key_old;
        unsigned char key_data;
        bit key_ok;
            //  P1口行列式鍵盤  //
        #define KEYPIN_L  P1               // 定義鍵掃描列端口為 P1低四位輸入  //
        #define KEYPIN_H  P1              // 定義鍵掃描行端口為 P1高四位掃描輸出  //
            //內部私有函數  //
        unsigned char fnKeycode(unsigned char key);     //  根據鍵盤映射表輸出順序鍵值            //
            //  P1口行列式鍵盤  //
        //---------------------------------------------------------------------------//
        void KeyScan(void)                    //鍵掃描
            {
            unsigned char sccode,recode;
            KEYPIN_L = KEYPIN_L|0x0f;                    //  P1低四位為列線輸入         //
            KEYPIN_H = KEYPIN_H&0x0f;                    //  P1高四位為行線發全零掃描碼 //
            if ((KEYPIN_L&0x0f) !=  0x0f)    //有鍵按下
                {
                key_temp = 鍵值;             //鍵掃描,獲得鍵值
                if (key_temp == key_bak)
                    {
                    key_old++;
                  //  if (key_old==KEYDELAY)                //連續鍵,不要則把此if屏蔽
                     //   {
                       // key_ok=1;
                      //  key_data=fnKeycode(key_temp);    //鍵*
                       // key_old=KEYDELAY-KEYLOOP;
                  //  }
                }
                else
                    {
                    key_old=0;
                    key_bak=key_temp;
                }
            }
            else                            //鍵抬起
                {
                if (key_old)
                    {
                    key_ok=1;
                    key_data=fnKeycode(key_temp);    //鍵*
        /*      //      if (key_old==100)                //加上時間,不同時間不同功能,與連續鍵沖突
                    //    {
                   //     bp(1);
                   //     key_data    +=    0x10;
                 //  }
                  //  if (key_old==200)
                  //      {
                   //     bp(2);
                    //    key_data    +=    0x20;
                 //   }
        */
                //}
                key_old=0;
            }
            KEYPIN_H = KEYPIN_H|0xf0;
        }
        //---------------------------------------------------------------------------//
        unsigned char KeyGetcode(void)        //返回按鍵碼
        {
            key_ok=0;
            return(key_data);
        }
        bit KeyTest(void)                //檢查有無按鍵
        {
            KeyScan();            //鍵掃描
            return(key_ok);
        bit flag=0; 定義標志
        以下是鍵盤處理程序:
        void scankey()   //掃描按鍵
        {
        if(p10= =0&&flag= =0)  //p10口按鍵及處理程序,其中flag如果為1就不用再掃描    就是這里,沒有消抖動了~是怎么回事咧
        {
        delay(10);
        flag=1;
        delay(5);
        }
        if(p10= =1&&flag= =1)  //如果p10為1,flag為1說明已經被按下并抬起
        {
        TR0=!TR0;    //松開時相應
        flag=0;    //標志清零,為下次按鍵做準備(其實為一次處理)
        }
        }

        關閉窗口

        相關文章

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