51單片機(jī)的狀態(tài)機(jī)消抖
#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 case Init : // 按鍵初始態(tài) if((P2 | 0x0f) != 0xff) { Key_State = Press; // 鍵被按下,但需要確認(rèn)是否是干擾 } break; case Press : // 按鍵確認(rèn)態(tài) if((P2 | 0x0f) != 0xff) //如有鍵按下則不是干擾,判斷鍵值 { //判斷是哪一個(gè)按鍵被按下 if( (P2 | 0xef) != 0xff ) //第一個(gè)鍵被按下 { } if( (P2 | 0xdf) != 0xff ) //第二個(gè)鍵被按下 { } if( (P2 | 0xbf) != 0xff ) //第三個(gè)鍵被按下 { } if( (P2 | 0x7f) != 0xff ) //第四個(gè)鍵被按下 { } Key_State = Free; // 狀態(tài)轉(zhuǎn)換到鍵釋放態(tài) } else { Key_State = Init; // 按鍵已抬起,屬于干擾,轉(zhuǎn)換到按鍵初始態(tài) } break; case Free : if((P2 | 0x0f) == 0xff) //判斷按鍵是否釋放 { Key_State = Init; //如果按鍵釋放,轉(zhuǎn)換到按鍵初始態(tài) } break; case Init : // 按鍵初始態(tài) if((Key1 == 0) | (Key2 == 0) | (Key3 == 0) | (Key4 == 0)) { Key_State = Press; // 鍵被按下,但需要確認(rèn)是否是干擾 } break; case Press : // 按鍵確認(rèn)態(tài) if((Key1 == 0) | (Key2 == 0) | (Key3 == 0) | (Key4 == 0)) //如有鍵按下則不是干擾,判斷鍵值 { //判斷是哪一個(gè)按鍵被按下 if(Key1 == 0) //第一個(gè)鍵被按下 { } if((Key2 == 0)) //第二個(gè)鍵被按下 { } if((Key3 == 0)) //第三個(gè)鍵被按下 { } if((Key4 == 0)) //第四個(gè)鍵被按下 { } Key_State = Free; // 狀態(tài)轉(zhuǎn)換到鍵釋放態(tài) } else { Key_State = Init; // 按鍵已抬起,屬于干擾,轉(zhuǎn)換到按鍵初始態(tài) } break; case Free : if((Key1 == 1) & (Key2 == 1) & (Key3 == 1) & (Key4 == 1)) //判斷按鍵是否釋放 { Key_State = Init; //如果按鍵釋放,轉(zhuǎn)換到按鍵初始態(tài) } break;
;
}
//===============================================================================
//函數(shù)名稱:鍵盤掃描(狀態(tài)機(jī)無(wú)延時(shí)消抖)
//說明:鍵盤接口對(duì)應(yīng): key1 = P2-4 key2 = P2-5 key3 = P2-6 key4 = P2-7
//參數(shù):
//返回值:
//日期:2011-6-22
//修改:
//===============================================================================
void Keyscan(void)
{
switch (Key_State)
{
P1 = 0xfe;
Delay_ms(500);
P1 = 0xff;
P1 = 0xfd;
Delay_ms(500);
P1 = 0xff;
P1 = 0xfb;
Delay_ms(500);
P1 = 0xff;
P1 = 0xf7;
Delay_ms(500);
P1 = 0xff;
}
}
這是另外一種,其實(shí)都差不多,只不過比較直觀而已。
void Keyscan(void)
{
switch (Key_State)
{
P1 = 0xfe;
Delay_ms(500);
P1 = 0xff;
P1 = 0xfd;
Delay_ms(500);
P1 = 0xff;
P1 = 0xfb;
Delay_ms(500);
P1 = 0xff;
P1 = 0xf7;
Delay_ms(500);
P1 = 0xff;
}
}
關(guān)鍵詞:
51單片機(jī)狀態(tài)機(jī)消
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號(hào)放大器
評(píng)論