用状态机实现键盘消抖
来源:互联网 发布:网络大电影发行多少钱 编辑:程序博客网 时间:2024/04/29 16:25
一直用状态机做键盘消抖,觉得很好用,不必延时等待键盘稳定,当检测到有键按下或弹起时能发出相应的键盘消息,英文不好,只好用拼音做变量名和函数名,将就看吧 ;-)
设置状态机有4种状态,A0,A1,A2,A3
初始时处于A0状态,当扫描发现有键按下时,转入到A1状态。
当处于A1状态时,当扫描发现有键按下并且键值等于A1状态下的键值时,转入到A2状态,否则转入A0状态。
当处于A2状态时,当扫描发现有键按下并且键值等于A2状态下的键值时,转入到A3状态,同时发出键按下消息或将按下键的键值入队,否则转入A0状态。
当处于A3状态时,当扫描发现无键按下时,转入到A0状态。同时发出键弹起消息或弹起键的键值入队。
函数JianSaoMiao()用于键扫描的到即时键值
函数JianChuLi()用于按键处理,可放在时钟中断中调用
例:在10ms中断中扫描并处理按键只需调用:JianChuLi(JianSaoMiao());
可使调用后完成发出键按下或键弹起的消息,或者将键值送入键值队列供后续处理*/
设置状态机有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; //初始状态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 } }}
0 0
- 用状态机实现键盘消抖
- VHDL 键盘扫描程序,用状态机实现
- 状态机来做键盘
- stm32F103状态机矩阵键盘
- 状态机按键消抖
- 状态机实现
- 用状态机驱动实现ZIGZAG扫描矩阵
- 用状态模式实现状态机工作流
- 状态机(二):Verilog状态机实现
- LUA实现状态机
- AC状态机简单实现
- qt状态机的实现
- 标准状态机的实现
- 状态机的实现
- 状态机的实现
- C语言实现状态机
- android状态机实现原理
- lua实现的状态机
- 修改Linux的系统时间
- linux程序守护进程(shell)
- GridLayout与TableLayout布局
- Android硬件加速导致一个View显示记录
- 数据结构之简易词法分析(未包含错误分析)
- 用状态机实现键盘消抖
- 《剑指Offer》面试题:用两个栈来实现一个队列
- 数据归一化汇总
- 程序动态分析工具调研
- Leetcode106: Remove Duplicates from Sorted Array II
- linux安装jdk和tomcat
- char nchar varchar nvarchar的区别
- 第四周--【项目1 - 建设“单链表”算法库】
- java对redis的基本操作