久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 按鍵程序設計,可以處理加速鍵、一鍵多功能等情況

按鍵程序設計,可以處理加速鍵、一鍵多功能等情況

作者: 時間:2016-11-22 來源:網絡 收藏
我的按鍵程序設計,可以處理加速鍵一鍵多功能等情況
后面有P1口行列式鍵盤程序實例
xwj發表于2005-4-1516:36單片機←返回版面舉報該貼

呵呵
看到論壇在討論按鍵,也把我設計按鍵程序的思路說說,歡迎大家拍磚

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;--退出

所有鍵盤程序對外接口:
unsignedcharKeyGetcode(void)//返回按鍵碼
{
key_ok=0;
return(key_data);
}

bitKeyTest(void)//檢查有無按鍵
{
KeyScan();//鍵掃描
return(key_ok);
}





//--------------------------------------------------------------------------//
//源程序大公開//
//(c)Copyright2001-2005xuwenjun//
//AllRightsReserved//
//V1.00//
//--------------------------------------------------------------------------//
//標 題:P1口行列式鍵盤程序//
//文件名:xwj_hlkey.c//
//版 本:V1.00//
//修改人:徐文軍E-mail:xuwenjun@21cn.com//
//日 期:05-05-13//
//描 述:P1口行列式鍵盤程序//
//聲 明://
//以下代碼僅免費提供給學習用途,但引用或修改后必須在文件中聲明出處.//
//如用于商業用途請與作者聯系.E-mail:xuwenjun@21cn.com//
//有問題請mailtoxuwenjun@21cn.com歡迎與我交流!//
//--------------------------------------------------------------------------//
//老版本:老版本文件名://
//創建人:徐文軍E-mail:xuwenjun@21cn.com//
//日 期:05-05-13//
//--------------------------------------------------------------------------//
#i nclude
#i nclude"xwj_hlkey.h"//P1口行列式鍵盤//
//#i nclude"xwj_bp.h"//峰鳴器

#defineKEYDELAY25
#defineKEYLOOP10
unsignedcharkey_bak;
unsignedcharkey_temp;
unsignedcharkey_old;
unsignedcharkey_data;
bitkey_ok;

//P1口行列式鍵盤//
#defineKEYPIN_LP1//定義鍵掃描列端口為P1低四位輸入//
#defineKEYPIN_HP1//定義鍵掃描行端口為P1高四位掃描輸出//

//內部私有函數//
unsignedcharfnKeycode(unsignedcharkey);//根據鍵盤映射表輸出順序鍵值//

//P1口行列式鍵盤//
//---------------------------------------------------------------------------//
voidKeyScan(void)//鍵掃描
{
unsignedcharsccode,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);//鍵解碼

}
key_old=0;
}
KEYPIN_H=KEYPIN_H|0xf0;
}

//---------------------------------------------------------------------------//

unsignedcharKeyGetcode(void)//返回按鍵碼
{
key_ok=0;
return(key_data);
}

bitKeyTest(void)//檢查有無按鍵
{
KeyScan();//鍵掃描
return(key_ok);
}


評論


技術專區

關閉