10.矩陣按鍵

在這裏插入圖片描述
即將獨立按鍵進行重新組合。
按鍵IO口前都有加上拉電阻。
掃描原理:
方法一:
逐行掃描:通過高四位輪流輸出低電平來對矩陣鍵盤進行逐行掃描,當低四位接收到的數據不全爲1的時候,說明有按鍵按下,然後通過接收到的數據是哪一位爲0來判斷是哪一個按鍵被按下。
方法二:
行列掃描:我們可以通過高四位全部輸出低電平,低四位輸出高電平。當接收到的數據,低四位不全爲高電平時,說明有按鍵按下,然後通過接收的數據值,判斷是哪一列有按鍵按下,然後再反過來,高四位輸出高電平,低四位輸出低電平,然後根據接收到的高四位的值判斷是那一行有按鍵按下,這樣就能夠確定是哪一個按鍵按下了。
由矩陣按鍵變爲獨立按鍵:
將連接四個按鍵的一條線持續輸出低電平,其他都輸出高電平(避免對所用線路影響)

通過矩陣按鍵控制數碼管最後一位顯示矩陣按鍵對應的數字,程序如下:
橫向依次爲0123,4567,89AB,CDEF:

#include<reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
#define GPIO_KEY P1//定義矩陣按鍵IO口爲P1
#define GPIO_DIG P0//定義靜態數碼管IO口爲P0
u8 KeyValue;//每一個按鍵用一個用KeyValue指代
u8 a;//爲下面按下時間檢測做準備
u8 code smgduanxuan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                     0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(u16 i)
{
	while(i--);
}
void KeyDown()
{
	GPIO_KEY=0x0f;//先給高四位低電平,低四位高電平,根據低四位哪一位不是高電平來判斷是哪一列
	if(GPIO_KEY!=0x0f)
	{
		delay(1000);//消抖
		if(GPIO_KEY!=0x0f)
		{
			GPIO_KEY=0x0f;//重新賦值
			switch(GPIO_KEY)
			{
				case 0x07: KeyValue=0;break;
				case 0x0b: KeyValue=1;break;
				case 0x0d: KeyValue=2;break;
				case 0x0e: KeyValue=3;break;
			}//記下列數,0123
			GPIO_KEY=0xf0;//再給高四位高電平,低四位電平,根據高四位哪一位不是高電平來判斷是哪一行
			switch(GPIO_KEY)
			{
				case 0x70: KeyValue=KeyValue;break;
				case 0xb0: KeyValue=KeyValue+4;break;
				case 0xd0: KeyValue=KeyValue+8;break;
				case 0xe0: KeyValue=KeyValue+12;break;
			}//記下行數,+0+4+8+12
			while((a<50)&&(GPIO_KEY!=0xf0))
			{
				delay(1000);
				a++;
			}//程序跳出循環的條件是,鬆手或者按下足夠一段時間(避免CPU的持續佔用)
		}
	}
}
void main()
{	
	LSA=0; 
	LSB=0;
	LSC=0;//選擇靜態數碼管顯示
	while(1)
	{
		KeyDown();
		GPIO_DIG=smgduanxuan[KeyValue];//給靜態數碼管一個顯示的值
	}
}

#可以通過修改KeyValuede的賦值來實現縱向。
???如何測試出鬆手檢測的效果
???使用矩陣按鍵時蜂鳴器同時會發出響聲,具體分析原因

謹記程序編寫要嚴謹,避免因爲程序輸入的錯誤而浪費時間,本次編寫過程出現了#define結束末尾加了分號,導致程序一直報錯!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章