獨立按鍵
獨立按鍵的一端接地,另一端與單片機的某個 I/O 口相連, 開始時先給該 IO 口賦一高電平,然後讓單片機不斷地檢測該 I/O 口是否變為 低電平,當按鍵閉合時,即相當于該 I/O 口通過按鍵與地相連,變成低電平, 程式一旦檢測到 I/O 口變為低電平則說明按鍵被按下。
矩陣按鍵
行列描述法:
先送一列為低電平,其餘幾列全為高電平(此時我們确 定了列數),然後立即輪流檢測一次各行是否有低電平,若檢測到某一行為低電 平(這時我們又确定了行數),則我們便可确認目前被按下的鍵是哪一行哪一列 的,用同樣方法輪流送各列一次低電平,再輪流檢測一次各行是否變為低電平,這樣即可檢測完所有的按鍵,當有鍵被按下時便可判斷出按下的鍵是哪一個鍵。當然我們也可以将行線置低電平,掃描列是否有低電平。進而達到整個鍵盤的檢測。
線翻轉法:
使所有行線為低電平時,檢測所有列線是否有低電平,如果 有,就記錄列線值;然後再翻轉,使所有列線都為低電平,檢測所有行線的值, 由于有按鍵按下,行線的值也會有變化,記錄行線的值。進而就可以檢測到全部 按鍵。
行列描述法的列子
#include "reg52.h" //此檔案中定義了單片機的一些特殊功能寄存器
typedef unsigned int u16; //對資料類型進行聲明定義
typedef unsigned char u8;
#define GPIO_DIG P0
#define GPIO_KEY P1
u8 Key_value; //用來存放讀取到的鍵值
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
/*******************************************************************************
* 函 數 名 : delay
* 函數功能 : 延時函數,i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 數 名 : KeyDown
* 函數功能 : 檢測有按鍵按下并讀取鍵值
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
int Key_down(void)
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
{
delay(1000);//延時10ms進行消抖
if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
{
//測試列
GPIO_KEY = 0xF0;
switch(GPIO_KEY)
{
case(0xe0): Key_value = 0;break;
case(0xd0): Key_value = 1;break;
case(0xb0): Key_value = 2;break;
case(0x70): Key_value = 3;break;
}
//測試行
GPIO_KEY = 0x0F;
switch(GPIO_KEY)
{
case(0X0e): Key_value = Key_value;break;
case(0X0d): Key_value = Key_value+4;break;
case(0X0b): Key_value = Key_value+8;break;
case(0X07): Key_value = Key_value+12;break;
}
}
}
while((a<50)&&(GPIO_KEY!=0x0f)) //檢測按鍵松手檢測
{
delay(100);
a++;
}
}
/*******************************************************************************
* 函 數 名 : main
* 函數功能 : 主函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
while(1)
{
Key_value = Key_down(); //按鍵判斷函數
GPIO_DIG=~smgduan[Key_value]; //
}
}
按鍵消抖
使用延時函數來消抖,延時10ms來進行消抖。delay(1000);相當于10ms。