在萬(wàn)利STM32學(xué)習(xí)板的USB搖桿例程中,搖桿的按鍵處理并沒(méi)有消抖處理,因此重新修改了搖桿的驅(qū)動(dòng),順便還增加了兩個(gè)按鍵以及搖桿中鍵下壓的驅(qū)動(dòng),以方便直接使用。只要定時(shí)調(diào)用(幾ms)KyeScan函數(shù),就會(huì)將當(dāng)前按鍵的改變情況和按住情況保存在對(duì)應(yīng)的變量中。
當(dāng)某個(gè)鍵按下時(shí),在KeyDown中對(duì)應(yīng)的位被設(shè)置為1;某個(gè)鍵被釋放時(shí),KeyUp中對(duì)應(yīng)的位為1;KeyPress中保存的是當(dāng)前按鍵的按住情況,某位為1時(shí)表示對(duì)應(yīng)的鍵被按住。
KeyDown和KeyUp中的值使用后要手動(dòng)清除,表示已經(jīng)處理了這個(gè)事件,而KeyPress不用手動(dòng)清除,它一直反映按鍵的按住情況。
萬(wàn)利的板子上有兩個(gè)按鍵KEY_2和KEY_3,另外還有一個(gè)搖桿:KEY_SEL,KEY_LEFT,KEY_RIGHT,KEY_UP,KEY_DOWN,以及搖桿的中鍵KEY_SEL。為了統(tǒng)一名稱(chēng),都叫成了KEY。要獲取某個(gè)按鍵的信息,只要跟對(duì)應(yīng)的宏進(jìn)行與操作即可,實(shí)際使用方法參考如下:
if(KeyDown & KEY_UP) //搖桿往上移動(dòng)鍵按下
if(KeyDown & KEY_RIGHT) //搖桿往右移動(dòng)鍵按下
if(KeyPress & KEY_DOWN) //搖桿往下移動(dòng)被按住了
if(KeyUp & KEY_LEFT) //搖桿往左移動(dòng)由原來(lái)的按住變成了松開(kāi)
if(KeyUp || KEY_DOWN) //有按鍵狀態(tài)變動(dòng)
KeyUp &=~(KEY_2); //清除KEY2釋放事件
KeyDown&=~(KEY_SEL); //清除搖桿中鍵按下事件
鍵盤(pán)驅(qū)動(dòng)的實(shí)際代碼如下:
unsigned char KeyCurrent,KeyOld,KeyNoChangedTime;
unsigned char KeyPress;
unsigned char KeyDown,KeyUp,KeyLast;
#define KEY_SEL 0x01
#define KEY_RIGHT 0x02
#define KEY_LEFT 0x04
#define KEY_DOWN 0x10
#define KEY_UP 0x08
#define KEY_2 0x20
#define KEY_3 0x40
#define KeyIO ((((GPIOD->IDR)>>11)&0x1F)|((((GPIOD->IDR)>>3)&0x03)<<5))
void KeyScan(void);
/********************************************************************
函數(shù)功能:鍵盤(pán)掃描。每5ms調(diào)用一次
入口參數(shù):無(wú)。
返 回:無(wú)。
備 注:無(wú)。
********************************************************************/
void KeyScan(void)
{
//開(kāi)始鍵盤(pán)掃描
//保存按鍵狀態(tài)到當(dāng)前按鍵情況
//KeyCurrent總共有8個(gè)bit
//當(dāng)某個(gè)開(kāi)關(guān)按下時(shí),對(duì)應(yīng)的bit為1
KeyCurrent=~KeyIO;
if(KeyCurrent!=KeyOld) //說(shuō)明按鍵情況發(fā)生了改變
{
KeyNoChangedTime="0"; //鍵盤(pán)按下時(shí)間為0
KeyOld="KeyCurrent"; //保存當(dāng)前按鍵情況
return;
}
else
{
KeyNoChangedTime++; //按下時(shí)間累計(jì)
if(KeyNoChangedTime>=1) //如果按下時(shí)間足夠
{
KeyNoChangedTime="1";
KeyPress="KeyOld"; //保存按鍵
KeyDown|=(~KeyLast)&(KeyPress); //求出新按下的鍵
KeyUp|=KeyLast&(~KeyPress); //求出新釋放的鍵
KeyLast="KeyPress"; //保存當(dāng)前按鍵情況
}
}
}
在調(diào)用鍵盤(pán)掃描函數(shù)之前,記得先對(duì)相應(yīng)的I/O口初始化為高阻輸入模式,搖桿連接在PD11~15上,KEY2、KEY3連接在PD3、PD4上。
STM32/STM8
意法半導(dǎo)體/ST/STM
評(píng)論