日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

機電之家資源網(wǎng)
單片機首頁|單片機基礎|單片機應用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓信息
贊助商
單片機與鍵盤接口程序
單片機與鍵盤接口程序
 更新時間:2008-8-17 19:45:46  點擊數(shù):20
【字體: 字體顏色

壓鍵計數(shù)器清零
        else{
            PS2CLOCK = 0;//阻止PS2鍵盤立即回送數(shù)據(jù)
          PS2Buffers.PS2KeyPopError = 0xaa;//出錯碼
          for (i = 0; i < 20; i++){
            if (key == (PS2TAB[i])){//搜索
              key = i + 1;
              if (PS2Buffers.PS2KeyExtFlage == 0xf0){
                key = 0x80;//鍵釋放
                PS2Buffers.PS2KeyPushCount = 0;//長壓鍵計數(shù)器清零
                PS2Buffers.PS2KeyMessage = key;//存入當前鍵值并執(zhí)行命令
              }
              else{
                if (key != PS2Buffers.PS2KeyVal){//換了一個鍵
                  PS2Buffers.PS2KeyPushCount = 0;//長壓鍵計數(shù)器清零
                  PS2Buffers.PS2KeyMessage = key;//存入當前鍵值并執(zhí)行命令
                }
                else{//未換鍵
                  PS2Buffers.PS2KeyPushCount ++;//長壓鍵計數(shù)器計數(shù)
                  if (PS2Buffers.PS2KeyPushCount > DEFPS2PUSHCOUNT){//長壓時間到
                    PS2Buffers.PS2KeyMessage = key 0x40;//存入當前鍵值并執(zhí)行命

                    PS2Buffers.PS2KeyPushCount = 0;//長壓鍵計數(shù)器清零
                  }
                }
              }
              PS2Buffers.PS2KeyVal = key;//存入當前鍵值值1~20或0x80+(1~20)
              PS2Buffers.PS2KeyTemp = 0;//鍵碼移位記錄器
              PS2Buffers.PS2KeyExtFlage = 0;//擴展鍵標志
              PS2Buffers.PS2KeyPopError = 0;//鍵釋放標志或出錯碼
              break;
            }
          }
          if (PS2Buffers.PS2KeyPopError) PS2Buffers.PS2KeyPushCount = 0;//長壓鍵
計數(shù)器清零
          PS2CLOCK = 1;//釋放PS2時鐘總線
        }
      }
    }
    else PS2Buffers.PS2KeyPopError = 0xed;//置停止位錯誤號0xed
  }
  else PS2Buffers.PS2KeyCount = 0;//PS2鍵盤出錯
}
/*------------------------------------------------------------------
         利用函數(shù)指針數(shù)組運行PS2鍵盤散轉(zhuǎn)命令
-------------------------------------------------------------------*/
void PS2CommandExec(unsigned char key)
{
unsigned int i;
code void *funcpushbuffers[] = {//命令散轉(zhuǎn)表(匯編中的16個DW)
/*------------------------------------------------------------------
         15個壓鍵、放鍵及長壓鍵事件處理函數(shù)指針地址
-------------------------------------------------------------------*/
  (void *)ClrWdt            + 0x0000,
/*---------------------------------------------
           10個功能鍵壓鍵事件處理(獨立管理)
----------------------------------------------*/
  (void *)PS2F1KeyPush      + 0x5b7d,      //功能鍵F1壓鍵事件處理
  (void *)PS2F2KeyPush      + 0xa6ea,      //功能鍵F2壓鍵事件處理
  (void *)PS2F3KeyPush      + 0xf157,      //功能鍵F3壓鍵事件處理
  (void *)PS2F4KeyPush      + 0x4cc4,      //功能鍵F4壓鍵事件處理
  (void *)PS2F5KeyPush      + 0x9731,      //功能鍵F5壓鍵事件處理
  (void *)PS2F6KeyPush      + 0xe2ae,      //功能鍵F6壓鍵事件處理
  (void *)PS2EnterKeyPush   + 0x3d1b,      //功能鍵Enter壓鍵事件處理
  (void *)PS2EscKeyPush     + 0x8888,      //功能鍵Esc壓鍵事件處理
  (void *)PS2BkspKeyPush    + 0xd3f5,      //功能鍵Bksp壓鍵事件處理
  (void *)PS2KpKeyPush      + 0x2e62,      //功能鍵Kp壓鍵事件處理
/*---------------------------------------------
           2個放鍵事件處理(集中管理)
----------------------------------------------*/
  (void *)PS2NumberKeyPop   + 0x79df,      //數(shù)字鍵放鍵事件處理
  (void *)PS2FuncKeyPop     + 0xc44c,      //功能鍵放鍵事件處理
/*---------------------------------------------
           2個長壓鍵事件處理(集中管理)
----------------------------------------------*/
  (void *)PS2NumberKeyPushL + 0x1fb9,      //數(shù)字鍵長壓鍵事件處理
  (void *)PS2FuncKeyPushL   + 0x6a26,      //功能鍵長壓鍵事件處理
/*---------------------------------------------
           1個數(shù)字鍵壓鍵事件處理(集中管理)
----------------------------------------------*/
  (void *)PS2NumberKeyPush  + 0xb593       //數(shù)字鍵0~9壓鍵事件處理
  };
/*--------------------------------------------*/
  i = key;
  key &= 0x3f;//去掉鍵釋放及長壓鍵標志,取真鍵碼
  key --;
  if (key < 20){//只有20個鍵
    if (key < 10){//數(shù)字鍵0~9
      if (i <= 10) key = 15;//(散轉(zhuǎn)號0)壓數(shù)字鍵0~9
      else{
        if (i & 0x80) key = 11;//(散轉(zhuǎn)號11)放數(shù)字鍵0~9
        else key = 13;//(散轉(zhuǎn)號13)長壓數(shù)字鍵0~9
      }
    }
    else{//壓功能鍵F1~F6,Enter..KP
      if ((i & 0xc0) == 0) key -= 9;//(散轉(zhuǎn)號1~10)壓功能鍵F1~F6,Enter..KP
      else{
        if (i & 0x80) key = 12;//(散轉(zhuǎn)號12)放功能鍵
        else key = 14;//(散轉(zhuǎn)號14)長壓功能鍵
      }
    }
    ClrWdt();//喂狗(鬼知道鍵盤程序要運行多久,就替它先喂一次吧)
    i = ((key * 53 & 0xf) * 0x1000)+ ((key * 43 & 0xf) * 0x100) + ((key * 23 &
0xf) * 0x10) + (key * 13 & 0xf);
    _icall_((void *)funcpushbuffers[key] - i);//取鍵盤散轉(zhuǎn)表并執(zhí)行鍵盤命令
  }
}
這個程序與一般網(wǎng)上的有很大區(qū)別,它充分利用了外部中斷(0字)hotpower[1次]

  • 上一篇: 單片機的概述
  • 下一篇: 單片機系統(tǒng)硬件抗干擾常用方法實踐(轉(zhuǎn))
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網(wǎng)友評論:(只顯示最新5條。)
    關于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機電設備,機電供求等信息由機電企業(yè)自行提供,該企業(yè)負責信息內(nèi)容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯(lián)系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術支持

    主辦:杭州市高新區(qū)(濱江)機電一體化學會
    中國行業(yè)電子商務100強網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1