在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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)用 > 51單片機 4*4矩陣鍵盤 掃描方式

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

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

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

            本文引用地址:http://www.biyoush.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ù)聲明(只是負責(zé)送段選信號)
            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)閉