『壹』 單片機 行列矩陣鍵盤
這是一種常見的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,而讀回的數據完全決定於引腳外接電平。這意味著,即使輸出信號,如果外部電平未改變,讀取的數據可能仍然是之前的值,因此在讀取I/O之前應確保輸出高電平。
此外,為了確保准確讀取按鍵狀態,通常在掃描行線和列線時,需要快速切換電平,以避免讀取錯誤的電平狀態。例如,在設置行線為低電平後,應立即掃描對應的列線,然後再快速恢復行線為高電平,繼續下一個行線的掃描。
在實際應用中,還需要注意按鍵的抖動問題,這可能會導致誤觸發。可以通過軟體延時或硬體去抖動電路來解決這個問題。軟體延時通常是通過增加讀取按鍵狀態之間的延時來實現,而硬體去抖動電路則是在按鍵兩端並聯一個電容和電阻,利用RC電路的充放電特性來濾除抖動。
總的來說,4*4矩陣鍵盤的掃描方法需要精確控制電平切換和讀取時機,同時還需要考慮按鍵抖動的影響,以確保按鍵檢測的准確性。
『貳』 單片機矩陣式鍵盤顯示設計中,如何處理多個按鍵同時按下的情況
矩陣鍵盤悉橘陪有多種鍵盤演算法,如果是行列掃描的話,多個按鍵同時按下是可以得到所有的鍵值,如果是線反轉法的話,就會有誤判的可能。
行列掃描的話,睜蠢一次只掃描一行按鍵,而且對伍源應行的按鍵的狀態也會通過互相獨立的IO得到。
『叄』 矩陣鍵盤矩陣式鍵盤的按鍵識別方法
矩陣鍵盤的按鍵識別方法通常採用兩種策略:行掃描法和高低電平翻轉法。
1. 行掃描法:這是最常見的識別方法。首先,將所有行線(如Y0-Y3)置低電平,檢查列線狀態。若有一列變為低電平,則說明有鍵按下,其位置在該列線與4個行線交叉的按鍵中。如果所有列線都保持高電平,則無鍵按下。接著,逐行檢查列線,找到具體的閉合鍵。例如,用8031單片機的P1口作為I/O口,將列線接到低4位,行線接到高4位,通過逐行輸出特定組合來識別閉合鍵的行值和列值。
2. 高低電平翻轉法:這種方法更簡潔。首先將P1口的高四位設為1,低四位設為0,觀察是否有鍵按下,鍵按下時對應的高四位中的一個會變為0。然後將P1口的高四位設為0,低四位設為1,查看低四位的變化,從而確定列位置。最後通過或運算確定鍵的具體位置。實際應用中,鍵盤處理是復雜的過程,它占據了應用程序的大部分代碼,因此在編寫之前,理解邏輯並設計合適的演算法至關重要。
矩陣鍵盤是單片機外部設備中所使用的排布類似於矩陣的鍵盤組. 矩陣鍵盤原理圖
『肆』 單片機中的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
}