新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STC89C52單片機PS2鍵盤解碼

        STC89C52單片機PS2鍵盤解碼

        作者: 時間:2016-11-21 來源:網絡 收藏
        /////////////////////////////////////////////////////////////////////////

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

        本文引用地址:http://www.104case.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; //定義上檔鍵標志
        bit P2Key_UP; //定義通碼斷碼標志

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

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

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

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

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

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

        void P2KEY_Decode(unsigned char ScanCode) //注意:如SHIFT+G為12H 34H F0H 34H F0H 12H,也就是說shift的通碼+G的通碼+shift的斷碼+G的斷碼
        {
        unsigned char TempCyc;
        if (!P2Key_UP) //當鍵盤按下時
        {
        switch (ScanCode)
        {
        case 0xF0 : // 當收到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;//重頭寫數據
        }
        }
        }
        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;//重頭寫數據
        }
        }
        }
        break;
        }
        }
        else
        {
        P2Key_UP = 0;
        switch (ScanCode) //當鍵松開時不處理判碼,如G 34H F0H 34H 那么第二個34H不會被處理
        {
        case 0x12 : // 左 SHIFT
        Shift = 0;
        break;
        case 0x59 : // 右 SHIFT
        Shift = 0;
        break;
        }
        }
        FLAG = 0; //單片機對P2鍵盤一次敲入的按鍵譯碼和顯示完成
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 茶陵县| 北票市| 永嘉县| 临汾市| 奉节县| 天水市| 澄江县| 霞浦县| 鲜城| 茶陵县| 德钦县| 沧源| 中阳县| 通化县| 元江| 岫岩| 玉田县| 北京市| 邛崃市| 普格县| 岑溪市| 保康县| 昆山市| 金堂县| 陆丰市| 台北县| 古丈县| 外汇| 平昌县| 乳山市| 香港| 德令哈市| 洪江市| 修文县| 霸州市| 安徽省| 若尔盖县| 噶尔县| 潞城市| 阜新| 开阳县|