新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > msp430矩陣式4*4鍵盤

        msp430矩陣式4*4鍵盤

        作者: 時間:2016-11-23 來源:網絡 收藏
        msp430單片機矩陣式4*4鍵盤接口技術及程序設計
        V5v



        上圖中,列線通過電阻接正電源,并將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當按鈕沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態就可得知是否有鍵按下了。
        矩陣式鍵盤的按鈕識別辦法——“行掃描法”。
        行掃描法行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鈕識別辦法。
        判斷鍵盤中有無鍵按下將全部行線Y0-Y3置低電平,然后檢測列線的狀態。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鈕之中。若所有列線均為高電平,則鍵盤中無鍵按下。
        判斷閉合鍵所在的位置在確認有鍵按下后,即可進入確定具體閉合鍵的過程。其辦法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態。若某列為低,則該列線與置為低電平的行線交叉處的按鈕就是閉合的按鈕。
        例如:圖仍如上所示。430單片機的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0-P1.3分別接有4個上拉電阻到正電源5V,并把列線P1.0-P1.3設置為輸入線,行線P1.4-P.17設置為輸出線。4根行線和4根列線形成16個相交點。
        檢測當前是否有鍵被按下。檢測的辦法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的狀態,若P1.0-P1.3為全“1”,則無鍵閉合,不然有鍵閉合。
        去除鍵抖動。當檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷(以防是干擾)。
        若有鍵被按下,應識別出是哪一個鍵閉合。辦法是對鍵盤的行線進行掃描。P1.4-P1.7按下述4種組合依次輸出:
        P1.71110P1.61101P1.51011P1.40111
        在每組行輸出時讀取P1.0-P1.3,若全為“1”,則表示為“0”這一行沒有鍵閉合,不然有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計算法或查表法將閉合鍵的行值和列值轉換成所定義的鍵值

        鍵盤掃描程序如下:
        #include
        charkey;
        manage_key1()
        {}
        .................
        .................
        manage_key16()
        {}
        voiddelays()
        {
        intv=500;
        while(v!=0)v--;
        }
        voidkeyscan()
        {
        charsccode,recode;
        P1DIR=0X0f;

        P1OUT=0X00;//置所有行為低電平,行掃描,列線輸入(此時)
        if((P1IN&0X0F)!=0X0F)//判斷是否有有鍵按下(讀取列的真實狀態,若第4列有鍵按下則P1的值會變成01110000),有往下執行
        {
        delays();
        if((P1IN&0x0f)!=0x0f)//再次判斷列中是否是干擾信號,不是則向下執行
        {
        sccode=0xef;//逐行掃描初值(即先掃描第1行)
        while((sccode&0x01)!=0)//行掃描完成(4行已全部掃描完)sccode為11101111停止while程序
        {
        P1OUT=sccode;//輸出行掃描碼
        if((P1IN&0x0F)!=0X0F)//本行有鍵按下(即P1(真實的狀態)的高四位不全為1)
        {
        recode=(P1IN&0x0F)|0xf0;//列(列處于低四位,高四位補1)
        key=(sccode&recode);//行和列
        }
        //所掃描行沒有鍵按下,則掃描下一行,直到4行都掃描,此時sccode為11101111退出while程序
        else
        {
        sccode=(sccode<<1)|0x10;;//行掃描碼左移一位
        }
        }
        }
        //無鍵按下,返回0
        }
        }
        voidmain()
        {
        keyscan();
        delays();
        switch(key)
        {
        case0xee:manage_key1();break;//11101110
        case0xde:manage_key2();break;//11011110
        case0xbe:manage_key3();break;//10111110
        case0x7e:manage_key4();break;//01111110

        case0xed:manage_key5();break;//11101101
        case0xdd:manage_key6();break;//11011101
        case0xbd:manage_key7();break;//10111101
        case0x7d:manage_key8();break;//01111101

        case0xeb:manage_key9();break;//11101011
        case0xdb:manage_key10();break;//11011011
        case0xbb:manage_key11();break;//10111011
        case0x7b:manage_key12();break;//01111011

        case0xe7:manage_key13();break;//11100111
        case0xd7:manage_key14();break;//11010111
        case0xb7:manage_key15();break;//10110111
        case0x77:manage_key16();break;//01110111
        default:break;
        }
        }



        關鍵詞: msp430矩陣式4*4鍵

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 定日县| 荆门市| 德州市| 南漳县| 旌德县| 阆中市| 黔东| 固安县| 永丰县| 即墨市| 威海市| 大英县| 普格县| 布拖县| 张家界市| 荔浦县| 兴业县| 苏州市| 会同县| 永安市| 辽宁省| 拜泉县| 东城区| 崇州市| 大同市| 富宁县| 台安县| 黔西县| 容城县| 化州市| 永修县| 瑞丽市| 正阳县| 花莲市| 临邑县| 达州市| 镇雄县| 庄浪县| 西丰县| 巴林右旗| 吉安县|