一個很精妙的單鍵程序:
bit flag=0; 定義標志
以下是鍵盤處理程序:
void scankey() //掃描按鍵
{
if(p10= =0&&flag= =0) //p10口按鍵及處理程序,其中flag如果為1就不用再掃描 就是這里,沒有消抖動了~是怎么回事咧
{
delay(10);
flag=1;
delay(5);
}
if(p10= =1&&flag= =1) //如果p10為1,flag為1說明已經被按下并抬起
{
TR0=!TR0; //松開時相應
flag=0; //標志清零,為下次按鍵做準備(其實為一次處理)
}
}
以下是另一個一個檢測的主要部分:
#include <reg51.h>
#include <intrins.h>
#define key_port P0 //鍵盤接口定義
sbit key_port_0=key_port^0;
sbit key_port_1=key_port^1;
sbit key_port_2=key_port^2;
sbit key_port_3=key_port^3;
if(Key_down==PRESSED)
{
while(Key_down==PRESSED) //計數,用來判斷是長按還是短按
{
if( (counter++) > Long_cnt) //counter>65534:長按,
{
Key_Code=KEY_FP_DOWN; //KEY1長按時返回的鍵值
// counter=0;
return;
}
}
if(counter<=Long_cnt && counter>Short_cnt) //counter<=65534:短按,counter>20:消抖動
{
Key_Code=KEY_FP_DOWN; //KEY1短按時返回的鍵值
// counter=0;
return;
}
}
以下程序可以作為一個單獨的 key.c 文件包含在項目里面:
#define KEYDELAY 25 /*首鍵延遲次數*/
#define KEYLOOP 10 /*連續鍵間隔次數,需小于KEYDELAY*/
unsigned char key_bak;
unsigned char key_temp;
unsigned char key_old;
unsigned char key_data;
bit key_ok;
// P1口行列式鍵盤 //
#define KEYPIN_L P1 // 定義鍵掃描列端口為 P1低四位輸入 //
#define KEYPIN_H P1 // 定義鍵掃描行端口為 P1高四位掃描輸出 //
//內部私有函數 //
unsigned char fnKeycode(unsigned char key); // 根據鍵盤映射表輸出順序鍵值 //
// P1口行列式鍵盤 //
//---------------------------------------------------------------------------//
void KeyScan(void) //鍵掃描
{
unsigned char sccode,recode;
KEYPIN_L = KEYPIN_L|0x0f; // P1低四位為列線輸入 //
KEYPIN_H = KEYPIN_H&0x0f; // P1高四位為行線發全零掃描碼 //
if ((KEYPIN_L&0x0f) != 0x0f) //有鍵按下
{
key_temp = 鍵值; //鍵掃描,獲得鍵值
if (key_temp == key_bak)
{
key_old++;
// if (key_old==KEYDELAY) //連續鍵,不要則把此if屏蔽
// {
// key_ok=1;
// key_data=fnKeycode(key_temp); //鍵*
// key_old=KEYDELAY-KEYLOOP;
// }
}
else
{
key_old=0;
key_bak=key_temp;
}
}
else //鍵抬起
{
if (key_old)
{
key_ok=1;
key_data=fnKeycode(key_temp); //鍵*
/* // if (key_old==100) //加上時間,不同時間不同功能,與連續鍵沖突
// {
// bp(1);
// key_data += 0x10;
// }
// if (key_old==200)
// {
// bp(2);
// key_data += 0x20;
// }
*/
//}
key_old=0;
}
KEYPIN_H = KEYPIN_H|0xf0;
}
//---------------------------------------------------------------------------//
unsigned char KeyGetcode(void) //返回按鍵碼
{
key_ok=0;
return(key_data);
}
bit KeyTest(void) //檢查有無按鍵
{
KeyScan(); //鍵掃描
return(key_ok);
bit flag=0; 定義標志
以下是鍵盤處理程序:
void scankey() //掃描按鍵
{
if(p10= =0&&flag= =0) //p10口按鍵及處理程序,其中flag如果為1就不用再掃描 就是這里,沒有消抖動了~是怎么回事咧
{
delay(10);
flag=1;
delay(5);
}
if(p10= =1&&flag= =1) //如果p10為1,flag為1說明已經被按下并抬起
{
TR0=!TR0; //松開時相應
flag=0; //標志清零,為下次按鍵做準備(其實為一次處理)
}
}