マトリックスキーボードスキャンアルゴリズム

9550 ワード

関数の本体
unsigned char GetKey()

{

    unsigned char i,j,k;

    static unsigned char backup[4][4]={

        {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}

    };



    EA=1;

    TMOD=0x01;//  T0   1

    TH0=0xF8;

    TL0=0xCD;

    ET0=1;//  T0  

    TR0=1;//  T0



    while(1)    

    {

        for(i=0;i<4;i++)//    4×4     

        {

            for(j=0;j<4;j++)

            {

                if(backup[i][j]!=KeySta[i][j])//      

                {

                    if(backup[i][j]!=0)//            

                    {

                        k=i*4+j;

                        return k;//         

                    }

                    backup[i][j]=KeySta[i][j];//         

                }

            }

        }

    }

}

 
次は割り込み関数です
/*T0      ,           */

void InterruptTimer0() interrupt 1

{

    unsigned char m;

    static unsigned char keyout=0;//          

    static unsigned char keybuf[4][4]={

        {0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},

        {0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF}

    };



    TH0=0xFC;

    TL0=0x67;                   

    /*    4         */

    keybuf[keyout][0]=(keybuf[keyout][0]<<1)|KEY_IN_1;

    keybuf[keyout][1]=(keybuf[keyout][1]<<1)|KEY_IN_2;

    keybuf[keyout][2]=(keybuf[keyout][2]<<1)|KEY_IN_3;

    keybuf[keyout][3]=(keybuf[keyout][3]<<1)|KEY_IN_4;



    /*         */

    for(m=0;m<4;m++)

    {

        if((keybuf[keyout][m]&0x0F)==0x00)

        {

            KeySta[keyout][m]=0;//  4     0, 4×4ms        ,           

        }

        else if((keybuf[keyout][m]&0x0F)==0x0F)

        {

            KeySta[keyout][m]=1;//  

        }

        /*          */

        keyout++;//      

        keyout=keyout&0x03;//      4   

        /*    ,        ,         */

        switch(keyout)

        {

            case 0:KEY_OUT_4=1;KEY_OUT_1=0;break;

            case 1:KEY_OUT_1=1;KEY_OUT_2=0;break;

            case 2:KEY_OUT_2=1;KEY_OUT_3=0;break;

            case 3:KEY_OUT_3=1;KEY_OUT_4=0;break;

            default:break;

        }

    }

}

これらのコードはマトリクスキーボードのスキャン、ブレ消し、動作分離のすべてを完了し、GetKey()を呼び出すことで押したボタンの番号を返すことができ、便利です.