<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STC89C52單片機PS2鍵盤解碼

          STC89C52單片機PS2鍵盤解碼

          作者: 時間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
          /////////////////////////////////////////////////////////////////////////

          實現(xiàn)功能:實現(xiàn)對P2鍵盤的數(shù)據(jù)采集、譯碼以及顯示的工作,即通過中斷把P2鍵盤
          的數(shù)據(jù)值采集過來,然后通過軟件譯碼,最后把相應(yīng)的字母顯示到1602
          液晶上
          實驗板型號:KBL-XYD-C52
          實驗名稱: 點亮發(fā)光二級管
          編寫人: 謝應(yīng)東
          編寫日期: 2012-4-28
          /////////////////////////////////////////////////////////////////////////
          #include //包含頭文件
          #include "scancodes.h"
          #include "lcd.h"

          本文引用地址:http://www.ex-cimer.com/article/201611/319220.htm

          #define uchar unsigned char
          #define uint unsigned int

          sbit P2Key_Data = P2^3;//定義Keyboard引腳
          sbit P2Key_CLK =P3^2; //使用中斷
          sbit led=P1^0;

          bit FLAG;
          bit Shift; //定義上檔鍵標(biāo)志
          bit P2Key_UP; //定義通碼斷碼標(biāo)志

          uchar cKeyValue; //單片機接收到的P2鍵盤發(fā)送的數(shù)據(jù)
          uchar cIntNum; //記錄中斷發(fā)生的次數(shù)
          uchar cDisplayNum;//記錄顯示到1602液晶上的字符數(shù)

          void P2KEY_Decode(unsigned char ScanCode);//解碼子程序
          /////////////////////////////////////////////////////////////////////////
          函數(shù)名稱:主函數(shù)
          函數(shù)功能:完成對外部中斷0的配置,對P2鍵盤的譯碼與在1602液晶上的顯示
          參數(shù)介紹:無
          返回值:
          注意事項:無
          /////////////////////////////////////////////////////////////////////////

          void main()
          {
          EA = 1; //開全局中斷
          EX0 = 1; //開外部中斷0
          IT0 = 1; //設(shè)外部中斷1為低電平觸發(fā)
          Initial_LCD();//初始化1602液晶屏
          do
          {
          if (FLAG)
          P2KEY_Decode(cKeyValue);
          else
          EA = 1; //開總中斷
          }
          while(1);
          }
          /////////////////////////////////////////////////////////////////////////

          函數(shù)名稱:P2Key_Int0
          函數(shù)功能:通過中斷來獲取P2鍵盤發(fā)送過來的數(shù)據(jù)
          參數(shù)介紹:無
          返回值:
          注意事項:無
          /////////////////////////////////////////////////////////////////////////

          void P2Key_Int0(void) interrupt 0
          {
          if ((cIntNum > 0) && (cIntNum < 9))//第一位到第八位為數(shù)據(jù)位
          {
          cKeyValue = cKeyValue >> 1; //因鍵盤數(shù)據(jù)是從低到高,因為一個數(shù)據(jù)線,
          //所以每次要向右移一位
          if (P2Key_Data)//當(dāng)數(shù)據(jù)線是高電平時,就與0x80或一下
          cKeyValue = cKeyValue | 0x80;
          }
          cIntNum++;
          while (!P2Key_CLK); //等待PS/2CLK拉高
          if (cIntNum > 10)
          {
          cIntNum = 0; //當(dāng)中斷11次后表示一幀數(shù)據(jù)收完,清變量準(zhǔn)備下一次接收
          FLAG = 1; //標(biāo)識有字符輸入完了
          EA = 0; //關(guān)中斷等顯示完后再開中?
          }
          led=~led;
          }
          /////////////////////////////////////////////////////////////////////////

          函數(shù)名稱:P2KEY_Decode
          函數(shù)功能:對P2鍵盤采集到的數(shù)據(jù)進行相應(yīng)的譯碼,并把所譯碼的內(nèi)容顯示到1602上
          參數(shù)介紹:ScanCode:通過中斷采集到的數(shù)據(jù)
          返回值:
          注意事項:無
          /////////////////////////////////////////////////////////////////////////

          void P2KEY_Decode(unsigned char ScanCode) //注意:如SHIFT+G為12H 34H F0H 34H F0H 12H,也就是說shift的通碼+G的通碼+shift的斷碼+G的斷碼
          {
          unsigned char TempCyc;
          if (!P2Key_UP) //當(dāng)鍵盤按下時
          {
          switch (ScanCode)
          {
          case 0xF0 : // 當(dāng)收到0xF0,Key_UP置1表示斷碼開始
          P2Key_UP = 1;
          break;
          case 0x12 : // 左 SHIFT
          Shift = 1;
          break;
          case 0x59 : // 右 SHIFT
          Shift = 1;
          break;
          default:
          if(!Shift) //如果SHIFT沒按下
          {
          for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表顯示
          if (UnShifted[TempCyc][0] == ScanCode)
          {
          ShowChar(cDisplayNum,UnShifted[TempCyc][1]);
          cDisplayNum++;
          if(cDisplayNum==32)
          {
          WriteCommandLCD(0x01,0);//讓1602清屏
          cDisplayNum=0;//重頭寫數(shù)據(jù)
          }
          }
          }
          else //按下SHIFT
          {
          for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表顯示
          if (Shifted[TempCyc][0] == ScanCode)
          {
          ShowChar(cDisplayNum,Shifted[TempCyc][1]);
          cDisplayNum++;
          if(cDisplayNum==32)
          {
          WriteCommandLCD(0x01,0);//讓1602清屏
          cDisplayNum=0;//重頭寫數(shù)據(jù)
          }
          }
          }
          break;
          }
          }
          else
          {
          P2Key_UP = 0;
          switch (ScanCode) //當(dāng)鍵松開時不處理判碼,如G 34H F0H 34H 那么第二個34H不會被處理
          {
          case 0x12 : // 左 SHIFT
          Shift = 0;
          break;
          case 0x59 : // 右 SHIFT
          Shift = 0;
          break;
          }
          }
          FLAG = 0; //單片機對P2鍵盤一次敲入的按鍵譯碼和顯示完成
          }



          關(guān)鍵詞: STC89C52單片機PS2鍵盤解

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();