博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用状态机实现键盘消抖【转】
阅读量:5079 次
发布时间:2019-06-12

本文共 1600 字,大约阅读时间需要 5 分钟。

本文转载自:
用状态机实现键盘消抖 
  
作者 lwd110 日期 2009-6-1 14:29:00
转自:http://blog.21ic.com/user1/5700/archives/2009/59688.html
 
 

一直用状态机做键盘消抖,觉得很好用,不必延时等待键盘稳定,当检测到有键按下或弹起时能发出相应的键盘消息,英文不好,只好用拼音做变量名和函数名,将就看吧 ;-)

设置状态机有4种状态,A0,A1,A2,A3

状态转换图如下:

 

结构图

初始时处于A0状态,当扫描发现有键按下时,转入到A1状态。
当处于A1状态时,当扫描发现有键按下并且键值等于A1状态下的键值时,转入到A2状态,否则转入A0状态。
当处于A2状态时,当扫描发现有键按下并且键值等于A2状态下的键值时,转入到A3状态,同时发出键按下消息或将按下键的键值入队,否则转入A0状态。
当处于A3状态时,当扫描发现无键按下时,转入到A0状态。同时发出键弹起消息或弹起键的键值入队。

函数JianSaoMiao()用于键扫描的到即时键值

函数JianChuLi()用于按键处理,可放在时钟中断中调用
例:在10ms中断中扫描并处理按键只需调用:JianChuLi(JianSaoMiao());
可使调用后完成发出键按下或键弹起的消息,或者将键值送入键值队列供后续处理

#define Kong 0x00 //定义无键按下时,键扫描返回的值

#define A0 0

#define A1 1
#define A2 2
#define A3 3

struct 
{
  unsigned char JianZhi;          //当前键值    
  unsigned char DangQianZhuangTai;//当前状态
} ZTJ;
 
void ZTJ_ChuShiHua(void)         //状态机初始化
    {
        ZTJ.DangQianZhuangTai=A0;  //初始状态A0
        ZTJ.JianZhi=Kong;          //键值为Kong
    }

uchar JianSaoMiao(void) //键值扫描

{
   uchar JianZhi;
   //在此根据实际电路插入键值扫描程序段,键值存放到JianZhi

   ......

   return(JianZhi);
}

void JianChuLi(uchar JZ)

{
   switch(ZTJ.DangQianZhuangTai) 
     {
        case A0: 
           {
              if(JZ!=Kong)
                {
                    ZTJ.DangQianZhuangTai=A1;  //有键按下,状态转移
                    ZTJ.JianZhi=JZ;       //保存当前键值
                }
           } break;

        case A1: 

           {
              if(JZ==ZTJ.JianZhi)
                   ZTJ.DangQianZhuangTai=A2;  //有键按下,且键值稳定状态转移
              else 
                    ZTJ_ChuShiHua();  //键值不稳,回到初始状态A0
           } break;

        case A2: 

           {
              if(JZ==ZTJ.JianZhi)
                {
                    ZTJ.DangQianZhuangTai=A3;  //有键按下,且键值稳定状态转移
                    //在此发出键按下消息,或将键按下键值入键值队列供后续处理

                    ......

                }
            else 
                    ZTJ_ChuShiHua();  //键值不稳,回到初始状态A0
         } break;

        case A3: 

         {
              if(JZ==Kong)
                   {
                           ZTJ_ChuShiHua();   //键已弹起,回到初始状态A0
                            //在此发出键弹起消息,或将键弹起键值入键值队列供后续处理

                           ......

                   }

        } break;

  default :
        {
           ZTJ_ChuShiHua();   //初始状态A0
        }

  }

}

转载于:https://www.cnblogs.com/zzb-Dream-90Time/p/5833521.html

你可能感兴趣的文章
三、线程
查看>>
iOS在app内部发送邮件
查看>>
论Makefile的重要性(一)-----Linux C开发
查看>>
IT项目管理工具总结
查看>>
阅读 DPDK 中文论文两则
查看>>
jquery放大镜非常漂亮噢
查看>>
[转]nginx做负载均衡的几种方式
查看>>
EasyUI:一、入门
查看>>
表单详解
查看>>
bzoj 2242: [SDOI2011]计算器
查看>>
001-计算机网络目录
查看>>
Android 获取 联系人信息
查看>>
JS动态修改页面EasyUI datebox不生效、EasyUI动态添加Class、EasyUI动态渲染解析解决方案...
查看>>
jQuery Validate验证框架详解
查看>>
JS全局变量与局部变量
查看>>
关于通过adb启动Activity、activity、service以及发送broadcast的命令
查看>>
设计模式之单例模式
查看>>
bzoj1295 [SCOI2009]最长距离
查看>>
小话设计模式原则之:单一职责原则SRP(转)
查看>>
Ubuntu MYSQL和Windows MYSQL (非C盘安装)
查看>>