新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 按鍵程序設(shè)計(jì),可以處理加速鍵、一鍵多功能等情況

按鍵程序設(shè)計(jì),可以處理加速鍵、一鍵多功能等情況

作者: 時(shí)間:2016-11-22 來源:網(wǎng)絡(luò) 收藏
我的按鍵程序設(shè)計(jì),可以處理加速鍵、一鍵多功能等情況
后面有P1口行列式鍵盤程序?qū)嵗?br />xwj發(fā)表于2005-4-1516:36單片機(jī)←返回版面舉報(bào)該貼

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

1、一般都不在鍵盤程序中延時(shí),而是通過隔一段時(shí)間調(diào)用(比如10毫秒)來掃描按鍵,以盡量釋放CPU資源;
2、所有鍵盤程序基本上都是一個(gè)模式,可以處理加速鍵、一鍵多功能等情況;
3、對(duì)外接口只有2個(gè),換用不同硬件的鍵盤只需把該鍵盤程序加入工程編譯即可,其他不需要作任何改動(dòng),非常方便。


基本上都是一個(gè)模式:
有鍵?--YES——和上次相同?--No--Keyold=0;退出
||
|YES--Keyold++;
||
|Keyold==首鍵延時(shí)KEYDELAY?--No--退出
||
|YES--Keyok=1;//按下不放一定時(shí)間發(fā)首鍵,后面發(fā)加速鍵
|保存鍵值到Keydata;(必要時(shí)譯碼)
|Keyold=KEYDELAY-KEYLOOP(按住不放的延時(shí));--退出
|
No--Keyold==0?--YES--退出
|
N0--Keyok=1;//不為0說明按了鍵再放開,當(dāng)然作按鍵有效處理
保存鍵值到Keydata;(必要時(shí)譯碼)
Keyold=0;--退出

所有鍵盤程序?qū)ν饨涌?
unsignedcharKeyGetcode(void)//返回按鍵碼
{
key_ok=0;
return(key_data);
}

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





//--------------------------------------------------------------------------//
//源程序大公開//
//(c)Copyright2001-2005xuwenjun//
//AllRightsReserved//
//V1.00//
//--------------------------------------------------------------------------//
//標(biāo) 題:P1口行列式鍵盤程序//
//文件名:xwj_hlkey.c//
//版 本:V1.00//
//修改人:徐文軍E-mail:xuwenjun@21cn.com//
//日 期:05-05-13//
//描 述:P1口行列式鍵盤程序//
//聲 明://
//以下代碼僅免費(fèi)提供給學(xué)習(xí)用途,但引用或修改后必須在文件中聲明出處.//
//如用于商業(yè)用途請(qǐng)與作者聯(lián)系.E-mail:xuwenjun@21cn.com//
//有問題請(qǐng)mailtoxuwenjun@21cn.com歡迎與我交流!//
//--------------------------------------------------------------------------//
//老版本:老版本文件名://
//創(chuàng)建人:徐文軍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高四位掃描輸出//

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

//P1口行列式鍵盤//
//---------------------------------------------------------------------------//
voidKeyScan(void)//鍵掃描
{
unsignedcharsccode,recode;
KEYPIN_L=KEYPIN_L|0x0f;//P1低四位為列線輸入//
KEYPIN_H=KEYPIN_H&0x0f;//P1高四位為行線發(fā)全零掃描碼//
if((KEYPIN_L&0x0f)!=0x0f)//有鍵按下
{
key_temp=鍵值;//鍵掃描,獲得鍵值
if(key_temp==key_bak)
{
key_old++;
if(key_old==KEYDELAY)//連續(xù)鍵,不要?jiǎng)t把此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);
}


評(píng)論


技術(shù)專區(qū)

關(guān)閉