<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 用狀態(tài)機做獨立按鍵檢測

用狀態(tài)機做獨立按鍵檢測

作者: 時(shí)間:2012-10-27 來(lái)源:網(wǎng)絡(luò ) 收藏
人機界面最重要的就是按鍵了,覺(jué)得按鍵做的最好的就是手機的按鍵了,有長(cháng)按、敵探、連發(fā)等功能。還有組合等。一個(gè)好的按鍵程序用書(shū)本上學(xué)的方法已經(jīng)不能適應工程的需要了,為此人們設計出一種檢測按鍵的方法。 在一個(gè)系統中按鍵是隨機的,因此系統軟件對按鍵要一直循環(huán)查詢(xún),由于過(guò)程需要進(jìn)行消抖處理,因此取的時(shí)間序列為10ms,這樣不僅可以跳過(guò)按鍵抖動(dòng)的影響,同時(shí)也小于0.3-0.5秒的,不會(huì )將按鍵的操作過(guò)程丟失。 程序實(shí)現方法,用定時(shí)器定時(shí)10ms,每隔10ms檢測一次按鍵,將一個(gè)按鍵的檢測過(guò)程分為幾個(gè)不同的狀態(tài),最簡(jiǎn)單的分為 初使狀態(tài)-按鍵閉合確認狀態(tài)-按鍵釋放狀態(tài),如果要求按鍵實(shí)現的功能越多,狀態(tài)也就越多 ,比如還有常用的長(cháng)按狀態(tài)。以下是一個(gè)按鍵程序,僅供參考。 程序基于A(yíng)VR單片機, key.h文件的一部分
#define KEY0_PORT           PORTD#define KEY0_DDR            DDRD#define KEY0_PIN               PIND#define KEY0                        PD0#define KEY1_PORT           PORTD#define KEY1_DDR             DDRD#define KEY1_PIN                PIND#define KEY1                        PD1#define KEY2_PORT           PORTD#define KEY2_DDR              DDRD#define KEY2_PIN                    PIND#define KEY2                   PD2#define KEY3_PORT           PORTD#define KEY3_DDR          DDRD#define KEY3_PIN                    PIND#define KEY3                   PD3#define KEY0_STATUS    (BIT_STATUS(KEY0_PIN,KEY0))#define KEY1_STATUS     (BIT_STATUS(KEY1_PIN,KEY1))#define KEY2_STATUS    (BIT_STATUS(KEY2_PIN,KEY2))#define KEY3_STATUS   (BIT_STATUS(KEY3_PIN,KEY3))#define KEY_SERIES_FLAG     200      //按鍵連發(fā)開(kāi)始所需時(shí)間長(cháng)度#define KEY_SERIES_DELAY    5       //按鍵連發(fā)的時(shí)間間隔長(cháng)度//按鍵屬性#define KEY_DOWN        0xA0#define KEY_LONG        0xB0#define KEY_LIAN        0xC0#define KEY_UP          0xD0#define KEY_LONG        0xB0#define KEY_LIAN        0xC0#define KEY_UP          0xD0#define NO_KEY          0x00#define KEY0_DOWN       0X01#define KEY1_DOWN       0X02#define KEY2_DOWN       0X03#define KEY3_DOWN       0X04#define KEY0_PRESS      (KEY_DOWN|KEY0_DOWN)#define KEY1_PRESS      (KEY_DOWN|KEY1_DOWN)#define KEY2_PRESS      (KEY_DOWN|KEY2_DOWN)#define KEY3_PRESS      (KEY_DOWN|KEY3_DOWN)key.c文件一部分static uchar Get_Key(void){if (KEY0_STATUS==0) return KEY0_DOWN;if (KEY1_STATUS==0) return KEY1_DOWN;if (KEY2_STATUS==0) return KEY2_DOWN;if (KEY3_STATUS==0) return KEY3_DOWN;return NO_KEY;}uchar Key_Scan(void){static uchar Key_State   = 0;        //按鍵狀態(tài)static uchar Key_Prev    = 0;        //上一次按鍵static uchar Key_Delay   = 0;        //按鍵連發(fā)時(shí)間static uchar Key_Series  = FALSE;    //標志連發(fā)開(kāi)始uchar Key_Press  = NO_KEY;           //按鍵值uchar Key_Return = NO_KEY;           //按鍵返回值Key_Press = Get_Key();switch (Key_State){case 0://按鍵初始態(tài)00if (Key_Press !=NO_KEY)//有按鍵按下{Key_State = 1;//轉到按鍵確認Key_Prev  = Key_Press;//保存按鍵狀態(tài)}break;case 1://按鍵確認態(tài)01if ( Key_Press ==Key_Prev )//確認和上次按鍵相同{Key_State = 2;//判斷按鍵長(cháng)按//返回按鍵按下鍵值,按鍵按下就響應,如果想彈起來(lái)再響應//可以在彈起來(lái)后再返回按鍵值Key_Return = KEY_DOWN | Key_Prev;}else//按鍵抬起,是抖動(dòng),不響應按鍵{Key_State = 0;}break;case 2://按鍵釋放態(tài)10if (Key_Press == NO_KEY )//按鍵釋放了{Key_State = 0;Key_Delay = 0;Key_Series  = FALSE;Key_Return  = KEY_UP | Key_Prev;      //返回按鍵抬起值break;}if ( Key_Press ==Key_Prev ){Key_Delay++;if ((Key_Series==TRUE)  (Key_Delay>KEY_SERIES_DELAY)){Key_Delay  = 0;Key_Return = KEY_LIAN | Key_Press;  //返回連發(fā)的值Key_Prev   = Key_Press;      //記住上次的按鍵.break;}if (Key_Delay>KEY_SERIES_FLAG){Key_Series = TRUE;Key_Delay  = 0;Key_Return = KEY_LONG | Key_Prev;   //返回長(cháng)按后的值break;}}default :break;}return Key_Return;}
每10ms調用一次,根據Key_Return的值來(lái)判斷按鍵的操作,用狀態(tài)機省去傳統按鍵的延時(shí)去抖,也不在在按鍵的死等待,對程序時(shí)間的利用有很大的幫助,根據按鍵返回的狀態(tài)值,事件可以在按鍵按下響應,也可以在按鍵彈起來(lái)響應,也可以實(shí)現連發(fā)、長(cháng)按等功能。


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>