微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机的状态机消抖

51单片机的状态机消抖

时间:11-23 来源:互联网 点击:
下午把状态机无延时按键消抖弄到51单片机上面,下面晒一下程序:

#include

enum State {Init, Press, Free}; //定义按键状态的枚举类型

enum State Key_State; //按键状态

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

;

}

//===============================================================================

//函数名称:键盘扫描(状态机无延时消抖)

//说明:键盘接口对应: key1 = P2-4 key2 = P2-5 key3 = P2-6 key4 = P2-7

//参数:

//返回值:

//日期:2011-6-22

//修改:

//===============================================================================

void Keyscan(void)

{

switch (Key_State)

{

case Init : // 按键初始态

if((P2 | 0x0f) != 0xff)

{

Key_State = Press; // 键被按下,但需要确认是否是干扰

}

break;

case Press : // 按键确认态

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; // 状态转换到键释放态

}

else

{

Key_State = Init; // 按键已抬起,属于干扰,转换到按键初始态

}

break;

case Free :

if((P2 | 0x0f) == 0xff) //判断按键是否释放

{

Key_State = Init; //如果按键释放,转换到按键初始态

}

break;

}

}

这是另外一种,其实都差不多,只不过比较直观而已。

void Keyscan(void)

{

switch (Key_State)

{

case Init : // 按键初始态

if((Key1 == 0) | (Key2 == 0) | (Key3 == 0) | (Key4 == 0))

{

Key_State = Press; // 键被按下,但需要确认是否是干扰

}

break;

case Press : // 按键确认态

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; // 状态转换到键释放态

}

else

{

Key_State = Init; // 按键已抬起,属于干扰,转换到按键初始态

}

break;

case Free :

if((Key1 == 1) & (Key2 == 1) & (Key3 == 1) & (Key4 == 1)) //判断按键是否释放

{

Key_State = Init; //如果按键释放,转换到按键初始态

}

break;

}

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top