伍:按鍵驅(qū)動(dòng)(短按塔插、長(zhǎng)按梗摇、雙擊)

按鍵掃描驅(qū)動(dòng),支持按鍵的長(zhǎng)按和短按事件(未實(shí)現(xiàn)雙擊事件)想许,key_Scan()函數(shù)得到相應(yīng)的鍵值伶授,主程序根據(jù)鍵值進(jìn)行動(dòng)作。
三個(gè)按鍵:Key_SPA Key_ZER Key_MEN



Key_Board.h

#ifndef Key_Board
#define Key_Board

#include <SH79F1611.h>
#include "Timer_Init.h"

typedef struct 
{
    unsigned char Short_Press:1;      //短按
    unsigned char Long_Press:1;       //長(zhǎng)按
    unsigned char Double_Press:1;     //雙擊
}Key_State;

extern xdata Key_State Key_SPA,Key_ZER,Key_MEN;
void Key_Init(void);
void Key_Scan(void);
#endif

key_Board.c

#include "Key_Board.h"

sbit SPA = P4^3;
sbit ZER = P4^2;

////按鍵狀態(tài)結(jié)構(gòu)體定義 三個(gè)按鍵 SPA/ZER/MEN
 xdata Key_State Key_SPA = {0,0,0};
 xdata Key_State Key_ZER = {0,0,0};
 xdata Key_State Key_MEN = {0,0,0};

//按鍵初始化
void Key_Init(void)
{
    P4CR &= ~0x0c;  //P4^2 P4^3 設(shè)置為輸入接口 
    P4PCR |= 0x0c;  //輸入上拉  
    P4CR |= 0x02;   //P4.1輸出  作為按鍵地
    P4 &= ~0x02;
}

bit Key_Down_SPA_Short = 1;
bit Key_Down_ZER_Short = 1;
bit Key_Down_MEN_Short = 1; 

bit Key_Down_SPA_Long = 1;
bit Key_Down_ZER_Long = 1;
bit Key_Down_MEN_Long = 1;

