1. 程式人生 > >51微控制器應用行列反轉法操縱矩陣鍵盤

51微控制器應用行列反轉法操縱矩陣鍵盤

應用行列反轉法操縱矩陣鍵盤

  行列反轉法的簡單實用,我自己整理了一下,分享給大家。根據開發板原理圖可知,P3口接為矩陣鍵盤,其中P3.0~P3.3接行線,P3.4~P3.7接列線,P0口接共陰極6段數碼管。

                  圖 1

反轉法的原理:反轉法就是通過給微控制器的埠兩次賦值,最後得出所按鍵的值的一種演算法。具體操作如下:

1.我們給P3口賦值0x0f,即00001111,假設S6鍵(TX開發板中,S6鍵相當於第一個按鍵)按下了,則這時P3口的實際值為00001110;     

 2.我們給P3口再賦值0xf0,即11110000,如果S6鍵按下了,則這時P3口的實際值為11100000;    

 3.我們把兩次P3口的實際值相加

得11101110,即0xee。     由此我們便得到了按下S6鍵時所對應的數值0xee,以此類推可得出其他15個按鍵對應的數值,有了這種對應關係,對應關係見圖2.

                                      圖2

以下為程式:  反轉法矩陣鍵盤的應用,通過按下矩陣按鍵,使數碼管第一位(0xFE)顯示數值,是我自己敲的可執行的程式,拿來與大家共享

#include<reg52.h>

#define ucharunsigned char

#define uintunsigned int

uchar n,key;

sbit dula=P2^6;

sbit wela=P2^7;

void  delayms(uint xms);          //延時函式

void keyscan()   ;                       //按鍵掃描函式

void display();   //數碼管顯示函式

 

uchar code table[]={         //數碼管的顯示程式

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

 

uchar code jian[]={            //矩陣按鍵顯程式

0xee,0xDe,0xbe,0X7e,

0Xed,0xdd,0xbd,0x7d,

0xeb,0xdb,0xbb,0x7b,

0xe7,0xd7,0xb7,0x77};

void main()        //主函式

{

    while(1)

    {

           keyscan();         //執行按鍵掃描函式

           display();            //執行數碼管顯示函式

    }

}

void  delayms(uint xms)         //延時函式

{

    uint i,j;

    for(i=xms;i>0;i--)          i=xms,也就是xms毫秒

           for(j=110;j>0;j--);       

}

void keyscan()          //按鍵掃描函式

{

    uchar l,h,i;     //l為第四位,h為高四位

   P3=0x0f;     令P3=0x00001111

    l=P3&0X0f;        //l為低四位,即行

    if(l!=0x0f)      //如果按鍵被按下,此時執行if迴圈

    {

           delayms(10);     // 延時10毫秒,目的是消抖

           if(l!=0x0f)     //再次檢測是否按下

           {

                  l=P3&0x0f;      //此時低四位確定,即某一行有按鍵被按下了

           }

   

    }

 

    P3=0xf0;    //P3=0X11110000

    h=P3&0Xf0;            //h為高四位,即列

    if(h!=0xf0) //如果按鍵有被按下

    {

           delayms(10);  //延時

           if(h!=0xf0)      

           {

                  h=P3&0xf0;   //此時得出高四位,即列

           }     

    }

    key=l+h;    //相加確定出某一個按鍵被按下

    for(i=0;i<16;i++)    //查詢i,確定i的值。目的是接下來對應到數碼管的哪一位

    {

           if(key==jian[i])    //算出i

           n=i;

    }

}

void display()   //顯示函式

{

           dula=1;

           P0=table[n];

           dula=0;

           P0=0xff;   //目的是消影

           wela=1;

           P0=0xfe;

           wela=0;

           delayms(5);

}

 實驗現象如下: