您的位置 首页 发布

51单片机的状态机消抖

下午把状态机无延时按键消抖弄到51单片机上面,下面晒一下程序:includereg52h>enumState{Init,Press,Free};定义按键状态

下午把状况机无延时按键消抖弄到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;
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/319579.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部