新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機按鍵去抖

        單片機按鍵去抖

        作者: 時間:2016-11-13 來源:網絡 收藏
        我們首先要清楚為什么要按鍵去抖。先看先按鍵按下的波形圖

        本文引用地址:http://www.104case.com/article/201611/316104.htm

        通過這個圖形就很清楚為什么要按鍵去抖了,要是不去抖的話,當按下按鍵的時候就會在0~5ms內出現抖動,相當于在不停地按下按鍵而就不是只按了一次了。穩定閉合時間大約是10ms,松手抖動的時間和按下抖動的時間差不多。

        去抖的方法有硬件去抖和軟件去抖

        我們常用犧牲CPU的時間來軟件去抖,就是按下按鍵后延時5~10ms時間后再來檢查是否有按鍵按下,松手檢測也一樣。

        硬件去抖的方法如圖所示

        獨立按鍵的去抖方法很簡單,就是在按下和松手后分別加一小段延時再來判斷。

        例:

        sbit key=P1^1;

        ........................

        .......................

        if(!key) //如果有按鍵按下

        {

        delay(10); //延時一小段時間

        if(!key) //真有按鍵按下

        {

        。。。。。。。。// 執行按鍵按下后的操作

        }

        while(!key); // 松手檢測,要是沒有松手的話就一直執行while循環

        }

        原理就是這樣,去抖的方法很多。

        按鍵的松手檢測主要根據鍵盤掃描的方式來決定,今天寫了一個矩陣鍵盤掃描的程序,然后加了松手檢測。結果沒達到預想的要求。后來才發現是檢測方式錯了。

        程序是這樣的

        uchar keyscan()
        {
        static uchar H,L,temp;
        P1=0Xf0;
        L=P1&0xf0;
        if(L!=0xf0)
        {
        delay(18);
        if(L!=0xf0)
        {
        L=P1&0xf0;
        P1=L|0x0f; //P1口重新賦值了
        H=P1&0X0F;
        }
        }
        /*

        P1=0XF0;

        L=P1&0XF0;

        while(L1!=0XF0) //松手檢測

        {

        L=P1&0XF0;

        }
        */
        temp=H+L;


        switch(temp)
        {
        case 0xee:key=1;get1=!get1;break;
        case 0xed:key=2;get1=!get1;break;
        case 0xeb:key=3;get1=!get1;break;
        case 0xe7:key=4;get1=!get1;break;
        case 0xde:key=5;get1=!get1;break;
        case 0xdd:key=6;get1=!get1;break;
        case 0xdb:key=7;get1=!get1;break;
        case 0xd7:key=8;get1=!get1;break;
        case 0xbe:key=9;get1=!get1;break;
        case 0xbd:key=0;get1=!get1;break;
        case 0xbb:key=0xee;get1=!get1;break;
        }
        return key;

        }




        關鍵詞: 單片機按鍵去

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 巴彦县| 高密市| 镇平县| 邯郸县| 调兵山市| 黄冈市| 日照市| 成安县| 凤凰县| 永春县| 泾川县| 吉林市| 铁岭市| 洛阳市| 景泰县| 新乡市| 广安市| 崇礼县| 象山县| 枞阳县| 成武县| 定西市| 新晃| 藁城市| 和硕县| 银川市| 六枝特区| 林口县| 搜索| 苗栗县| 鹤庆县| 老河口市| 江阴市| 遵化市| 古浪县| 阳泉市| 涪陵区| 景宁| 双桥区| 焉耆| 盐边县|