|

由于單片機I/o口的有限,當需要多個按鍵的時候,常用矩陣鍵盤作為輸入設備.
由于按鍵按下后,松開得到的波形實際中不是理想化的方波,會出現機械抖動,對后續單片機檢測按鍵帶來麻煩,

一般教材上基本都是利用延時去抖動:基本套路都:
void key()
{
if(k1==0) //如果按鍵按下
{
delay_10ms();延時去抖動
if(k1==0) 再次判斷
{
你要的功能
}
}
}
由于10ms是理論上人們按鍵按下后到松手所要的大概時間,由于個體差異,和按鍵的機械靈活度有差異,導致可能出現按鍵按太快,沒反應,按時間太長導致單片機效率降低等不確定因素.
可以采用判斷是否是第一次按下來進行檢測,可以大大提高效率,當你按鍵按了再快也能檢測到。
程序如下:
//---------------------------------------------------------------------
#include <reg52.h>
#define key P2
int val;
char code sign[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void delay_10ms();
void key_scan(); //矩陣按鍵函數聲明
void main()
{
while(1)
{
P0=sign[val];
key_scan();
}
}
void key_scan()
{
static char a,b; //a用于判斷是不是第一次按下,b用于稍微延時
char state; //記錄鍵值
key=0x0f;
if(key!=0x0f) //如果有按鍵按下
{
state=key; //記錄第一次按鍵狀態
if(a==0) //如果第一次按下
{
b++; //略微延時 不需要延時10ms以提高單片機效率
if(b>3)
{
if(key==state) //判斷鍵值是否和第一次一致
{
a=1,b=0; //復位狀態值 a==1說明已經按下,等待后續松開
key=0x0f; //測試列
switch(key)
{
case (0x07): val=0;break;
case (0x0b): val=1;break;
case (0x0d): val=2;break;
case (0x0e): val=3;break;
}
key=0xf0; // 測試行
switch(key)
{
case (0x70): val=val;break;
case (0xb0): val=val+4;break;
case (0xd0): val=val+8;break;
case (0xe0): val=val+12;break;
}
}
}
}
}
else
{
a=b=0; //松開后復位狀態機
}
}
|
|