新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 51單片機 4*4矩陣鍵盤 掃描方式

        51單片機 4*4矩陣鍵盤 掃描方式

        作者: 時間:2016-11-25 來源:網(wǎng)絡 收藏
        實際工程應用中,遇到按鍵比較多的情況,大多是使用矩陣鍵盤或者編碼鍵盤。處于成本考慮,一般使用矩陣鍵盤。

        以下是矩陣鍵盤部分原理圖:

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



        代碼如下:

        #include
        #define uint unsigned int
        #define uchar unsigned char
        sbit duanxuan=P2^6;
        sbit pianxuan=P2^7;

        uchar code table[]={
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71}; //編碼定義

        void delay_xs(uint);//延時函數(shù)聲明
        void display(uint);//顯示函數(shù)聲明(只是負責送段選信號)
        void keyscan();//鍵盤掃描函數(shù)聲明

        void main()
        {
        //數(shù)碼管位選端初始化
        duanxuan=1;
        P0=0x40;
        duanxuan=0;
        P0=0xff;
        pianxuan=1;
        P0=0xc0;
        pianxuan=0;
        //主體部分
        while(1)
        {
        keyscan();
        }
        }
        //延時函數(shù)主體
        void delay_xs(uint xs)
        {
        uint i,j;
        for(i=xs;i>0;i--)
        {
        for(j=110;j>0;j--)
        {
        }
        }
        }
        //顯示函數(shù)主體
        void display( uint key)
        {
        duanxuan=1;
        P0=table[key];
        duanxuan=0;
        }
        //鍵盤掃描函數(shù)主體
        void keyscan()
        {
        uint buffer,key;
        //掃描第一行
        P0=0xfe; //1111 1110賦值給P3,此時鍵盤第一行全為0
        buffer=P3;
        buffer=buffer&0xf0; //1111 1110 & 1111 0000=1111 0000如果有按鍵按下,1111 1110的高四位必定出現(xiàn)0,此時按位與的結(jié)果不再是1111 0000
        if(buffer!=0xf0) //不等于1111 0000 說明有鍵被按下
        {
        delay_xs(10); //延時10us,防止抖動
        buffer=P3; //此時的buffer=buffer&1111 0000,不是P3,所以要重新賦值,為延時之后再判斷做準備
        buffer=buffer&0xf0;
        if(buffer!=0xf0) //依然按下
        {
        buffer=P3;//再一次賦值
        switch(buffer)//判斷第一行哪一個按鍵被按下
        {
        case 0xee: //如果是第一個按鍵被按下,buffer(P3)的值將是1110 1110
        key=0;
        break;
        case 0xde:
        key=1;
        break;
        case 0xbe:
        key=2;
        break;
        case 0x7e:
        key=3;
        break;
        }
        while(buffer!=0xf0) //buffer不等于1111 0000,說明按鍵沒有還是被按下
        {
        buffer=P3;
        buffer=buffer&0xf0;
        }
        display(key);//送段選信號
        }

        }
        //掃描第二行
        P3=0xfd;
        buffer=P3;
        buffer=buffer&0xf0;
        if(buffer!=0xf0)
        {
        delay_xs(10);
        buffer=P3;
        buffer=buffer&0xf0;
        if(buffer!=0xf0)
        {
        buffer=P3;
        switch(buffer)
        {
        case 0xed:
        key=4;
        break;
        case 0xdd:
        key=5;
        break;
        case 0xbd:
        key=6;
        break;
        case 0x7d:
        key=7;
        break;
        }
        while(buffer!=0xf0)
        {
        buffer=P3;
        buffer=buffer&0xf0;
        }
        display(key);
        }
        }
        //掃描第三行
        P3=0xfb;
        buffer=P3;
        buffer=buffer&0xf0;
        if(buffer!=0xf0)
        {
        delay_xs(10);
        buffer=P3;
        buffer=buffer&0xf0;
        if(buffer!=0xf0)
        {
        buffer=P3;
        switch(buffer)
        {
        case 0xeb:
        key=8;
        break;
        case 0xdb:
        key=9;
        break;
        case 0xbb:
        key=10;
        break;
        case 0x7b:
        key=11;
        break;
        }
        while(buffer!=0xf0)
        {
        buffer=P3;
        buffer=buffer&0xf0;
        }
        display(key);
        }
        }
        //掃描第四行
        P3=0xf7;
        buffer=P3;
        buffer=buffer&0xf0;
        if(buffer!=0xf0)
        {
        delay_xs(10);
        buffer=P3;
        buffer=buffer&0xf0;
        if(buffer!=0xf0)
        {
        buffer=P3;
        switch(buffer)
        {
        case 0xe7:
        key=12;
        break;
        case 0xd7:
        key=13;
        break;
        case 0xb7:
        key=14;
        break;
        case 0x77:
        key=15;
        break;
        }
        while(buffer!=0xf0)
        {
        buffer=P3;
        buffer=buffer&0xf0;
        }
        display(key);
        }
        }
        }


        以上,結(jié)束。



        評論


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

        關(guān)閉
        主站蜘蛛池模板: 南岸区| 龙井市| 榆社县| 东乌| 兴义市| 中山市| 壶关县| 安仁县| 梅州市| 雅江县| 天全县| 富宁县| 伽师县| 米脂县| 黄陵县| 内江市| 信丰县| 陈巴尔虎旗| 民和| 乐山市| 芦溪县| 区。| 宁陵县| 泽州县| 东源县| 巴林右旗| 榆社县| 兴安县| 景东| 永城市| 志丹县| 新建县| 白河县| 天祝| 松阳县| 梁河县| 班戈县| 阜新| 榆中县| 申扎县| 思南县|