7144|10

6366

帖子

4928

TA的资源

版主

楼主
 

用状态机实现键盘消抖 [复制链接]

用状态机做键盘消抖,很好用,不必延时等待键盘稳定,当检测到有键按下或弹起时能发出相应的键盘消息,
设置状态机有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
}
}
}
此帖出自单片机论坛

最新回复

学习一下!!!  详情 回复 发表于 2010-10-24 09:18
点赞 关注(1)
 

回复
举报

7

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
思路很新颖,不知道可以扫描多少个按键?
此帖出自单片机论坛
 
 

回复

537

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
思路可以参照国外的状态表编程。这个是一个过程控制的编程规则或者叫方法!使用起来比较清晰!
此帖出自单片机论坛
 
 
 

回复

802

帖子

24

TA的资源

五彩晶圆(中级)

4
 
按键用状态机的方式扫描很不错,因为按键本身状态较少,
如果状态有许多的话,用状态机会显的程序很烦锁
此帖出自单片机论坛
 
个人签名生活在激情中 ... 希望 哈哈

https://home.eeworld.com.cn/?80086
 
 

回复

1673

帖子

0

TA的资源

五彩晶圆(中级)

5
 
中断就能消抖啊
此帖出自单片机论坛
 
个人签名要把目标订的实现起来辛苦一点!
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

6
 

帮顶一下!!

帮顶一下!!
此帖出自单片机论坛
 
 
 

回复

2955

帖子

0

TA的资源

纯净的硅(初级)

7
 
好东西,可是为什么不让收藏呢
此帖出自单片机论坛
 
个人签名不断地学习,才会有创新!
淘宝小店:手机、qq点卡、游戏点卡自动充值 http://shop63727265.taobao.com/
 
 

回复

21

帖子

0

TA的资源

一粒金砂(初级)

8
 
楼主真强
此帖出自单片机论坛
 
 
 

回复

6366

帖子

4928

TA的资源

版主

9
 
原帖由 lixiaohai8211 于 2010-3-17 11:21 发表
好东西,可是为什么不让收藏呢



不让收藏?什么意思,不大明白
此帖出自单片机论坛
 
 
 

回复

184

帖子

130

TA的资源

管理员

10
 

回复 7楼 lixiaohai8211 的帖子

点主题帖旁边的”收藏“按钮,可以在”我的收藏“中看到
此帖出自单片机论坛
 
 
 

回复

618

帖子

0

TA的资源

一粒金砂(中级)

11
 
学习一下!!!
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表