在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            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.biyoush.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)閉