/*****************************************************************************
*1:按鍵掃描函數(shù)  三個(gè)按鍵公用兩個(gè)IO口 先掃描SPA/ZER按鍵 再掃描MOD按鍵
*2:程序支持按鍵短按和長(zhǎng)按 短按按鍵在按鍵抬起后取值 長(zhǎng)按按鍵在按鍵按下時(shí)可取值
*3:按鍵長(zhǎng)按后抬起伸刃,取得長(zhǎng)按鍵值谎砾,短按鍵值被屏蔽 
******************************************************************************/
void Key_Scan(void)
{
    static xdata char cnt = 0;
    if((SPA==0) && (ZER==0))               //不支持同時(shí)按鍵
    {
        return ;                         
    } 
    
    if(SPA == 0)                                   //當(dāng)SPA按鍵按下 
    {
        if((Key_Down_SPA_Short == 1)&&(Key_Down_SPA_Long == 1))
        {
            if(cnt++ >= 1)               //20ms防抖
            {
                cnt = 0;
                Key_Down_SPA_Short = 0; 
                Key_Timing = 0;                  //按鍵計(jì)數(shù)變量清0 
            }
        }
        else
        if(Key_Down_SPA_Long == 1)
        {
            if(Key_Timing >= 300)
            {
                Key_Timing = 0;
                Key_Down_SPA_Long = 0;
                Key_SPA.Long_Press = 1;    
                Key_Down_SPA_Short = 1;
            }
        }
    }
    else
    if(ZER == 0)                            //當(dāng)ZER按鍵按下 
    {
        if((Key_Down_ZER_Short == 1)&&(Key_Down_ZER_Long == 1))
        {
            if(cnt++ >= 1)                     //20ms防抖
            {
                cnt = 0;
                Key_Down_ZER_Short = 0; 
                Key_Timing = 0;                  //按鍵計(jì)數(shù)變量清0 
            }
        }
        else
        if(Key_Down_ZER_Long == 1)
        {
            if(Key_Timing >= 200)
            {
                Key_Timing = 0;
                Key_Down_ZER_Long = 0;
                Key_ZER.Long_Press = 1;    
                Key_Down_ZER_Short = 1;
            }
        }
    }
    else                                          
    {
        P4CR |= 0x04;                          //設(shè)置ZER按鍵對(duì)應(yīng)的IO口為輸出 輸出為0  
        ZER = 0;                               
        if(SPA == 0)                           //當(dāng)MOD按鍵按下 
        {
            if((Key_Down_MEN_Short == 1)&&(Key_Down_MEN_Long == 1))
            {
                if(cnt++ >= 1)                     //20ms防抖
                {
                    cnt = 0;
                    Key_Down_MEN_Short = 0; 
                    Key_Timing = 0;                  //按鍵計(jì)數(shù)變量清0 
                }
            }
            else
            if(Key_Down_MEN_Long == 1)
            {
                if(Key_Timing >= 200)
                {
                    Key_Timing = 0;
                    Key_Down_MEN_Long = 0;
                    Key_MEN.Long_Press = 1;    
                    Key_Down_MEN_Short = 1;
                }
            }
        }
        else
        if((SPA == 1) && ((Key_Down_MEN_Short == 0) || (Key_Down_MEN_Long == 0)))
        {
            if(Key_Down_MEN_Short == 0) 
            {
                Key_Down_MEN_Short = 1;
                Key_MEN.Short_Press = 1;         //MEN短按
            }
            if(Key_Down_MEN_Long == 0)
            {
                Key_Down_MEN_Long = 1;
                Key_MEN.Long_Press = 0;
            }
        }
        P4CR &= ~0x04;       //設(shè)置ZER按鍵對(duì)應(yīng)的IO口為輸入 
        P4PCR |= 0x04;       //輸入上拉
    }
    
    if(SPA == 1) 
    { 
        if(Key_Down_SPA_Short == 0)
        {
            Key_Down_SPA_Short = 1; 
            Key_SPA.Short_Press = 1;   
        }
        if(Key_Down_SPA_Long == 0) 
        {
            Key_Down_SPA_Long = 1;
            Key_SPA.Long_Press = 0;
        }
    } 
    
    if(ZER == 1) 
    {
        if(Key_Down_ZER_Short == 0) 
        {
            Key_Down_ZER_Short = 1;
            Key_ZER.Short_Press = 1;   
        }
        if(Key_Down_ZER_Long == 0) 
        {
            Key_Down_ZER_Long = 1;
            Key_ZER.Long_Press = 0;
        }
    } 
    
    if(Key_ZER.Long_Press==1 || Key_ZER.Short_Press==1 || Key_SPA.Long_Press==1 || Key_SPA.Short_Press==1 || Key_MEN.Long_Press==1 ||Key_MEN.Short_Press==1)
    {
        Set_Menu_Timeouy_5s = 0;         //有按鍵按下 菜單計(jì)數(shù)清0
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市捧颅,隨后出現(xiàn)的幾起案子景图,更是在濱河造成了極大的恐慌,老刑警劉巖碉哑,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挚币,死亡現(xiàn)場(chǎng)離奇詭異亮蒋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)妆毕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門慎玖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人笛粘,你說我怎么就攤上這事趁怔。” “怎么了薪前?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵润努,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我示括,道長(zhǎng)铺浇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任垛膝,我火速辦了婚禮鳍侣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吼拥。我一直安慰自己倚聚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布凿可。 她就那樣靜靜地躺著秉沼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪矿酵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天矗积,我揣著相機(jī)與錄音全肮,去河邊找鬼。 笑死棘捣,一個(gè)胖子當(dāng)著我的面吹牛辜腺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乍恐,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼评疗,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了茵烈?” 一聲冷哼從身側(cè)響起百匆,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呜投,沒想到半個(gè)月后加匈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體存璃,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年雕拼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纵东。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡啥寇,死狀恐怖偎球,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辑甜,我是刑警寧澤衰絮,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站栈戳,受9級(jí)特大地震影響岂傲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜子檀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一镊掖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧褂痰,春花似錦亩进、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至匪蝙,卻和暖如春主籍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逛球。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國打工千元, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人颤绕。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓幸海,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親奥务。 傳聞我的和親對(duì)象是個(gè)殘疾皇子物独,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1:InputChannel提供函數(shù)創(chuàng)建底層的Pipe對(duì)象 2: 1)客戶端需要新建窗口 2)new ViewRo...
    自由人是工程師閱讀 5,313評(píng)論 0 18
  • 1 家里是很偏僻的農(nóng)村,小時(shí)候氯葬,媽媽指望我靠讀書改變?nèi)松壽E挡篓,12歲那年就讓我來到市里讀書,住在舅舅家帚称,周末回村瞻凤。...
    鄒游世界閱讀 465評(píng)論 0 5
  • 前言 最近剛做了一個(gè)登錄接口的RSA加解密憨攒,感覺難度不大,寫下來給大家以作參考阀参。 過程 首先后端用的是openss...
    ccc小yyy閱讀 2,239評(píng)論 0 1
  • 婕蛛壳,看到你努力的樣子杏瞻,我會(huì)想,有一天你閃閃發(fā)光的站在高處衙荐,活成了自己想要的樣子捞挥。而我,會(huì)在哪里忧吟,什么模樣砌函,和什...
    冬瓜的巴拉巴拉閱讀 428評(píng)論 0 0
  • 10月3,4,5號(hào)在氣候宜人,空氣清新的威海和70多個(gè)小伙伴度過了難忘的三天溜族,極度happy~~~ 為什么“夜夜笙...
    所聞所見所想閱讀 635評(píng)論 2 1