<li id="8g3ty"><tbody id="8g3ty"><th id="8g3ty"></th></tbody></li>
    <label id="8g3ty"><samp id="8g3ty"></samp></label>
  • <span id="8g3ty"></span>

    1. <center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
    2. <bdo id="8g3ty"><meter id="8g3ty"><bdo id="8g3ty"></bdo></meter></bdo><center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
      <label id="8g3ty"><samp id="8g3ty"></samp></label>

    3. 電子開發網

      電子開發網電子設計 | 電子開發網Rss 2.0 會員中心 會員注冊
      搜索: 您現在的位置: 電子開發網 >> 電子開發 >> EDA開發應用 >> Keilc >> 正文

      Keil C51鍵盤譯碼程序

      作者:佚名    文章來源:本站原創    點擊數:    更新時間:2008-11-21

        鍵盤譯碼程序是開發項目中最常用到的程序,它的好壞,直接影響著整個程序!現在介紹一個使用非常廣泛的Keil C51鍵盤譯碼程序。
       在主程序中不斷調用KeyBord(),可以不停地掃描鍵盤!
       在功能子程序中調用:unsigned charJB_KeyData(),得到鍵值
      #define TK  8         //主程序執行時間8ms
      #define Timer20ms  (30/TK)   //延時時間20ms
      #define Timer2S     (1200/TK) //延時時間2S
      #define Timer100ms   (1000/TK)  //延時時間100ms
      #define Port P2 //鍵盤口
      //****************************
      KEY  KeyDat;        //定義數據結構
      //---------------------------
      //5個開關占用的IO腳
      //---------------------------
      sbit ko=Port^0;
      sbit ka=Port^1;
      sbit kb=Port^2;
      sbit kc=Port^3;
      sbit kd=Port^4;

      /***************************
      根據硬件電路不同,只修改這段程序即可!!!
      ***************************/
      unsigned char ReadKey(void){
          ko=0;
          if(!ka) return 2;//Ka
          if(!kb) return 3;//Kb
          if(!kc) return 4;//Kc
          if(!kd) return 5;//Kd
          return 0;
      }

      /***************************
      判別是否有建
      ***************************/
      void GetKey(void){
          if(ReadKey()!=0){
          KeyDat.KeyDog=Timer20ms;
          KeyDat.KeyPower++;
          }
      }

      /***************************
      延時去抖動
      ***************************/
      void KeyDog(void){
          if(0==-KeyDat.KeyDog){
          KeyDat.KeyData=ReadKey(); //讀鍵盤
          if(KeyDat.KeyData!=0){
          KeyDat.KeyPower++;
          KeyDat.KeyDog=Timer3S;
      /***************************
      //    BeepPower=1;//蜂鳴器短鳴
      ***************************/
          }else{
          KeyDat.KeyPower=0:
          KeyDat.KeyData=0;    //返回
          }
        }
      }

      /***************************
      判別是否松開
      ***************************/
      void KeyOff1(void){
        if(ReadKey0==0){    //松開按鍵
          KeyDat.KeyPower=0;
          KeyDat.KeyData |=HaveKey;//定義標志
          }else{
          if(0==-KeyDat.KeyDog){ //3秒延時到
          KeyDat.KeyDog=Timer100ms;
          KeyDat.KeyPower++;
          }
          }
      }

      /***************************
      連擊是否松開
      ***************************/
      void KeyOff2(void)
      {
          if(ReadKey()!=0){
          if (0==--KeyDat.KeyDog){
          KeyDat.KeyData |=DubClick | HaveKey;  //連擊標志
          KeyDat.KeyDog=Timer100ms;
      /***************************
      //    BeepPower=1;//發送蜂鳴器短鳴命令
      ***************************/
          }
          }else{
          KeyDat.KeyData=0;  //?|=HaveKey;//一次按鍵
          KeyDat.KeyPower=0;
          }
      }
      /***************************
      函數指針定義
      ***************************/
      code void(code *SubKey[])()={
          GetKey,KeyDog,KeyOff1,KeyOff2
      };
      /***************************
      鍵處理程序用戶在主程序只需不斷調用它!
      ***************************/
      void KeyBord(void){
         (*SubKey[KeyDat.KeyPower])();

      /***************************
      用戶在功能函數中調用,返回鍵處理后清除鍵值
      ***************************/
      unsigned char JB_KeyData(void){
          unsigned char i=0;
          if (KeyDat.KeyData>DubClick){
          i=KeyDat.KeyData;
          KeyDat.KeyData=0;
          }
          return i;
      }

      以下是頭文件:
      /***************************
      鍵盤的鍵值定義
      ***************************/
      #define DubClick 0x40    //連擊
      #define HaveKey 0x80    //有鍵
      #define SeeKey (0x01|HaveKey)
      #define SetKey (0x02|HaveKey)
      #define RRKey (0x03|HaveKey)
      #define UpKey (0x04|HaveKey)
      #define RetKey (0x05|HaveKey)
      #define RLKey (0x02|HaveKey)

      //#define UseKey (0x06|HaveKey)
      #define SeeKey_Dub (SeeKey | DubClick | HaveKey)
      #define SetKey_Dub (SetKey | DubClick | HaveKey)//雙擊
      #define RRKey_Dub (RRKey | DubClick | HaveKey)
      #define UpKey_Dub (UpKey | DubClick | HaveKey)
      #define RetKey_Dub (RetKey | DubClick | HaveKey)
      //#define UseKey_Dub (UseKey | DubClick | HaveKey)

      //--------------------------
      typedef struct{
        unsigned char KeyPower;  //命令字
        unsigned int KeyDog;//延時
        unsigned char KeyData;//鍵值
      }KEY;

      Tags:Keil C51,鍵盤,譯碼程序  
      責任編輯:admin
      請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
      1分 2分 3分 4分 5分

      還可以輸入 200 個字
      [ 查看全部 ] 網友評論
      推薦文章
      最新推薦
      熱門文章
      關于我們 - 聯系我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
      返回頂部
      刷新頁面
      下到頁底
      晶體管查詢
      主站蜘蛛池模板: 亚洲色偷偷偷综合网| 色综合视频一区二区三区| 久久91精品久久91综合| 婷婷综合久久中文字幕蜜桃三电影 | 色综合67194| 色综合久久一区二区三区| 亚洲国产免费综合| 亚洲色欲啪啪久久WWW综合网 | 亚洲国产精品成人综合久久久| 亚洲国产成人久久综合| 亚洲综合最新无码专区| 伊人yinren6综合网色狠狠| 国产成人久久精品77777综合| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 国产亚洲综合一区柠檬导航| 亚洲色偷偷综合亚洲AV伊人蜜桃| 中文自拍日本综合| 丁香五月天综合缴情网| 另类小说图片综合网| 色综合久久久久网| 久久影院综合精品| 色综合色综合色综合色欲| 国产精品综合AV一区二区国产馆| 狠狠色综合久色aⅴ网站| 区二区三区激情综合 | 婷婷亚洲综合五月天小说在线| 色综合天天综合给合国产| 国产亚洲综合色就色| 亚洲av一综合av一区| 亚洲综合另类小说色区| 亚洲综合精品香蕉久久网| 久久无码无码久久综合综合| 狠狠色噜噜狠狠狠狠色综合久| 色婷婷久久综合中文久久蜜桃| 97久久天天综合色天天综合色hd| 亚洲综合无码一区二区| 国产色综合一区二区三区| 久久综合九色综合欧洲| 亚洲综合男人的天堂色婷婷| 丁香婷婷亚洲六月综合色| 亚洲综合av一区二区三区|