新聞中心

        淺談如何按鍵消抖

        作者: 時(shí)間:2012-08-06 來(lái)源:網(wǎng)絡(luò) 收藏

        軟件消抖

        如果按鍵較多,常用軟件方法去抖,即檢測(cè)出鍵閉合后執(zhí)行一個(gè),5ms~10ms的延時(shí),讓前沿抖動(dòng)消失后再一次檢測(cè)鍵的狀態(tài),如果仍保持閉合狀態(tài)電平,則確認(rèn)為真正有鍵按下。當(dāng)檢測(cè)到按鍵釋放后,也要給5ms~10ms的延時(shí),待后沿抖動(dòng)消失后才能轉(zhuǎn)入該鍵的處理程序。還可以利用定時(shí)器中斷來(lái)消抖。

        下面再介紹一種的方法:利用switch()結(jié)構(gòu),程序設(shè)計(jì)如下:

        無(wú)延時(shí)的軟件消抖


        /*********************************************
        名稱:鍵盤掃描子函數(shù)
        功能:在按鍵穩(wěn)定期內(nèi)判斷鍵值,并返回鍵值
        **********************************************/
        uchar keyscan(void)
        {
        static char key_state = 0;
        static char key_value = 0;
        uchar key_press, key_return = 0;
        key_press=turn_leftturn_right; //讀按鍵I/O電平
        switch (key_state)
        {
        case 0 : // 按鍵初始態(tài)
        if (key_press==0) key_state = 1; // 鍵被按下,但需要確認(rèn)是否是干擾
        break;
        case 1 : // 按鍵確認(rèn)態(tài)
        if (key_press==0)
        //如有鍵按下則不是干擾,判斷鍵值
        { if(turn_left==0) //判斷是哪一個(gè)按鍵被按下
        key_value=1; //按鍵較多時(shí)可采用switch選擇結(jié)構(gòu)
        else if(turn_right==0)
        key_value=2;
        else key_value=0;
        key_state = 2; // 狀態(tài)轉(zhuǎn)換到鍵釋放態(tài)
        }
        else key_state = 0; // 按鍵已抬起,屬于干擾,轉(zhuǎn)換到按鍵初始態(tài)
        break;
        case 2 :
        if (key_press==1)
        {
        key_return=key_value;//按鍵釋放后再輸出鍵值
        key_value=0;
        key_state = 0; //如果按鍵釋放,轉(zhuǎn)換到按鍵初始態(tài)
        } break;
        }return key_return; //返回鍵值
        }
        /*********************************************
        名稱:按鍵處理子函數(shù)
        功能:
        **********************************************/
        void key_operation(void)
        {
        switch (keyscan()) //根據(jù)鍵值不同,執(zhí)行不同的內(nèi)容
        { case 1:
        hight_votage-=1;
        if(hight_votage5)
        hight_votage=5; break;
        case 2:
        hight_votage+=1;
        if(hight_votage>25)
        hight_votage=25; break;
        default :break;
        }
        }
        只要有按鍵就一定要想到消抖,總之不管是硬件消抖還是軟件消抖,在腦海里始終要想到按鍵按下時(shí)出現(xiàn)圖一的情景,然后再進(jìn)行相應(yīng)的設(shè)計(jì)。

        幾個(gè)好的按鍵設(shè)計(jì)的總結(jié)
        對(duì)于多個(gè)按鍵的設(shè)計(jì)常用思路是: 按照面向過程的編程方式, 將數(shù)據(jù)與過程分離. 把和按鍵狀態(tài)相關(guān)的東西比如按鍵功能統(tǒng)統(tǒng)塞到結(jié)構(gòu)里, 把消抖的代碼放在一個(gè)函數(shù)中。這里介紹按鍵設(shè)計(jì)的幾種方法:

        1、 矩陣鍵盤,http://www.51hei.com/f/jzjpcx.rar
        (這個(gè)文檔里放了幾個(gè)矩陣鍵盤的程序,個(gè)人覺得這幾個(gè)程序比較精簡(jiǎn),大家可以參看一下)

        2、 ADC按鍵,具體設(shè)計(jì)點(diǎn)擊這個(gè)網(wǎng)址:http://www.ceet.hbnu.edu.cn/bbs/viewthread.php?tid=7641extra=highlight=%CA%FD%D7%D6%CA%BE%B2%A8%C6%F7page=2

        ADC按鍵的優(yōu)點(diǎn)是節(jié)省IO口,但是需要調(diào)配好電阻值,個(gè)人覺得有點(diǎn)麻煩。

        3、 并入串出按鍵,具體設(shè)計(jì)點(diǎn)擊這個(gè)網(wǎng)址:http://www.ceet.hbnu.edu.cn/bbs/redirect.php?tid=8059goto=lastpost#lastpost

        4、 4*3鍵盤并且復(fù)用端口很牛 http://www.51hei.com/mcu/1316.html


        上一頁(yè) 1 2 下一頁(yè)

        評(píng)論


        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 金山区| 木里| 三明市| 金溪县| 古蔺县| 肇州县| 阳春市| 广安市| 侯马市| 巴林左旗| 安徽省| 同江市| 嫩江县| 博野县| 阜城县| 罗平县| 电白县| 宿松县| 平乡县| 雷波县| 通化市| 眉山市| 赣榆县| 镇康县| 林西县| 庄浪县| 高邮市| 西林县| 红桥区| 临颍县| 都匀市| 阿拉尔市| 临泉县| 岗巴县| 阿瓦提县| 抚松县| 清远市| 珠海市| 竹溪县| 荆门市| 永丰县|