<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. 電子開發(fā)網(wǎng)

      電子開發(fā)網(wǎng)電子設(shè)計(jì) | 電子開發(fā)網(wǎng)Rss 2.0 會(huì)員中心 會(huì)員注冊(cè)
      搜索: 您現(xiàn)在的位置: 電子開發(fā)網(wǎng) >> 電子開發(fā) >> EDA開發(fā)應(yīng)用 >> Keilc >> 正文

      Keil C51鍵盤譯碼程序

      作者:佚名    文章來源:本站原創(chuàng)    點(diǎn)擊數(shù):    更新時(shí)間:2008-11-21

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

      /***************************
      根據(jù)硬件電路不同,只修改這段程序即可!!!
      ***************************/
      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++;
          }
      }

      /***************************
      延時(shí)去抖動(dòng)
      ***************************/
      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;//定義標(biāo)志
          }else{
          if(0==-KeyDat.KeyDog){ //3秒延時(shí)到
          KeyDat.KeyDog=Timer100ms;
          KeyDat.KeyPower++;
          }
          }
      }

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

      /***************************
      用戶在功能函數(shù)中調(diào)用,返回鍵處理后清除鍵值
      ***************************/
      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;//延時(shí)
        unsigned char KeyData;//鍵值
      }KEY;

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

      還可以輸入 200 個(gè)字
      [ 查看全部 ] 網(wǎng)友評(píng)論
      推薦文章
      最新推薦
      熱門文章
      關(guān)于我們 - 聯(lián)系我們 - 廣告服務(wù) - 友情鏈接 - 網(wǎng)站地圖 - 版權(quán)聲明 - 在線幫助 - 文章列表
      返回頂部
      刷新頁面
      下到頁底
      晶體管查詢
      主站蜘蛛池模板: 久久婷婷五月综合色精品| 一本色综合网久久| 狠狠色丁香婷婷综合久久来来去| 亚洲av无码国产综合专区| 小说区图片区综合久久88| 激情综合色五月丁香六月亚洲| 亚洲精品天天影视综合网| 天天综合网色中文字幕| 伊人久久大香线蕉综合5g| 丁香婷婷亚洲六月综合色| 国产综合无码一区二区三区| 色综合久久夜色精品国产| 狠狠色丁香婷婷久久综合不卡 | 久久久久久久尹人综合网亚洲| 国产91色综合久久免费分享| 九月婷婷亚洲综合在线| 色综合久久一本首久久| 久久综合给久久狠狠97色| 国产综合一区二区在线观看| 亚洲综合一区二区| 中文字幕亚洲综合久久菠萝蜜| 综合欧美五月丁香五月| 天天久久影视色香综合网| 色综合色综合色综合色欲| 亚洲综合精品香蕉久久网| 一本久久综合亚洲鲁鲁五月天| 97久久天天综合色天天综合色| 亚洲av伊人久久综合密臀性色| 激情综合色综合久久综合| 中文字幕乱码人妻综合二区三区| 亚洲伊人久久综合影院| 亚洲情综合五月天| 亚洲综合婷婷久久| 在线综合亚洲欧洲综合网站| 99久久国产综合精品五月天| 久久天堂av综合色无码专区| 天天躁日日躁狠狠躁综合| 丁香五月天综合缴情网| 久久丁香五月天综合网| 综合五月激情二区视频| 五月婷婷开心综合|