即將獨立按鍵進行重新組合。
按鍵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結束末尾加了分號,導致程序一直報錯!!!