1. 4*3按鍵矩陣,怎麼實現按鍵掃描。c51程序。
那看你怎麼連接的 比如是4排3列。。。P1^1--P1^4連接排,P1^5--P1^7連接列。。。。P1^0不能用所以只能一個一個置位了,,
先P1^5=0其他腳都置1(除了留著的P1^0外) 然後掃描P1^1---P1^4,P1^1---P1^4哪個為0那麼P1^5對應的這列和P1^1---P1^4中等0的那排交叉處的按鍵就被按下了; P1^6,P1^7同理。。。。。和4*4的應該是一個道理的。。
2. C51矩陣鍵盤掃描 請解釋一下程序 特別是關鍵步驟 急!!!
C51 P1埠 4X4鍵盤說明
這是一個用C51單片機P1埠製作的4X4鍵盤,p1埠低4位是鍵盤列掃描線,高4位是鍵盤行掃描線,
列掃描線是輸出,行掃描線是輸入。
下面就程序作一個說明
(***)表示注意點
1、首先判斷整個鍵盤有無按下鍵,只要行掃描線輸入不為全1,(1111)即有鍵按下;
P1 = 0xf0;if((P1&0xf0)!=0xf0) 如果無按鍵按下,全1,則返回return -1;
如果有鍵按下則延時,再次判斷有無按鍵按下,Delay();if((P1&0xf0)!=0xf0)如果無按鍵按下則返回return -1。
有鍵按下則繼續,這個過程就是判鍵消抖,避免多次讀鍵值,***或者因為按鍵抖動到讀鍵值的時候無鍵按下,發生錯誤,***列掃描線是輸出全0,P1 = 0xf0。
2、進入讀鍵值了,與上面不同,每一次判斷,***列掃描線只有一根輸出為0,即P1=0xfe,0xfd,0xfb,0xf7;
首先列掃描線P1.0,sCode = 0xfe;如果行掃描線全1,則本列無鍵按下,掃描下一列
sCode = _crol_(sCode,1); ***sCode左移一位,即0xfd,如此掃描4次,行掃描線都全0,則無鍵按下,
返回return -1;
如果行掃描線不全0,就是有鍵按下,現在可以讀鍵值了
kCode = ~P1; //P1=EE,ED...
for(i=0;i<16;i++)
{
if(kCode == KeyCodeTable[i])
return i;
}
1.首先kCode = ~P1;***p1值取反行掃描線可能的是1,2,4,8;同樣列掃描線對應值1,2,4,8
合起p1有16個值,就是KeyCodeTable[i]表的x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,
0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88
如果 if(kCode == KeyCodeTable[i]) 成立,對應的 i 值就是鍵號。
2.返回i值就是鍵號,return i;。
uchar Keys_Scan()
{
uchar sCode,kCode,i,k;
P1 = 0xf0;
if((P1&0xf0)!=0xf0) //掃描列
{
Delay();
if((P1&0xf0)!=0xf0)//消抖
{
sCode = 0xfe;
for(k=0;k<4;k++)
{
P1 = sCode;//查找低位
if((P1&0xf0)!=0xf0)//只有等於才執行else P1和0xf0作與為0xf0 與 同真為真,一假為假
{
kCode = ~P1; //P1=EE,ED...
for(i=0;i<16;i++)
{
if(kCode == KeyCodeTable[i])
return i;
}
}
else
sCode = _crol_(sCode,1);
}
}
}
return -1;
}
3. 矩陣鍵盤掃描程序分析
uchar
keyscan(void)//鍵盤掃描函數,使用行列反轉掃描法
比如:行為低電位,列為高四位
{
uchar
cord_h,cord_l;//行列值
P3=0x0f;
//行線輸出全為0
cord_h=P3&0x0f;
//讀入列線值
if(cord_h!=0x0f)
//這個句話意思是這樣的,如果有按鍵按下的話。那肯定就不是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);
//返回該值
}
好像你的程序解釋得很好了。但是好像這么快,最好要延時下才準的。
我教你按鍵的原理吧
就是那根線如果是高電平的話,遇到底電平就會變為底電平的。所以如果有按鍵按下的話,高電平就會變為低電平了。所以就可以讀取了。
4. 矩陣鍵盤的識別方法
矩陣式結構的鍵盤顯然比直接法要復雜一些,識別也要復雜一些,列線通過電阻接正電源,並將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當按鍵沒有按下時,所有的輸入端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態就可得知是否有鍵按下了。
<1>確定矩陣式鍵盤上何鍵被按下介紹一種「行掃描法」。
行掃描法 行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法,如上圖所示鍵盤,介紹過程如下。
1、判斷鍵盤中有無鍵按下 將全部行線Y0-Y3置低電平,然後檢測列線的狀態。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位於低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。
2、判斷閉合鍵所在的位置 在確認有鍵按下後,即可進入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平後,再逐行檢測各列線的電平狀態。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。
下面給出一個具體的例子:
圖仍如上所示。8031單片機的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0-P1.3分別接有4個上拉電阻到正電源+5V,並把列線P1.0-P1.3設置為輸入線,行線P1.4-P.17設置為輸出線。4根行線和4根列線形成16個相交點。
1、檢測當前是否有鍵被按下。檢測的方法是P1.4-P1.7輸出全「0」,讀取P1.0-P1.3的狀態,若P1.0-P1.3為全「1」,則無鍵閉合,否則有鍵閉合。
2、去除鍵抖動。當檢測到有鍵按下後,延時一段時間再做下一步的檢測判斷。
3、若有鍵被按下,應識別出是哪一個鍵閉合。方法是對鍵盤的行線進行掃描。P1.4-P1.7按下述4種組合依次輸出:
P1.7 1 1 1 0
P1.6 1 1 0 1
P1.5 1 0 1 1
P1.4 0 1 1 1
在每組行輸出時讀取P1.0-P1.3,若全為「1」,則表示為「0」這一行沒有鍵閉合,否則有鍵閉合。由此得到閉合鍵的行值和列值,然後可採用計演算法或查表法將閉合鍵的行值和列值轉換成所定義的鍵值
4、為了保證鍵每閉合一次CPU僅作一次處理,必須去除鍵釋放時的抖動。
鍵盤掃描程序:
從以上分析得到鍵盤掃描程序的流程圖所示。程序如下
SCAN: MOV P1,#0FH
MOV A,P1
ANL A,#0FH
CJNE A,#0FH,NEXT1
SJMP NEXT3
NEXT1: ACALL D20MS
MOV A,#0EFH
NEXT2: MOV R1,A
MOV P1,A
MOV A,P1
ANL A,#0FH
CJNE A,#0FH,KCODE;
MOV A,R1
SETB C
RLC A
JC NEXT2
NEXT3: MOV R0,#00H
RET
KCODE: MOV B,#0FBH
NEXT4: RRC A
INC B
JC NEXT4
MOV A,R1
SWAP A
NEXT5: RRC A
INC B
INC B
INC B
INC B
JC NEXT5
NEXT6: MOV A,P1
ANL A,#0FH
CJNE A,#0FH,NEXT6
MOV R0,#0FFH
RET
<2>確定矩陣式鍵盤上何鍵被按下介紹一種「高低電平翻轉法」。
首先讓P1口高四位為1,低四位為0,。若有按鍵按下,則高四位中會有一個1翻轉為0,低四位不會變,此時即可確定被按下的鍵的行位置。
然後讓P1口高四位為0,低四位為1,。若有按鍵按下,則低四位中會有一個1翻轉為0,高四位不會變,此時即可確定被按下的鍵的列位置。
最後將上述兩者進行或運算即可確定被按下的鍵的位置。
鍵盤處理程序就作這么一個簡單的介紹,實際上,鍵盤、顯示處理是很復雜的,它往往佔到一個應用程序的大部份代碼,可見其重要性,但說到,這種復雜並不來自於單片機的本身,而是來自於操作者的習慣等等問題,因此,在編寫鍵盤處理程序之前,最好先把它從邏輯上理清,然後用適當的演算法表示出來,最後再去寫代碼,這樣,才能快速有效地寫好代碼。
5. 初學單片機矩陣鍵盤逐行掃描,問題困擾好久
P3=0x7f;//高4位作為輸出,低4 位為輸入,作為輸入時要先將其置1
每次掃描時高4位中只有一根線是0,如果沒有按鍵按下,高4位中的0就不會傳到低4位上
那麼讀P3的低4位,它將仍保持原狀態4個1(0x0f)
反之,若讀到的不是4個1,說明有按鍵按下了
temp=P3;//將P3口的狀態讀回來
temp=temp&0x0f;//只取低4 位
if(temp!=0x0f)//如果不全為1,說明有按鍵按下
{
Delay1ms(5);//消抖動
temp=P3;//再次將P3口的狀態讀回來
temp=temp&0x0f;//仍然只取低4 位
if(temp!=0x0f)//再次判斷是不是4 個1
{
temp=P3;//是 再次讀回,因高4位送出的是7,讀回也只能是7
switch(temp)//1 根輸出線上(此處是最高位)掛有4 個按鍵,因此讀回的數值只有4 種可能
其它3 根線上也各掛4個按鍵,但你此時按下也不起作用,因它們輸出是1
高4位以很快的速度輪流輸出低電平,且你按任何鍵都要持續幾十到上百ms,因此你按任何鍵都有可被掃描到
7二進制是0111 b二進制是1011 d二進制是1011 e二進制是1110
{
case 0x7e:num=1;xianshi=table[num-1];//num是你自己定義的
break;
case 0x7d:num=2;xianshi=table[num-1];
break;
case 0x7b:num=3;xianshi=table[num-1];
break;
case 0x77:num=4;xianshi=table[num-1];
break;
}
6. 單片機匯編矩陣鍵盤實驗(掃描法)
關於掃描按鍵的原理,可以看下面這篇文章。
本文以循序漸進的思路,引導大家思考如何用最少的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個。
最後再說下,如果實際設計時,還是按思路四設計好,軟體也沒那麼麻煩。如果是你的話你會選擇哪種方法呢?你還有沒有其他的設計方法呢?
7. 非編碼鍵盤有幾種常見的掃描方法簡要介紹這幾種掃描方法
非編碼式技術按照代碼轉換方式,鍵盤可以分為編碼式和非編碼式兩種。編碼式鍵盤是通過數字電路直接產生對應於按鍵的ASCⅡ碼,這種方式目前很少使用。非編碼式鍵盤將案件排列成矩陣的形勢,由硬體或軟體隨時對矩陣掃描,一旦某一鍵被按下
8. 10、行列式硬體(矩陣鍵盤掃描)掃描原理,以及軟硬體如何實現
按鍵有2個管腳,一個管腳接一個IO口,自定義MCU的IO口其中一個為輸入、另一個為輸出,在對輸出進行翻轉後讀IO口狀態,即輸出為0時讀一次狀態輸出為1時讀一次狀態,如果按鍵沒有按下則兩次狀態相同且為初始狀態,如果按鍵按下則狀態改變,根據預定義好的狀態代碼即可確認按鍵。
9. 51單片機4*4矩陣鍵盤有哪幾種掃描方式
行掃描法,線反轉法,你用專用介面不就簡單多了,例如8279