51单片机的状态机消抖代码
时间:01-20 10:38 阅读:703次
*温馨提示:点击图片可以放大观看高清大图
简介:本文给大家分享了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;
}
}