单片机/MCU论坛
登录
直播中
胡秋阳
13年用户
5435经验值
私信
关注
初学者适合,什么叫状态机:按键消抖实例
键盘
按键消抖
状态机
貌似没有教程讲到过状态机的概念和编程思路,特从别的
论坛
转贴一篇很好的实例,献给广大初学者。
用状态机做键盘消抖,很好用,不必延时等待键盘稳定,当检测到有键按下或弹起时能发出相应的键盘消息,英文不好,只好用拼音做变量名和函数名,将就看吧 ;-)
设置状态机有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
}
}
}
回帖
(27)
电子工程师
2011-6-12 11:44:42
挺合适的,学习了。
挺合适的,学习了。
举报
cailiminabc
2011-9-5 16:34:15
学习了
学习了
举报
叶楠
2011-10-11 01:59:32
学习了
学习了
举报
164017
2012-3-3 21:38:43
我是初学者,谢谢了!
我是初学者,谢谢了!
举报
yxfyxf2000
2012-5-30 07:30:53
状态机实现按键扫描的思路很不错
状态机实现按键扫描的思路很不错
举报
蜡笔小新868
2012-5-30 09:20:09
学习学习
学习学习
举报
hr
2012-5-31 21:41:27
学习学习
学习学习
举报
1653343207.965700
2012-7-16 11:48:35
学习
学习
学习
学习
举报
张进
2012-7-16 14:00:09
必须学这样写!慎用延时!不要让处理器处在等待状态!
必须学这样写!慎用延时!不要让处理器处在等待状态!
举报
彭飞
2012-7-16 16:57:06
跟传统的行列扫描法不太一样,值得学习!
跟传统的行列扫描法不太一样,值得学习!
举报
oyl
2012-7-16 17:27:29
学习了
学习了
举报
oyl
2012-7-16 17:27:33
学习了
学习了
举报
杨礼斌
2012-7-16 17:31:54
好吧~~好好学习,之前没接触过
好吧~~好好学习,之前没接触过
举报
wanghongyan
2012-8-16 01:14:49
嗯,嗯~~~很有道理嘛~~~
嗯,嗯~~~很有道理嘛~~~
举报
郭建颖
2012-8-16 10:57:18
学习了,顶一个
学习了,顶一个
举报
张金弟
2012-9-29 09:42:02
学习!
学习!
举报
小涔
2012-9-29 09:49:32
学习了~~~
学习了~~~
举报
吴明宽
2013-1-17 19:43:10
在哪里嫩
在哪里嫩
举报
王健
2013-1-17 22:07:39
马克
马克
举报
更多回帖
rotate(-90deg);
回复
相关帖子
键盘
按键消抖
状态机
按键
应用程序(
适合
初学者
)
26
初学者
对有限
状态机
(FSM)的设计的认识
4176
利用
状态机
的
按键
消
抖
程序
30
LabVIEW
状态机
程序,
适合
初学者
21923
STM32
按键
消
抖
——入门
状态机
思维
4632
利用
状态机
的
按键
消
抖
程序
3238
DOS 命令大全(
适合
初学者
哦)
0
适合
初学者
的螺旋称重喂料
机
5
适合
初学者
的LTE资料
0
verilog_经验(
适合
初学者
)
29
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分