打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
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<="" div="">
;
}
//===============================================================================
//函数名称:键盘扫描(状态机无延时消抖)
//说明:键盘接口对应: 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;
}
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
MidTouch21触摸式电子琴源程序
晃动屏(程序分析)
学习前辈的,自己再土做了个电子钟
单片机入门培训专题(十三) – 按键应用技巧 – 著名的PCB哥
用单片机控制步进电机的程序
6位LED电子钟程序 LCDHOME论坛
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服