新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 51單片機的狀態(tài)機消抖

51單片機的狀態(tài)機消抖

作者: 時間:2016-11-23 來源:網絡 收藏
下午把狀態(tài)機無延時按鍵消抖弄到51單片機上面,下面曬一下程序:
#include
enum State {Init, Press, Free}; //定義按鍵狀態(tài)的枚舉類型
enum State Key_State; //按鍵狀態(tài)
sbit Key1 = P2^4;
sbit Key2 = P2^5;
sbit Key3 = P2^6;
sbit Key4 = P2^7;
void Delay_ms(unsigned int x)
{
int i,j;
for(i=0; i<110; i++)
for(j=0; j
;
}
//===============================================================================
//函數(shù)名稱:鍵盤掃描(狀態(tài)機無延時消抖)
//說明:鍵盤接口對應: key1 = P2-4 key2 = P2-5 key3 = P2-6 key4 = P2-7
//參數(shù):
//返回值:
//日期:2011-6-22
//修改:
//===============================================================================
void Keyscan(void)
{
switch (Key_State)
{
case Init : // 按鍵初始態(tài)
if((P2 | 0x0f) != 0xff)
{
Key_State = Press; // 鍵被按下,但需要確認是否是干擾
}
break;
case Press : // 按鍵確認態(tài)
if((P2 | 0x0f) != 0xff) //如有鍵按下則不是干擾,判斷鍵值
{
//判斷是哪一個按鍵被按下
if( (P2 | 0xef) != 0xff ) //第一個鍵被按下
{
P1 = 0xfe;
Delay_ms(500);
P1 = 0xff;
}
if( (P2 | 0xdf) != 0xff ) //第二個鍵被按下
{
P1 = 0xfd;
Delay_ms(500);
P1 = 0xff;
}
if( (P2 | 0xbf) != 0xff ) //第三個鍵被按下
{
P1 = 0xfb;
Delay_ms(500);
P1 = 0xff;
}
if( (P2 | 0x7f) != 0xff ) //第四個鍵被按下
{
P1 = 0xf7;
Delay_ms(500);
P1 = 0xff;
}
Key_State = Free; // 狀態(tài)轉換到鍵釋放態(tài)
}
else
{
Key_State = Init; // 按鍵已抬起,屬于干擾,轉換到按鍵初始態(tài)
}
break;
case Free :
if((P2 | 0x0f) == 0xff) //判斷按鍵是否釋放
{
Key_State = Init; //如果按鍵釋放,轉換到按鍵初始態(tài)
}
break;
}
}
這是另外一種,其實都差不多,只不過比較直觀而已。
void Keyscan(void)
{
switch (Key_State)
{
case Init : // 按鍵初始態(tài)
if((Key1 == 0) | (Key2 == 0) | (Key3 == 0) | (Key4 == 0))
{
Key_State = Press; // 鍵被按下,但需要確認是否是干擾
}
break;
case Press : // 按鍵確認態(tài)
if((Key1 == 0) | (Key2 == 0) | (Key3 == 0) | (Key4 == 0)) //如有鍵按下則不是干擾,判斷鍵值
{
//判斷是哪一個按鍵被按下
if(Key1 == 0) //第一個鍵被按下
{
P1 = 0xfe;
Delay_ms(500);
P1 = 0xff;
}
if((Key2 == 0)) //第二個鍵被按下
{
P1 = 0xfd;
Delay_ms(500);
P1 = 0xff;
}
if((Key3 == 0)) //第三個鍵被按下
{
P1 = 0xfb;
Delay_ms(500);
P1 = 0xff;
}
if((Key4 == 0)) //第四個鍵被按下
{
P1 = 0xf7;
Delay_ms(500);
P1 = 0xff;
}
Key_State = Free; // 狀態(tài)轉換到鍵釋放態(tài)
}
else
{
Key_State = Init; // 按鍵已抬起,屬于干擾,轉換到按鍵初始態(tài)
}
break;
case Free :
if((Key1 == 1) & (Key2 == 1) & (Key3 == 1) & (Key4 == 1)) //判斷按鍵是否釋放
{
Key_State = Init; //如果按鍵釋放,轉換到按鍵初始態(tài)
}
break;
}
}


評論


技術專區(qū)

關閉