/******************************************************** 功能:獨立按鍵測試 時間: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個端子為可尋址位,分別接四個獨立按鍵,按鍵另一端全部接地, 當按鍵按下的時候,端口檢測到變為低電平,開始為P0賦值。在按鍵沒有被按下的時候,4個 寄存器的32個端口都是高電平,被選中的位8段全亮。 修改了P2=0x09,因為P2出來串接74HC138,本來P2最多等于0x07=0000 0111,經譯 碼出來的是HHHH HHHL,接共陰數碼管的第8位數碼管被選中。在P2=0x09=0000 1001,取后 低三位是ABC=001,注意這里A時最高位,也就是點亮第二位數碼管,這里可以取 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 ---------------------------------------------------------------------------------------------------------------- 顯然如果使用共陽數碼管,則很難實現選位點亮,可能是選位熄滅。使用萬用表 測量按鍵另一端接地按鍵按下后確實檢測到被按下按鍵對應的端口為低電平。 獨立按鍵另外一個問題就是抖動,可以用硬件電路或者軟件來消除。硬件電路可以 使用SR鎖存器(與非門)來構成(參見康華光數字電路)。但最好還是使用軟件,延時 程序可以很方便的解決。根據按鍵的不同機械抖動固有時間,一般情況下為4~15ms。 通過延時躲避抖動,按下和釋放都存在抖動,實際使用程序需要兩次去抖動。設定時間 為20ms就能滿足一般要求。 if(!KEY) { DelayMs(10); //按下去抖動 while(!KEY); if(KEY) { DelayMs(10); //釋放驅抖動 if(KEY) { //啟動按鍵按下后需要執行的程序 } } } 本程序存在瑕疵,延時10ms,如果抖動已經結束,此時KEY=1,不必執行while(!KEY),緊 接著執行釋放去抖動;但是如果抖動的時間比較長(超過20ms)的話就不好說了。不過本程序的可 取之處時,如果一直按著按鍵很長時間,相當于按了一次,因為while(!KEY)將按下去的時間消除。 按鍵控制是單片機和外界通信,接受外界控制的重要機制,在獨立按鍵特別是本程序中, 用不上去抖動,因為抖動對程序不造成任何影響。 */