亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于狀態(tài)機(jī)的單片機(jī)按鍵短按長(zhǎng)按功能的實(shí)現(xiàn)

        2018-01-17 10:43:40吳允強(qiáng)吳由松
        電子技術(shù)與軟件工程 2017年23期
        關(guān)鍵詞:狀態(tài)機(jī)按鍵

        吳允強(qiáng)++吳由松

        摘 要 本文介紹了一種基于狀態(tài)機(jī)的單片機(jī)按鍵的實(shí)現(xiàn),通過狀態(tài)機(jī)實(shí)現(xiàn)按鍵的短按與長(zhǎng)按的功能,同時(shí)改進(jìn)按鍵消抖的方法,使單片機(jī)在節(jié)約CPU的資源的同時(shí)實(shí)現(xiàn)按鍵的各種狀態(tài)的檢測(cè),提高單片機(jī)的工作效率,整個(gè)設(shè)計(jì)代碼簡(jiǎn)潔,方便維護(hù)。

        【關(guān)鍵詞】狀態(tài)機(jī) 按鍵 長(zhǎng)按

        1 引言

        在自己在科研實(shí)踐和對(duì)學(xué)生教學(xué)中發(fā)現(xiàn),現(xiàn)在單片機(jī)學(xué)習(xí)中對(duì)于按鍵處理的方法都是:檢測(cè)按鍵、延時(shí)消抖、按鍵執(zhí)行、等待釋放,整個(gè)按鍵處理的程序中大量出現(xiàn)“delay_1ms(5);”和“while(!key);”這樣的語句,這明顯是在給自己找麻煩,延時(shí)消抖與等待釋放需要消耗CPU運(yùn)行時(shí)間,執(zhí)行效率低下,而且這種方法處理的按鍵程序也實(shí)現(xiàn)不了按鍵的短按、長(zhǎng)按等靈活的按鍵操作方式。本文講述了一種用狀態(tài)機(jī)實(shí)現(xiàn)按鍵掃描的方法,達(dá)到按鍵的短按和長(zhǎng)按功能,高效的處理按鍵消抖問題。

        2 狀態(tài)機(jī)

        狀態(tài)機(jī)在軟件編程中非常重要,一個(gè)思路清晰而且高效的程序,必然有狀態(tài)機(jī)的身影浮現(xiàn)。比如在按鍵命令解析程序中,本來是在狀態(tài)1中,觸發(fā)一個(gè)按鍵后切換到狀態(tài)2,再觸發(fā)另一個(gè)按鍵切換到狀態(tài)3,或者返回到狀態(tài)1。按鍵的擊鍵過程也是一種狀態(tài)的切換,也可以看著是一個(gè)狀態(tài)機(jī),一個(gè)按鍵的擊鍵過程包括:按下、抖動(dòng)、閉合、抖動(dòng)和釋放等狀態(tài)。我們只要把這些狀態(tài)機(jī)的思想想辦法用程序表示出來就可以了。

        3 按鍵的狀態(tài)機(jī)實(shí)現(xiàn)

        我們這里用狀態(tài)機(jī)是為解決問題的,那么我們就要從問題本身去思考。為了實(shí)現(xiàn)按鍵掃描,達(dá)到按鍵短按和長(zhǎng)按的功能,可以根據(jù)一個(gè)按鍵從按下按鍵到釋放按鍵的整個(gè)過程將按鍵分為4個(gè)狀態(tài):

        S0:等待按鍵按下

        S1:按鍵按下

        S2:等待按鍵短按釋放

        S3:等待按鍵長(zhǎng)按釋放

        假設(shè)按鍵按下為低電平“0”,按鍵未按下為高電平“1”,按鍵的整個(gè)過程我們就可以通過狀態(tài)轉(zhuǎn)移圖表示出來,如圖1所示。

        首先,按鍵的初始狀態(tài)為S0,當(dāng)檢測(cè)到輸入為1時(shí),表示按鍵沒有按下,保持S0;當(dāng)輸入為0時(shí),表示按鍵按下,狀態(tài)轉(zhuǎn)入S1。在S1狀態(tài)中,檢測(cè)輸入信號(hào)是否為0,如果為0,執(zhí)行按鍵程序轉(zhuǎn)入S2;如果為1,表示之前的按鍵操作是干擾信號(hào),回到S0。在S2狀態(tài)中,如果輸入信號(hào)是1,則回到S0,表示按鍵短按已經(jīng)釋放;如果按鍵沒有釋放,輸入為0時(shí),就開始計(jì)時(shí),計(jì)時(shí)沒有結(jié)束前一直在S2,當(dāng)計(jì)時(shí)結(jié)束了,轉(zhuǎn)入S3,表示按鍵一直按著,為長(zhǎng)按功能,在S2計(jì)時(shí)過程中,輸入從0變?yōu)?也會(huì)回到S0。在S3狀態(tài)中,輸入信號(hào)為1,返回S0,表示按鍵長(zhǎng)按釋放;輸入信號(hào)為0,執(zhí)行相應(yīng)的按鍵程序,也可以計(jì)時(shí),等計(jì)時(shí)結(jié)束執(zhí)行按鍵程序,達(dá)到按鍵連擊的功能。這就是采用狀態(tài)機(jī)進(jìn)行按鍵檢測(cè)達(dá)到短按與長(zhǎng)按的整個(gè)過程。

        下面以四個(gè)按鍵接在P1的P1.7、P1.6、P1.5、P1.4,設(shè)計(jì)狀態(tài)機(jī)按鍵掃描程序。

        程序代碼如下:

        #define S0 0 //狀態(tài)0

        #define S1 1 //狀態(tài)1

        #define S2 2 //狀態(tài)2

        #define S3 3 //狀態(tài)3

        void key()

        {static unsigned char state=S0,key_time;

        unsigned char key;

        key=P1&0xf0; //屏蔽P1低四位

        switch (state) //檢測(cè)狀態(tài)

        {case S0://狀態(tài)0

        if(key!=0xf0)state=S1;break; //判斷輸入是否為0,為0轉(zhuǎn)入狀態(tài)1

        case S1://狀態(tài)1

        if(key==0xf0)state=S0; //判斷輸入是否為1,為1返回狀態(tài)0

        else //否則,轉(zhuǎn)入狀態(tài)2,執(zhí)行按鍵程序

        {state=S2;

        switch (key)

        {case 0xe0:/*按鍵1執(zhí)行程序*/break;

        case 0xd0:/*按鍵2執(zhí)行程序*/break;

        case 0xb0:/*按鍵3執(zhí)行程序*/break;

        case 0x70:/*按鍵4執(zhí)行程序*/break;}} break;

        case S2://狀態(tài)2

        if(key==0xf0)state=S0;//判斷輸入是否為1,為1返回狀態(tài)0

        else if(++key_time==100){key_time=0;state=S3;}break;

        //否則開始計(jì)時(shí),計(jì)時(shí)結(jié)束轉(zhuǎn)入狀態(tài)3

        case S3://狀態(tài)3

        if(key==0xf0)state=S0;//判斷輸入是否為1,為1返回狀態(tài)0

        else if(++key_time==5)//否則開始計(jì)時(shí),計(jì)時(shí)結(jié)束按鍵連擊

        {key_time=0;

        switch (key){

        case 0xe0:break;

        case 0xd0:break;

        case 0xb0:break;

        case 0x70:break;}

        }break;}}

        4 中斷處理按鍵消抖

        通常使用的按鍵都是機(jī)械彈性按鍵,也就是輕觸開關(guān)。機(jī)械按鍵在觸點(diǎn)的閉合和斷開的過程中會(huì)產(chǎn)生抖動(dòng),一個(gè)按鍵在按下時(shí)不會(huì)立刻穩(wěn)定的導(dǎo)通,在釋放時(shí)也一樣,不會(huì)一下子就斷開,在按下和釋放瞬間都會(huì)有一連串的抖動(dòng)現(xiàn)象。按鍵的抖動(dòng)時(shí)間有按鍵的機(jī)械特性決定,一般情況為5ms~10ms。這種抖動(dòng)人是感覺不出來的,但是單片機(jī)的運(yùn)行速度是微秒級(jí)的,這里可以設(shè)計(jì)一個(gè)定時(shí)中斷來檢測(cè)按鍵的狀態(tài),通過定時(shí)中斷來消除按鍵抖動(dòng)問題。因此可以把定時(shí)器的時(shí)間設(shè)置為10ms,每隔10ms進(jìn)入一次中斷檢測(cè)一次按鍵的狀態(tài)。

        5 總結(jié)

        本文介紹的這種以狀態(tài)機(jī)來實(shí)現(xiàn)按鍵檢測(cè)的方法,與一般的按鍵檢測(cè)方法相對(duì)比,能完成案件的多種狀態(tài)的檢測(cè),實(shí)現(xiàn)按鍵的短按和長(zhǎng)按功能。采用狀態(tài)機(jī)編寫的按鍵程序也大大的改進(jìn)了按鍵消抖對(duì)CPU運(yùn)行時(shí)間消耗的問題。程序代碼簡(jiǎn)單,維護(hù)方便,適用范圍廣。

        參考文獻(xiàn)

        [1]黃小華.單片機(jī)中的按鍵處理方法[J].電子科技,2014(19):1.

        [2]陳曉麗.按鍵的多種狀態(tài)檢測(cè)及消抖處理方法[J].家電科技,2013(04):68-70.

        作者單位

        南昌理工學(xué)院 江西省南昌市 330044endprint

        猜你喜歡
        狀態(tài)機(jī)按鍵
        基于有限狀態(tài)機(jī)的按鍵檢測(cè)程序設(shè)計(jì)
        電子制作(2021年3期)2021-06-16 03:14:26
        基于有限狀態(tài)機(jī)的交會(huì)對(duì)接飛行任務(wù)規(guī)劃方法
        按鍵消抖在單片機(jī)和FPGA實(shí)驗(yàn)教學(xué)中的應(yīng)用
        一種多方向?qū)Ч獍存I結(jié)構(gòu)設(shè)計(jì)
        電子制作(2016年1期)2016-11-07 08:43:05
        基于狀態(tài)機(jī)比對(duì)的狀態(tài)機(jī)推斷方案
        江蘇通信(2015年5期)2015-03-16 01:16:51
        雙口RAM讀寫正確性自動(dòng)測(cè)試的有限狀態(tài)機(jī)控制器設(shè)計(jì)方法
        基于有限狀態(tài)機(jī)的STM32系統(tǒng)按鍵識(shí)別方法
        按鍵的多種狀態(tài)檢測(cè)及消抖處理方法
        家電科技(2013年4期)2013-07-09 10:55:08
        解析某型號(hào)手機(jī)按鍵檢測(cè)程序的缺陷
        FPGA設(shè)計(jì)中狀態(tài)機(jī)安全性研究
        国产精品白浆一区二区免费看| 337p日本欧洲亚洲大胆| 大桥未久亚洲无av码在线| 香蕉成人啪国产精品视频综合网 | 亚洲av不卡一区男人天堂| 国产69精品久久久久久久| 成人国产精品999视频| 国产伪娘人妖在线观看| 久久蜜桃资源一区二区| 国产一区内射最近更新| 国产精品video| 国产av普通话对白国语| 午夜国产视频一区二区三区| 丰满爆乳在线播放| 五月中文字幕| 日本熟妇免费一区二区三区| 无套无码孕妇啪啪| 最近日本免费观看高清视频| 亚洲精品6久久久久中文字幕| 成a人片亚洲日本久久| 疯狂三人交性欧美| 欧美日本国产va高清cabal | 一区二区三区av资源网| 欧美激情乱人伦| 欧美日韩视频无码一区二区三| 在线天堂中文一区二区三区| 亚洲av熟女少妇一区二区三区| 亚洲亚洲人成综合丝袜图片| 中文字幕+乱码+中文字幕无忧| 亚洲一区二区三区在线观看蜜桃| 九一免费一区二区三区偷拍视频| 中国丰满熟妇xxxx性| 色窝窝无码一区二区三区2022| 日本午夜a级理论片在线播放| 色老板美国在线观看| 亚洲中文字幕无码爆乳av| 91久久精品国产性色tv | 亚洲午夜久久久久久久久久| 精品久久综合亚洲伊人| 天堂a版一区二区av| 天天做天天爱夜夜夜爽毛片|