1、一般都不在鍵盤程序中延時,而是通過隔一段時間調用(比如10毫秒)來掃描按鍵,以盡量釋放CPU資源;
2、所有鍵盤程序基本上都是一個模式,可以處理加速鍵、一鍵多功能等情況;
3、對外接口只有2個,換用不同硬件的鍵盤只需把該鍵盤程序加入工程編譯即可,其他不需要作任何改動,非常方便。
基本上都是一個模式:
有鍵?--YES——和上次相同?--No--Keyold=0;退出
| |
| YES--Keyold++;
| |
| Keyold==首鍵延時KEYDELAY?--No--退出
| |
| YES--Keyok=1; //按下不放一定時間發首鍵,后面發加速鍵
| 保存鍵值到Keydata;(必要時譯碼)
| Keyold=KEYDELAY-KEYLOOP(按住不放的延時);--退出
|
No--Keyold==0?--YES--退出
|
N0--Keyok=1; //不為0說明按了鍵再放開,當然作按鍵有效處理
保存鍵值到Keydata;(必要時譯碼)
Keyold=0;--退出
所有鍵盤程序對外接口:
unsigned char KeyGetcode(void) //返回按鍵碼
{
key_ok=0;
return(key_data);
}
bit KeyTest(void) //檢查有無按鍵
{
KeyScan(); //鍵掃描
return(key_ok);
}
//--------------------------------------------------------------------------//
// 源程序大公開 //
// (c) Copyright 2001-2005 xuwenjun //
// All Rights Reserved //
// V1.00 //
//--------------------------------------------------------------------------//
//標 題: P1口行列式鍵盤程序 //
//文件名: xwj_hlkey.c //
//版 本: V1.00 //
//修改人: 徐文軍 E-mail:xuwenjun@21cn.com //
//日 期: 05-05-13 //
//描 述: P1口行列式鍵盤程序 //
//聲 明: //
// 以下代碼僅免費提供給學習用途,但引用或修改后必須在文件中聲明出處. //
// 如用于商業用途請與作者聯系. E-mail:xuwenjun@21cn.com //
// 有問題請mailto xuwenjun@21cn.com 歡迎與我交流! //
//--------------------------------------------------------------------------//
//老版本: 無 老版本文件名: //
//創建人: 徐文軍 E-mail:xuwenjun@21cn.com //
//日 期: 05-05-13 //
//--------------------------------------------------------------------------//
#include <reg52.h>
#include "xwj_hlkey.h" // P1口行列式鍵盤 //
//#include "xwj_bp.h" //峰鳴器
#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);
}
按鍵程序設計,可以處理加速鍵、一鍵多功能等情況
更新時間: 2006-03-09 14:46:55來源: 粵嵌教育瀏覽量:2639