Ⅰ 51單片機矩陣鍵盤(c語言) 求大神啊~
uchar
KeyScan(void)
{
static
uchar
k=0;
//由於函數在調用結束時k值已返回給函數,k作為局部變數即可
/////////
uchar
Trg,Trg1,Trg2,Cont1,Cont2;
uchar
ReadData1,ReadData2;
/////////
P3=0x0f;
ReadData1=P3^0x0f;
Trg1=ReadData1&(ReadData1^Cont1);
//觸發鍵
Cont1=ReadData1;
//長按鍵
/////////
P3=0xf0;
ReadData2=P3^0xf0;
Trg2=ReadData2&(ReadData2^Cont2);
Cont2=ReadData2;
Trg=Trg1+Trg2;
////////
switch(Trg)
{
case
0x81:{k=1;break;}
case
0x41:{k=2;break;}
case
0x21:{k=3;break;}
case
0x11:{k=4;break;}
case
0x82:{k=5;break;}
case
0x42:{k=6;break;}
case
0x22:{k=7;break;}
case
0x12:{k=8;break;}
case
0x84:{k=9;break;}
case
0x44:{k=10;break;}
case
0x24:{k=11;break;}
case
0x14:{k=12;break;}
case
0x88:{k=13;break;}
case
0x48:{k=14;break;}
case
0x28:{k=15;break;}
case
0x18:{k=16;break;}
default:{k=0;break;}
}
return(k);
}
//在主函數裡面直接調用keyboard()函數,直接返回鍵值;
然後在數碼管顯示。
好好的研究下這個鍵盤程序,
這種方式很程序很精煉、簡單
絕對可以調出來。
Ⅱ 單片機匯編矩陣鍵盤實驗(掃描法)
關於掃描按鍵的原理,可以看下面這篇文章。
本文以循序漸進的思路,引導大家思考如何用最少的IO驅動更多的按鍵,並依次給出5種方案原理圖提供參考。在實際項目中我們經常會遇到有按鍵輸入的需求,但有的時候為了節省資源成本,我們都會選擇在不增加硬體的情況下使用最少的控制器IO驅動更多的按鍵,那麼具體是怎麼做的呢,下面我們就以用5個IO引腳為例,講下怎麼設計可以實現更多的按鍵?共有5種設計思路,下面依次介紹。
首先通常想到的可能是下面這樣的設計:
這樣我們可以先識別K01、K02、K03、K04、K05,若沒有按鍵按下然後再和思路四的設計一樣去識別其他按鍵。但這樣存在一個問題,如果IO1配置為0,IO5讀到0,那麼怎麼知道是K51按下還是K05按下呢,這里只需要在程序里做下判斷,先判斷下是不是K05按下,若不是就是K51,因為按鍵K01、K02、K03、K04、K05在5個IO口都為讀取的情況下,就可以識別,不需要掃描識別處理,相當於這5個按鍵優先順序高與其他按鍵。
總結
綜合上述,5個IO口最多可以識別25個按鍵,思路五程序上處理比較麻煩,若實際中只按思路四設計,也可識別20個按鍵,那麼如果有N個IO口可識別多少按鍵呢?這里給出如下公式:
假設有N個IO口按照思路三可以識別N*(N-1)/2個;
按照思路四可識別N*(N-1)個;
按照思路5可以識別N*(N-1)+N個。
最後再說下,如果實際設計時,還是按思路四設計好,軟體也沒那麼麻煩。如果是你的話你會選擇哪種方法呢?你還有沒有其他的設計方法呢?
Ⅲ 怎樣知道單片機的矩陣鍵盤每個按鍵的地址
1、比如是一個4行×4列的矩陣鍵盤。
2、將4行和4列共8根線分別接到單片機的I/O口,比如接P1口,行接低4位(P1.0~P1.3),列接高4位(P1.4~P1.7)。
3、單片機先將行置第電平0,列置高電平1.
4、在鍵盤掃描程序中,判斷是否有任意按鍵按下:if((P1&0xf0)!=0xf0),表示有按鍵按下,延時消抖後,再次判斷,如果(P1&0xf0)!=0xf0,則表示有按鍵按下。
5、然後開始逐行掃描:
P1=0xfe; //第一行置為低電平「0」(P1.0輸出低電平「0」)
if(P14==0) keyval=1; //如果檢測到接P1.4引腳的列線為低電平「0」,可判斷是S1鍵被按下
if(P15==0) keyval=2; //如果檢測到接P1.5引腳的列線為低電平「0」 ,可判斷是S2鍵被按下
if(P16==0) keyval=3; //如果檢測到接P1.6引腳的列線為低電平「0」,可判斷是S3鍵被按下
if(P17==0) keyval=4; //如果檢測到接P1.7引腳的列線為低電平「0」,可判斷是S4鍵被按下
P1=0xfd; //第二行置為低電平「0」(P1.1輸出低電平「0」)
if(P14==0) keyval=5; //如果檢測到接P1.4引腳的列線為低電平「0」,可判斷是S5鍵被按下
if(P15==0) keyval=6; //如果檢測到接P1.5引腳的列線為低電平「0」,可判斷是S6鍵被按下
if(P16==0) keyval=7; //如果檢測到接P1.6引腳的列線為低電平「0」,可判斷是S7鍵被按下
if(P17==0) keyval=8; //如果檢測到接P1.7引腳的列線為低電平「0」,可判斷是S8鍵被按下
P1=0xfb; //第三行置為低電平「0」(P1.2輸出低電平「0」)
if(P14==0) keyval=9; //如果檢測到接P1.4引腳的列線為低電平「0」,可判斷是S9鍵被按下
if(P15==0) keyval=10; //如果檢測到接P1.5引腳的列線為低電平「0」,可判斷是S10鍵被按下
if(P16==0) keyval=11; //如果檢測到接P1.6引腳的列線為低電平「0」,可判斷是S11鍵被按下
if(P17==0) keyval=12; //如果檢測到接P1.7引腳的列線為低電平「0」,可判斷是S12鍵被按下
P1=0xf7; //第四行置為低電平「0」(P1.3輸出低電平「0」)
if(P14==0) keyval=13; //如果檢測到接P1.4引腳的列線為低電平「0」,可判斷是S13鍵被按下
if(P15==0) keyval=14; //如果檢測到接P1.5引腳的列線為低電平「0」,可判斷是S14鍵被按下
if(P16==0) keyval=15; //如果檢測到接P1.6引腳的列線為低電平「0」,可判斷是S15鍵被按下
if(P17==0) keyval=16; //如果檢測到接P1.7引腳的列線為低電平「0」,可判斷是S16鍵被按下
依次類推,得到4×4=16個按鍵的鍵值。就知道哪個按鍵被按下。
Ⅳ 單片機 行列矩陣鍵盤
這是一種常見的4*4矩陣鍵盤掃描按鍵的方法。其原理是先把4條列線設置為低電平,然後掃描行線,如有按鍵被按下,必定有一條行線為低電平;再把為低電平的行線設置為低電平,然後掃描列線,如有按鍵被按下,必定有一條列線為低電平。
倒數第3句(不算括弧)的 P3=x; 這里的x中的值是對應行線為低電平,其他7位為高電平。x是P3和0x0f按位或,也就是高四位(行)不變,低四位(列)全置1。但key_code重新讀取P3後,由於前面的操作中把高四位(行)的某一條線置為低電平,按下的鍵導致與該行線接觸的列線必定被拉低為低電平,所以這里key_code的低四位不是 1111,而是有一位是0,這樣結合高四位的值就可以確定鍵碼了。
51單片機中需要注意,雖然向單片機的引腳輸出1,但接著讀回的數據完全受引腳外部電平控制。原則上讀取51單片機的I/O之前必須向向對應I/O寫1,而讀回的數據完全決定於引腳外接電平。
Ⅳ 單片機矩陣式鍵盤產生抖動的原理是什麼..急...寫論文要用到,謝謝!!
產生抖動的原理:當你按下按鍵時,不論你的速度有多快,這個過程都是:接觸-斷開-接觸-斷開。。。。。。可靠接觸,前面10至20毫秒就是抖動狀態,是不穩定狀態,抬起手指時也是如此。
由此可見CPU要正確獲取一次按鍵的信息,就要濾除前後的兩段抖動時間,以免計數錯誤。單片槐頃機矩陣式鍵盤一般採用延時10ms來防抖。
我翻了下敗攔教材,沒找到原文,反正原理就是這樣。既然是寫論文,你自鉛枯陸己組織下語言不就結了。
Ⅵ 單片機中的4×4矩陣鍵盤的鍵值怎麼求
單片機書上應該有講的哦,多查資料。
既然是4x4,即4行4列了,共需要8個I/O口,有8bit數據(如高四位為行4bit,低四位為列4bit)位:xxxx xxxx。還要結合你的程序來編碼鍵值,如果有鍵按下了,查詢所有按鍵的所連接的I/O口電平狀態,每個按鍵需要兩個I/O口,一端連接行(行4bit之一),一端連接列(列4bit之一);若此時按鍵的電平狀態為0010 0001,即十六進制數據0x21,按下的按鍵所對應的鍵值編碼即為0x21。當然為了使用方便,在確定了按下按鍵的編碼後,可對其賦值,我要將它賦值為數字鍵8,方便後續編程使用。例:
//獲取鍵值編碼,由於確定哪個按鍵按下
uchar keyscan(void)//鍵盤掃描函數,使用行列反轉掃描法
{
uchar cord_h,cord_l;//行列值
P3=0x0f; //行線輸出全為0
cord_h=P3&0x0f; //讀入列線值
if(cord_h!=0x0f) //先檢測有無按鍵按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //讀入列線值
P3=cord_h|0xf0; //輸出當前列線值
cord_l=P3&0xf0; //讀入行線值
return(cord_h+cord_l);//鍵盤最後組合碼值
}
}return(0xff); //返回該值
}
while(1)
{
key=keyscan();//調用鍵盤掃描,
//keyVal=0~15表示按鍵對應的功能
switch(key)
{
case 0x7e:keyVal=0;break;//0 按下相應的鍵顯示相對應的碼值
case 0x7d:keyVal=1;break;//1
case 0x7b:keyVal=2;break;//2
case 0x77:keyVal=3;break;//3
case 0xbe:keyVal=4;break;//4
case 0xbd:keyVal=5;break;//5
case 0xbb:keyVal=6;break;//6
case 0xb7:keyVal=7;break;//7
case 0xde:keyVal=8;break;//8
case 0xdd:keyVal=9;break;//9
case 0xdb:keyVal=10;break;//a
case 0xd7:keyVal=11;break;//b
case 0xee:keyVal=12;break;//c
case 0xed:keyVal=13;break;//d
case 0xeb:keyVal=14;break;//e
case 0xe7:keyVal=15;break;//f
}
Ⅶ C 51單片機 矩陣按鍵
首先記住,你的是矩陣鍵盤,就是說一個按鍵A的一端接單片機的一個腳(假設P00),另一個也接一個腳(假設P07),
GPIO_KEY=0x0f; 當沒有按下的話,GPIO_KEY還是等於0x0f的,假設按下A按鍵,由於按鍵兩邊一個接高電平,一個接低電平,按下後,高電平被低電平拉成低電平,也就是說按鍵A兩側都是0,此時不就可以判定了嘛