新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AVR單片機程序——電腦鍵盤(P/S2口協議)——pckey

        AVR單片機程序——電腦鍵盤(P/S2口協議)——pckey

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

        #include <avr/io.h>
        #include interrupt.h>
        #include
        #include
        #include
        #include "scancodes.h"
        #include "74c922.h"

        本文引用地址:http://www.104case.com/article/201611/320265.htm

        #define GETPSDATA()((PIND>>PIND7)&0x1) //connect to PD7
        #define GETPSCLK() ((PIND>>PIND2)&0x1) //connetc to PD2

        static unsigned char IntNum = 0; //count the interrupt
        static unsigned char KeyV; //it is the key Value
        static unsigned char DisNum = 1; //顯示用指針
        static unsigned char Key_UP=0;//Key_UP means release the key, Shift = 0
        static unsigned char BF = 0; //標識是否有字符被收到


        SIGNAL(SIG_INTERRUPT0)
        {
        if ((IntNum > 0) && (IntNum < 9))
        {
        KeyV = KeyV >> 1; //因鍵盤數據是低>>高,結合上一句所以右移一位
        if (GETPSDATA()) KeyV = KeyV | 0x80; //當鍵盤數據線為1時為1到最高位
        }
        IntNum++;
        while (!GETPSCLK()); //等待PS/2CLK拉高

        if (IntNum > 10)
        {
        IntNum = 0; //當中斷11次后表示一幀數據收完,清變量準備下一次接收
        BF = 1; //標識有字符輸入完了
        cli(); //關中斷等顯示完后再開中斷 (注:如這里不用BF和關中斷直接調Decode()則所Decode中所調用的所有函數要聲明為再入函數)
        }
        }

        void Decode(unsigned char ScanCode) //注意:如SHIFT+G為12H 34H F0H 34H F0H 12H,也就是說shift的通碼+G的通碼+shift的斷碼+G的斷碼
        {
        unsigned char TempCyc;
        if (!Key_UP) //當鍵盤松開時
        {
        switch (ScanCode) {
        case 0xF0 :Key_UP = 1;break;// 當收到0xF0,Key_UP置1表示斷碼開始
        default:
        if (DisNum > 16)
        {
        DisNum = 1;
        Clear_Screen();
        }

        for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<60); TempCyc++); //查表顯示
        if (UnShifted[TempCyc][0] == ScanCode)
        {
        Write_Position(2,DisNum);
        Write_Data(UnShifted[TempCyc][1]);
        }
        DisNum++;

        break;
        }
        }
        else
        {
        Key_UP = 0;
        }
        BF = 0; //標識字符處理完了
        }


        int main(void)
        {
        DDRD=0x70;
        PORTD=0x00;
        Initialize_LCD();
        Write_Position(1,1);
        Write_String("hello");
        GICR=(1<MCUCR=(1<sei();//start the interrupt
        do
        {
        if (BF)
        Decode(KeyV);
        else
        sei(); //開中斷
        }
        while(1);
        }

        "scancodes.h"

        unsigned char/* code*/ UnShifted[59][2] = {
        0x1C, a,
        0x32, b,
        0x21, c,
        0x23, d,
        0x24, e,
        0x2B, f,
        0x34, g,
        0x33, h,
        0x43, i,
        0x3B, j,
        0x42, k,
        0x4B, l,
        0x3A, m,
        0x31, n,
        0x44, o,
        0x4D, p,
        0x15, q,
        0x2D, r,
        0x1B, s,
        0x2C, t,
        0x3C, u,
        0x2A, v,
        0x1D, w,
        0x22, x,
        0x35, y,
        0x1A, z,
        0x45, 0,
        0x16, 1,
        0x1E, 2,
        0x26, 3,
        0x25, 4,
        0x2E, 5,
        0x36, 6,
        0x3D, 7,
        0x3E, 8,
        0x46, 9,
        0x0E, `,
        0x4E, -,
        0x55, =,
        0x5D, ,
        0x29, ,
        0x54, [,
        0x5B, ],
        0x4C, ;,
        0x52, ,
        0x41, ,,
        0x49, .,
        0x4A, /,
        0x71, .,
        0x70, 0,
        0x69, 1,
        0x72, 2,
        0x7A, 3,
        0x6B, 4,
        0x73, 5,
        0x74, 6,
        0x6C, 7,
        0x75, 8,
        0x7D, 9,
        };

        unsigned char/* code*/ Shifted[59][2] = {
        0x1C, A,
        0x32, B,
        0x21, C,
        0x23, D,
        0x24, E,
        0x2B, F,
        0x34, G,
        0x33, H,
        0x43, I,
        0x3B, J,
        0x42, K,
        0x4B, L,
        0x3A, M,
        0x31, N,
        0x44, O,
        0x4D, P,
        0x15, Q,
        0x2D, R,
        0x1B, S,
        0x2C, T,
        0x3C, U,
        0x2A, V,
        0x1D, W,
        0x22, X,
        0x35, Y,
        0x1A, Z,
        0x45, 0,
        0x16, 1,
        0x1E, 2,
        0x26, 3,
        0x25, 4,
        0x2E, 5,
        0x36, 6,
        0x3D, 7,
        0x3E, 8,
        0x46, 9,
        0x0E, ~,
        0x4E, _,
        0x55, +,
        0x5D, |,
        0x29, ,
        0x54, {,
        0x5B, },
        0x4C, :,
        0x52, ",
        0x41, <,
        0x49, >,
        0x4A, ?,
        0x71, .,
        0x70, 0,
        0x69, 1,
        0x72, 2,
        0x7A, 3,
        0x6B, 4,
        0x73, 5,
        0x74, 6,
        0x6C, 7,
        0x75, 8,
        0x7D, 9,
        };




        評論


        技術專區

        關閉
        主站蜘蛛池模板: 肥东县| 长春市| 驻马店市| 舟山市| 珲春市| 舟曲县| 响水县| 易门县| 巴里| 和龙市| 登封市| 昆明市| 临潭县| 宜宾县| 昌都县| 都兰县| 荔波县| 张家界市| 黑水县| 亳州市| 东台市| 台中县| 互助| 浦北县| 绥中县| 扶风县| 东台市| 绵阳市| 临朐县| 化德县| 奉节县| 西乌珠穆沁旗| 神木县| 潞城市| 古丈县| 宜州市| 开江县| 万山特区| 梅河口市| 鹤峰县| 湘潭县|