用状态机实现键盘消抖
2015-10-19 17:03
218 查看
一直用状态机做键盘消抖,觉得很好用,不必延时等待键盘稳定,当检测到有键按下或弹起时能发出相应的键盘消息,英文不好,只好用拼音做变量名和函数名,将就看吧 ;-)设置状态机有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 3struct{unsigned char JianZhi; //当前键值unsigned char DangQianZhuangTai;//当前状态} ZTJ;void ZTJ_ChuShiHua(void) //状态机初始化{ZTJ.DangQianZhuangTai=A0; //初始状态A0ZTJ.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; //有键按下,且键值稳定状态转移elseZTJ_ChuShiHua(); //键值不稳,回到初始状态A0} break;case A2:{if(JZ==ZTJ.JianZhi){ZTJ.DangQianZhuangTai=A3; //有键按下,且键值稳定状态转移//在此发出键按下消息,或将键按下键值入键值队列供后续处理......}elseZTJ_ChuShiHua(); //键值不稳,回到初始状态A0} break;case A3:{if(JZ==Kong){ZTJ_ChuShiHua(); //键已弹起,回到初始状态A0//在此发出键弹起消息,或将键弹起键值入键值队列供后续处理......}} break;default :{ZTJ_ChuShiHua(); //初始状态A0}}}
相关文章推荐
- linux安装jdk和tomcat
- eclipse中各种颜色和背景的设置
- Python快速教程
- 《剑指Offer》面试题:用两个栈来实现一个队列
- iostat 磁盘性能统计
- Leetcode Spiral Matrix
- 第七周项目1--建立顺序环形队列算法库
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- Java版的Redis
- Google Guava Collections 使用介绍
- java jdbc
- Uva821-Floyd
- Linux的概念与体系
- 学习struts 浅要的理解 希望大牛指导
- 解析Xenomai在实时Linux的应用
- ECharts.net项目
- opencv2-支持向量机之SVM引导
- 自定义Dialog显示位置
- ASP.NET文件操作
- toast添加图片