標題: 51單片機4*4矩陣鍵盤如何掃描識別?自己的寫法比較繁瑣,求指教 [打印本頁]

作者: _nop_()    時間: 2019-3-13 14:07
標題: 51單片機4*4矩陣鍵盤如何掃描識別?自己的寫法比較繁瑣,求指教
我感覺自己掌握的矩陣鍵盤掃描寫法比較繁瑣,希望有大佬指教好的方法,十分感謝!

uchar KeyScan()        //帶返回值的子函數(shù)
{
        uchar cord_l,cord_h;//聲明列線和行線的值的儲存變量
        P3 = 0xf0;//1111 0000
        if( (P3 & 0xf0) != 0xf0)//判斷是否有按鍵按下(按下就為與)
        {
                delay(5);//軟件消抖
                if( (P3 & 0xf0) != 0xf0)//再次判斷是否有按鍵按下
                {
                          cord_l = P3 & 0xf0;// 儲存列線值
                          P3 = cord_l | 0x0f;
                          cord_h = P3 & 0x0f;// 儲存行線值
                          while( (P3 & 0x0f) != 0x0f );//松手檢測
                          return (cord_l + cord_h);//返回鍵值碼
                }        
        }
               
}


void KeyPro()
{
        switch( KeyScan() )
        {
                 //第一行鍵值碼
                case 0xee: P0 = leddata[0];                break;
                case 0xde: P0 = leddata[1];                break;
                case 0xbe: P0 = leddata[2];                break;
                case 0x7e: P0 = leddata[3];                break;
               
                //第二行鍵值碼
                case 0xed: P0 = leddata[4];                break;
                case 0xdd: P0 = leddata[5];                break;
                case 0xbd: P0 = leddata[6];                break;
                case 0x7d: P0 = leddata[7];                break;


                //第三行鍵值碼
                case 0xeb: P0 = leddata[8];                break;
                case 0xdb: P0 = leddata[9];                break;
                case 0xbb: P0 = leddata[10];        break;
                case 0x7b: P0 = leddata[11];        break;


                //第四行鍵值碼
                case 0xe7: P0 = leddata[12];        break;
                case 0xd7: P0 = leddata[13];        break;
                case 0xb7: P0 = leddata[14];        break;
                case 0x77: P0 = leddata[15];        break;
        }        
}




作者: Linton    時間: 2019-3-13 15:27
最好不要delay   定時掃描獲取鍵值就好了
作者: 7358655    時間: 2019-3-13 20:18
給你截一段
if(jzaj!=0x0f) //再次判斷
                {
                        jzaj=0x0f;
                        switch (jzaj)
                        {
                                case(0x07):ajsj=0;break;  //如果總線為0000 0111是按鍵數(shù)據(jù)存0
                                case(0x0b):ajsj=1;break;
                                case(0x0d):ajsj=2;break;
                                case(0x0e):ajsj=3;break;
                        }
                        jzaj=0xf0;
                        switch(jzaj)
                        {
                                case(0x70):ajsj=ajsj;break;
                                case(0xb0):ajsj=ajsj+4;break;
                                case(0xd0):ajsj=ajsj+8;break;
                                case(0xe0):ajsj=ajsj+12;break;
                        }
                        while((a<50)&&(jzaj!=0x0f))        //當a<50同時總線不等于00001111時,執(zhí)行延時。
                        {
                                delay(1000);
                                a++;
                        }
                }
作者: 2678254412    時間: 2019-3-13 22:17

void keyscan()//高四位為列線,低四位為行線
{
        P3=0xf0;//列掃描,有鍵按下后該列會被拉低
        if(P3!=0xf0)//判斷案件是否按下
        {
                delayms(5);//延時消抖
                if(P3!=0xf0)
                {
                        switch(P3)//判斷哪一列被按下
                        {
                                case 0xe0:keyval=0;//1110 0000
                                        break;
                                case 0xd0:keyval=1;//1101 0000
                                        break;
                                case 0xb0:keyval=2;//1011 0000
                                        break;
                                case 0x70:keyval=3;//0111 0000
                                        break;
                        }
                        P3=0x0f;
                        switch(P3)//判斷哪一行被按下
                        {
                                case 0x0e:keyval=keyval;
                                        break;
                                case 0x0d:keyval=keyval+4;
                                        break;
                                case 0x0b:keyval=keyval+8;
                                        break;
                                case 0x07:keyval=keyval+12;
                                        break;
                        }
                        while(P3!=0x0f);//松手檢測,按鍵按住時P3始終不等于0x0f,始終執(zhí)行循環(huán),松手后P3=0x0f
                }
        }
}
作者: _nop_()    時間: 2019-3-14 21:08
7358655 發(fā)表于 2019-3-13 20:18
給你截一段
if(jzaj!=0x0f) //再次判斷
                {

非常感謝,希望您也能經(jīng)常得到自己想要的回復
作者: _nop_()    時間: 2019-3-14 21:09
2678254412 發(fā)表于 2019-3-13 22:17
void keyscan()//高四位為列線,低四位為行線
{
        P3=0xf0;//列掃描,有鍵按下后該列會被拉低

非常感謝,希望您也能經(jīng)常得到自己想要的回復




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1