專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

單片機(jī)獨(dú)立按鍵檢測(cè)程序

作者:劉轔   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2010年07月18日   【字體:
/********************************************************

功能:獨(dú)立按鍵測(cè)試

時(shí)間:2010—7—17

**********************************************************/
#include<reg52.h>
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;


void delay(unsigned int cnt)
{
        while(--cnt);
}


main()
{ 

        P2=0x09;
        while(1)
        { 
                if(!key1)
                        P0=0x06;
                if(!key2)
                        P0=0x5B;
                if(!key3)
                        P0=0x4F;
                if(!key4)
                        P0=0x66;

        }
}

/*

        定義寄存器P3的4個(gè)端子為可尋址位,分別接四個(gè)獨(dú)立按鍵,按鍵另一端全部接地,
當(dāng)按鍵按下的時(shí)候,端口檢測(cè)到變?yōu)榈碗娖,開(kāi)始為P0賦值。在按鍵沒(méi)有被按下的時(shí)候,4個(gè)
寄存器的32個(gè)端口都是高電平,被選中的位8段全亮。


        修改了P2=0x09,因?yàn)镻2出來(lái)串接74HC138,本來(lái)P2最多等于0x07=0000 0111,經(jīng)譯
碼出來(lái)的是HHHH HHHL,接共陰數(shù)碼管的第8位數(shù)碼管被選中。在P2=0x09=0000 1001,取后
低三位是ABC=001,注意這里A時(shí)最高位,也就是點(diǎn)亮第二位數(shù)碼管,這里可以取 P2=x%8。

 

---------------------------------------------------------------------------------------------------------------

A    B    C    |    Y0   Y1    Y2    Y3    Y4    Y5    Y6    Y7

----------------------------------------------------------------------------------------------------------------

0    0    0    |    L     H     H     H     H     H     H     H

0    0    1    |    H     L     H     H     H     H     H     H

0    1    0    |    H     H     L     H     H     H     H     H

0    1    1    |    H     H     H     L     H     H     H     H

1    0    0    |    H     H     H     H     L     H     H     H

1    0    1    |    H     H     H     H     H     L     H     H

1    1    0    |    H     H     H     H     H     H     L     H

1    1    1    |    H     H     H     H     H     H     H     L

----------------------------------------------------------------------------------------------------------------

 

   顯然如果使用共陽(yáng)數(shù)碼管,則很難實(shí)現(xiàn)選位點(diǎn)亮,可能是選位熄滅。使用萬(wàn)用表
測(cè)量按鍵另一端接地按鍵按下后確實(shí)檢測(cè)到被按下按鍵對(duì)應(yīng)的端口為低電平。


   獨(dú)立按鍵另外一個(gè)問(wèn)題就是抖動(dòng),可以用硬件電路或者軟件來(lái)消除。硬件電路可以
使用SR鎖存器(與非門)來(lái)構(gòu)成(參見(jiàn)康華光數(shù)字電路)。但最好還是使用軟件,延時(shí)
程序可以很方便的解決。根據(jù)按鍵的不同機(jī)械抖動(dòng)固有時(shí)間,一般情況下為4~15ms。
通過(guò)延時(shí)躲避抖動(dòng),按下和釋放都存在抖動(dòng),實(shí)際使用程序需要兩次去抖動(dòng)。設(shè)定時(shí)間
為20ms就能滿足一般要求。

 

if(!KEY)

{
        DelayMs(10);    //按下去抖動(dòng)
        while(!KEY);
        if(KEY)
        {
                DelayMs(10);    //釋放驅(qū)抖動(dòng)
                if(KEY)
                {
                        //啟動(dòng)按鍵按下后需要執(zhí)行的程序
                }
        }
}

        本程序存在瑕疵,延時(shí)10ms,如果抖動(dòng)已經(jīng)結(jié)束,此時(shí)KEY=1,不必執(zhí)行while(!KEY),緊
接著執(zhí)行釋放去抖動(dòng);但是如果抖動(dòng)的時(shí)間比較長(zhǎng)(超過(guò)20ms)的話就不好說(shuō)了。不過(guò)本程序的可
取之處時(shí),如果一直按著按鍵很長(zhǎng)時(shí)間,相當(dāng)于按了一次,因?yàn)閣hile(!KEY)將按下去的時(shí)間消除。

        按鍵控制是單片機(jī)和外界通信,接受外界控制的重要機(jī)制,在獨(dú)立按鍵特別是本程序中,
用不上去抖動(dòng),因?yàn)槎秳?dòng)對(duì)程序不造成任何影響。

*/
關(guān)閉窗口

相關(guān)文章