天天看點

按鍵掃描處理

按鍵處理

 單片機書本上對于鍵盤處理往往都給出了幾種不同的方案,但是在一個實際的系統應用中,往往用起來感覺不是很好。主要的弊端就是實時性不好。

無論是采用中斷方式還是采用掃描方式,實行性都不能很好的達到要求。

    對于鍵盤,大家都知道有抖動,最最常用的消除抖動的方法就是用軟體消抖。但是書本上的軟體消抖基本都是用一個Delay函數來實作10-20ms的延時。

而一個前背景的系統,也許一個程式運作下來也就20ms,而由于有鍵盤延時判斷的存在,将導緻整個系統運作都慢了下來。對此,實際應用中有一種處理方法。該方法有三條主線來處理。

第一條線:

    采用外部中斷方式(或者掃描方式)檢查是否有鍵被按下。如果有,僅僅将一個标志位置位,表示有鍵按下了。姑且定義這個标志位為key.flag。如果進入中斷,則 key.flag = 1;

第二條線:

    系統應該提供一個10ms的定時器,作為系統的時間片。在定時中斷内檢測是否key.flag==1,如果該标志位為1,則表示已經檢測到有鍵按下,則啟動計時,計時變量定義為key.times。可以用代碼if( key.flag==1) {key.times++}來統計檢測到按鍵以後進入10ms系統定時中斷的次數。

第三條線:

    鍵掃描處理,主程式則主要判斷是否有鍵被按下,按下以後是否計時變量大于某個值(該值決定你想定義的消抖時間)。比如如下處理:

    (鍵對應引腳沒有按下時為高電平,按下則變低電平,采用下降沿中斷方式檢測按鍵)

    void    key_scan(void)

    {

        if(key.flag==1)         //先判斷是否有鍵按下

        {

            if( key.times >2 )  //再判斷是否離檢測到按鍵有超過20ms

            {

                if( KEYPIN == 0  )  //對應引腳是否還為0

                {

                     key.value = 0xxx;   //擷取鍵值

                 }

             }

        }

    }

對于采用掃描方式的,隻需要将中斷内 key.flag = 1;的語句放到鍵掃描程式内就可以了。

可以看到,對于這樣的三線處理鍵盤的方式,外部中斷内和時間中斷内都隻有幾條語句就可以處理。

同時,抖動延時的過程由于放到了定時中斷内,這個時間可以用來做其他的任務,大大的提高了系統的實時性能。

   對于語音多段播放的程式處理,顯示閃爍的處理等需要大量延時的程式,都可以采用這樣的結構,可以大大的提高系統的實時性,若各位對于語音多段播放的處理方式希望了解如何實作,過段時間在寫這個。