一、獨立按鍵:
簡介:
接觸式按鍵,又叫輕觸開關
接觸式按鍵是靠機械的接觸來實現開和關。這種接觸方式存在接觸不穩定的狀態,即存在抖動。
該圖爲理想狀態下的按鍵波形,無抖動
該圖爲實際中按鍵波形,存在抖動
一般抖動時間爲10~20ms
消抖:
①硬件消抖:
成本高;影響產品集成度,一般不採用。
②軟件消抖:
編程實現,不增加硬件成本,不影響產成品集成度。
代碼:
void delay(int xms){ //延時函數 x ms
unsigned int i, j;
for(i=0; i<xms; ++i)
for(j=0; j<110; ++j)
;
}
void key(){
if(key_down==0){ //第一次檢測按下
delay(20); //一般延時20ms,進行消抖
if(key_down==0){ //第二次檢測按下,按鍵是真正的按下了
.
.
.
}
while(!key_down); //檢測按鍵是否鬆開(彈起),按鍵鬆開則退出
}
}
二、矩陣鍵盤 :
當按鍵較少時,可以採用獨立按鍵,
但當需要多個按鍵時,接獨立按鍵就會佔用單片機珍貴的 I/O 資源,所以當需要大量按鍵時,常採用矩陣鍵盤。
矩陣鍵盤的檢測方法有很多,本文介紹行列反轉掃描法。
行列反轉掃描法:
①先進行行掃描
P2 ^0 ~ P2 ^3 置低電平,P2 ^4 ~ P2 ^7置高電平,按鍵,保存 P0 口狀態到 temp1
②再進行列掃描
P2 ^0 ~ P2 ^3 置高電平,P2 ^4 ~ P2 ^7置低電平,按鍵,保存 P0 口狀態到 temp2
③計算
將 temp1 與 temp2 進行或運算,將結果 result 轉化爲 HEX 數據,在按鍵表中查詢,確定是哪個按鍵按下
按鍵對照表:
手算真累!!!
三、矩陣鍵盤實驗
效果展示:
51單片機 矩陣鍵盤 行列掃描法
仿真電路圖:
簡略仿真一下,接線粗糙,大神勿噴!!
代碼:
#include<reg51.h>
typedef unsigned char uchar;
typedef unsigned int uint;
uchar code num[16]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x08, 0x03, 0x46, 0x21, 0x06, 0x0E}; // 0~f 字碼
uchar code key_check[16]={0xEE, 0xDE, 0xBE, 0x7E, 0xED, 0xDD, 0xBD, 0x7D, 0xEB, 0xDB, 0xBB, 0x7B, 0xE7, 0xD7, 0xB7, 0x77}; // 按鍵檢查表
void delay(int xms){ // 延時函數
uint i, j;
for(i=0; i<xms; ++i)
for(j=0; j<110; ++j)
;
}
void main(){
uchar i, temp, result;
P3 = 0xff; // 未按鍵時,數碼管不顯示
while(1){
P2 = 0xf0; // 行掃描
if(P2 != 0xf0){
delay(15); // 延時消抖
if(P2 != 0xf0){
temp = P2;
P2 = 0x0f; //列掃描
result = temp | P2; //計算結果,與按鍵檢查表對照
for(i=0; i<16; ++i){ // 檢查按鍵表, 找出是哪個按鍵按下
if(result == key_check[i]){
break; // 保留 i 值
}
}
}
while(P2==0xf0) ;
P3 = num[i]; // i 值對應 num 字碼表的數
}
}
}