在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 一個簡單的按鍵去抖延時程序

            一個簡單的按鍵去抖延時程序

            作者: 時間:2016-11-30 來源:網(wǎng)絡(luò) 收藏
            按鍵去抖,一般采用普通延時,如

            if((GPIOC->IDR & 0x01)== 0)
            {
            delay_ms(20);
            if(GPIOC->IDR & 0x01)== 0

            //進行按鍵處理函數(shù)

            }

            本文引用地址:http://www.biyoush.com/article/201611/324051.htm

            這個程序,需要有一個普通的延時程序,來檢測去抖動,這個延時一般采用for循環(huán)和while循環(huán)。這樣的話,就有一個問題,在延時的這20ms中,cpu一直在判斷時間有沒有到。如果不是中斷,是不會打斷cpu的程序的。這樣的話,去抖延時,就會浪費cpu的效率。
            假如,按鍵掃描的后面跟一個協(xié)議處理的函數(shù)。
            即:

            while(1)

            scan_key(); //按鍵掃描
            exe(); //協(xié)議解析

            這個時候,若接收中斷,在按鍵掃描時已經(jīng)處理完成,正好按下按鍵,這個時候就必須要有20ms的間隔,在判斷完按鍵后,才可以進入?yún)f(xié)議解析函數(shù)。也就是說,如果沒有掃描函數(shù),協(xié)議會立即執(zhí)行解析并返回響應(yīng)數(shù)據(jù)。而添加按鍵掃描后,協(xié)議有可能會在20ms后,進行解析并返回數(shù)據(jù),這樣的話,就會使產(chǎn)品的實時性無法保證。

            所以我想了另一個方法,采用標致位,來實現(xiàn)延時,當然這個方法,肯定不是我第一個想出來的。如有雷同,可采用翻鋼镚方法進行選擇。
            就是采用if語句來實現(xiàn)延時,只不過寫程序時比較麻煩,但穩(wěn)定性在stm8上測試了一下,感覺還可以。

            代碼如下
            首先申請幾個全局變量
            unsigned int time_ms,time_us,time_ns,time_flag;
            //以上這幾個是定時標志和定時計數(shù)變量
            unsigned key_old, key_new;
            //這兩個是按鍵鍵值

            /*******************************************************************************
            函數(shù)名:delay_ms()
            函數(shù)功能:延時
            參數(shù):ms 毫秒
            返回:無
            備注:此延時函數(shù)采用if實現(xiàn),使用時,必須先申請flag變量然后調(diào)用延時函數(shù),最后在
            執(zhí)行中加入flag判斷
            例:u16 time_flag,time_ms,time_us,time_ns;
            delay_ms(u16 ms);
            if(time_flag>0){time_flag=0;......內(nèi)容}
            *******************************************************************************/
            void key_delay(unsigned int ms)
            {
            if(time_ms{
            if(time_us<10) //在應(yīng)用時,不同的單片機,不同的頻率,需要進行調(diào)整
            {
            if(time_ns<8) //在應(yīng)用時不同的單片機,不同的頻率,需要進行調(diào)整
            {
            time_ns++;
            }
            else
            {
            time_us++;
            time_ns=0;
            }
            }
            else
            {
            time_ms++;
            time_us=0;
            }
            }
            else
            {
            time_flag=1;
            time_ms=0;
            }
            }


            以上代碼,有一個time_flag,變量,這個變量就是定時標致變量。一旦這個標致置一,則說明定時器到時間
            使用時可以

            ///////////////////////////////////////////////////////////
            //函數(shù)名:scan()
            //功能:按鍵掃描
            //參數(shù):無
            //返回值:無
            //備注:
            ///////////////////////////////////////////////////////////
            void scan()
            {
            u8 key_new;
            key_new = GPIOC->IDR;
            if(key_old != key_new)
            {
            key_delay(150);
            if(time_flag == 1)
            {
            time_flag = 0;
            if(key_old != key_new)
            {
            switch()
            {
            case 1: k1_exe(); break;
            case 2: k2_exe(); break;
            case 3: k3_exe(); break;
            case 4: k4_exe(); break;
            default: break;
            }
            key_old = key_new;
            }
            else

            time_ms=0;

            }
            }
            }

            以上就是代碼
            在大循環(huán)中,直接調(diào)用即可,和普通的按鍵函數(shù)一樣,只不過,這個的實時性,應(yīng)該相對較高一些。
            while(1)

            scan_key(); //按鍵掃描
            exe(); //協(xié)議解析

            讓我們來分析一下,為啥這個函數(shù)相對較好一些。
            首先,我們來看
            scan_key();
            首先,掃描IO端口,存放如新按鍵變量
            key_new = GPIOC->IDR;
            然后將新按鍵與老按鍵號進行對比,如果新的按鍵號與老按鍵號不同,說明有按鈕按下。
            if(key_old != key_new)
            當有按鈕按下的時候進入,延時函數(shù),
            key_delay(150);
            這時,進入多個if判斷,進行time_ns++;這個函數(shù),最主要的功能就是判斷,當前的時間time_ms,與參數(shù)時間,是否一致,若不一致,則退出函數(shù)。這時time_flag不為1,當前的時間time_ms,與參數(shù)時間一致 ,這時time_flag為1。
            if(time_flag == 1)
            這個判斷就是判斷到時標致,如果到時,則說明去抖時間完成,則在判斷一次if(key_old != key_new),如果為否,則說明按鍵確實按下,否則則為沒有按下。有按鍵按下時,則會執(zhí)行按鍵處理函數(shù)。
            若沒有按鍵按下,則清楚計數(shù)器。程序繼續(xù)執(zhí)行。
            也就是說,不管是否在延時狀態(tài),程序,都會向下執(zhí)行,而不會卡在某一個函數(shù)或循環(huán)內(nèi)不動。這樣的話,程序就會向下繼續(xù)執(zhí)行。
            在程序中,若既有按鍵,又有一些對待實時性較高,但又不樂意放在中斷里的程序??梢圆捎眠@種方法來實現(xiàn)按鍵延時,可以相對的提高程序的運行效率。目前這個程序,不支持長按,但可以實現(xiàn)簡單的組合按鍵。



            關(guān)鍵詞: 按鍵去抖延時程

            評論


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

            關(guān)閉