按鍵(獨立按鍵、矩陣鍵盤)——附帶程序

一、獨立按鍵:

簡介:

接觸式按鍵,又叫輕觸開關

在這裏插入圖片描述

這裏是引用

接觸式按鍵是靠機械的接觸來實現開和關。這種接觸方式存在接觸不穩定的狀態,即存在抖動。

該圖爲理想狀態下的按鍵波形,無抖動
這裏是引用

該圖爲實際中按鍵波形,存在抖動在這裏插入圖片描述
一般抖動時間爲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 字碼表的數
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章