<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        4*4矩陣鍵盤的掃描原理

        作者:佚名   來源:互聯網   點擊數:  更新時間:2014年06月26日   【字體:

            初學者肯定要經歷的一個實驗就是4*4矩陣鍵盤的代碼編寫,大部分都是在學校里面,有現成的實驗箱,基本不需要自己動腦子。上次遇到一個哥們,他說他用的是8031的實驗箱,我當時就暈了。8031是8051的前身,那個芯片連ROM都沒有,可以想象我們的學校都在拿什么教育祖國的花朵。廢話少說,先上圖:

         

            對初學者來說這篇文章會有點難,可以先研究一下如何用51單片機點亮一個發光二極管和基于CPLD-EPF10K10LC84-4(84)的交通燈設計。首先要說明的一點,矩陣鍵盤的動態掃描確實略顯復雜,不可能就是讀一個端口數據,然后馬上就出來結果。這需要對依次每一行的按鍵進行掃描、判斷,然后得出結果。如上圖所示,先掃描第一行,也就是S1,S2,S3,S4四個按鍵的狀態。在PA口輸入0XFE。

            0XFE變成二進制是1111 1110,為了方便使用,記得每四個數之間加一個空格。1111 1110這個數據放到PA口上,假設這個時候S1被按下了,會出現什么情況?因為PA0是低電平,S1被按下之后S1導通,導致PA4的電平從1降到0,于是PA端口的數據就變成了1110 1110,換算成16進制就是0XEE。于是我們知道S1被按下了。

            假設是S3被按下,會出現什么情況?沒錯,PA6的電平被拉低,PA的端口數據變成了1011 1110,也就是0XBE。這樣,我們就知道了,每一行的每一個按鍵被按下的時候,都會有一個對應的獨一無二的值。這就是矩陣鍵盤的掃描原理!送上一段源碼,大家看著玩吧:

        void matrixkeyscan()

        {

        uchar temp,key;

            P3=0xfe;

            temp=P3;

            temp=temp&0xf0;

            if(temp!=0xf0)

            {

              delayms(10);

         temp=P3;

         temp=temp&0xf0;

              if(temp!=0xf0)

              {

                temp=P3;

                switch(temp)

                {

                  case 0xee:

                       key=0;

                       break;

                  case 0xde:

                       key=1;

                       break;

                  case 0xbe:

                       key=2;

                       break;

                  case 0x7e:

                       key=3;

                       break;

                 }

                 while(temp!=0xf0)

                 {

                   temp=P3;

                   temp=temp&0xf0;

                 }

                display(key);

              }

            }

            P3=0xfd;

            temp=P3;

            temp=temp&0xf0;

            if(temp!=0xf0)

            {

              delayms(10);

              temp=P3;

              temp=temp&0xf0;

              if(temp!=0xf0)

              {

                temp=P3;

                switch(temp)

                {

                  case 0xed:

                       key=4;

                       break;

                  case 0xdd:

                       key=5;

                       break;

                  case 0xbd:

                       key=6;

                       break;

                  case 0x7d:

                       key=7;

                       break;

                 }

                 while(temp!=0xf0)

                 {

                   temp=P3;

                   temp=temp&0xf0;

                 }

                 display(key);

              }

              }

            P3=0xfb;

            temp=P3;

            temp=temp&0xf0;

            if(temp!=0xf0)

            {

              delayms(10);

             temp=P3;

              temp=temp&0xf0;

              if(temp!=0xf0)

              {

                temp=P3;

                switch(temp)

                {

                  case 0xeb:

                       key=8;

                       break;

                  case 0xdb:

                       key=9;

                       break;

                  case 0xbb:

                       key=10;

                       break;

                  case 0x7b:

                       key=11;

                       break;

                 }

                 while(temp!=0xf0)

                 {

                   temp=P3;

                   temp=temp&0xf0;

                 }

                display(key);

              }

              }

            P3=0xf7;

            temp=P3;

            temp=temp&0xf0;

            if(temp!=0xf0)

            {

              delayms(10);

              temp=P3;

              temp=temp&0xf0;

              if(temp!=0xf0)

              {

                temp=P3;

                switch(temp)

                {

                  case 0xe7:

                       key=12;

                       break;

                  case 0xd7:

                       key=13;

                       break;

                  case 0xb7:

                       key=14;

                       break;

                  case 0x77:

                       key=15;

                       break;

                 }

                 while(temp!=0xf0)

                 {

                   temp=P3;

                   temp=temp&0xf0;

                 }

                display(key);

              }

            }

        }

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