天天看點

獨立按鍵和矩陣按鍵判斷按鍵是否被按下的方法

獨立按鍵

獨立按鍵的一端接地,另一端與單片機的某個 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。

繼續閱讀