- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于状态机单片机按键短按长按功能实现
基于状态机单片机按键短按长按功能实现
摘 要
本文介绍了一种基于状态机的单片机按键的实现,通过状态机实现按键的短按与长按的功能,同时改进按键消抖的方法,使单片机在节约CPU的资源的同时实现按键的各种状态的检测,提高单片机的工作效率,整个设计代码简洁,方便维护。
【关键词】状态机 按键 长按
1 引言
在自己在科研实践和对学生教学中发现,现在?纹?机学习中对于按键处理的方法都是:检测按键、延时消抖、按键执行、等待释放,整个按键处理的程序中大量出现“delay_1ms(5);”和“while(!key);”这样的语句,这明显是在给自己找麻烦,延时消抖与等待释放需要消耗CPU运行时间,执行效率低下,而且这种方法处理的按键程序也实现不了按键的短按、长按等灵活的按键操作方式。本文讲述了一种用状态机实现按键扫描的方法,达到按键的短按和长按功能,高效的处理按键消抖问题。
2 状态机
状态机在软件编程中非常重要,一个思路清晰而且高效的程序,必然有状态机的身影浮现。比如在按键命令解析程序中,本来是在状态1中,触发一个按键后切换到状态2,再触发另一个按键切换到状态3,或者返回到状态1。按键的击键过程也是一种状态的切换,也可以看着是一个状态机,一个按键的击键过程包括:按下、抖动、闭合、抖动和释放等状态。我们只要把这些状态机的思想想办法用程序表示出来就可以了。
3 按键的状态机实现
我们这里用状态机是为解决问题的,那么我们就要从问题本身去思考。为了实现按键扫描,达到按键短按和长按的功能,可以根据一个按键从按下按键到释放按键的整个过程将按键分为4个状态:
S0:等待按键按下
S1:按键按下
S2:等待按键短按释放
S3:等待按键长按释放
假设按键按下为低电平“0”,按键未按下为高电平“1”,按键的整个过程我们就可以通过状态转移图表示出来,如图1所示。
首先,按键的初始状态为S0,当检测到输入为1时,表示按键没有按下,保持S0;当输入为0时,表示按键按下,状态转入S1。在S1状态中,检测输入信号是否为0,如果为0,执行按键程序转入S2;如果为1,表示之前的按键操作是干扰信号,回到S0。在S2状态中,如果输入信号是1,则回到S0,表示按键短按已经释放;如果按键没有释放,输入为0时,就开始计时,计时没有结束前一直在S2,当计时结束了,转入S3,表示按键一直按着,为长按功能,在S2计时过程中,输入从0变为1也会回到S0。在S3状态中,输入信号为1,返回S0,表示按键长按释放;输入信号为0,执行相应的按键程序,也可以计时,等计时结束执行按键程序,达到按键连击的功能。这就是采用状态机进行按键检测达到短按与长按的整个过程。
下面以四个按键接在P1的P1.7、P1.6、P1.5、P1.4,设计状态机按键扫描程序。
程序代码如下:
#define S0 0 //状态0
#define S1 1 //状态1
#define S2 2 //状态2
#define S3 3 //状态3
void key()
{static unsigned char state=S0,key_time;
unsigned char key;
key=P10xf0; //屏蔽P1低四位
switch (state) //检测状态
{case S0://状态0
if(key!=0xf0)state=S1;break; //判断输入是否为0,为0转入状态1
case S1://状态1
if(key==0xf0)state=S0; //判断输入是否为1,为1返回状态0
else //否则,转入状态2,执行按键程序
{state=S2;
switch (key)
{case 0xe0:/*按键1执行程序*/break;
case 0xd0:/*按键2执行程序*/break;
case 0xb0:/*按键3执行程序*/break;
case 0x70:/*按键4执行程序*/break;}} break;
case S2://状态2
if(key==0xf0)state=S0;//判断输入是否为1,为1返回状态0
else if(++key_time==100){key_time=0;state=S3;}break;
//否则开始计时,计时结束转入状态3
case S3://状态3
if(key==0xf0)state=S0;//判断输入是否为1,为1返回状态0
else if(++key_time==5)//否则开始计时,计时结束按键连击
您可能关注的文档
最近下载
- 监控报价清单表-监控报价模板.xlsx VIP
- (2025秋新版)人教版二年级数学上册全册教案.doc
- 2026年河北水利发展集团有限公司公开招聘工作人员41名笔试模拟试题及答案解析.docx VIP
- 未成年人网络保护条例知识竞赛试题(含答案).docx VIP
- 2025高中信息技术课标.docx
- AS NZS 61000.4.3-2013 国外国际规范.pdf VIP
- _2025年证券专项《证券投资顾问》必背100句.pdf VIP
- 《无机非金属材料》全册完整教学课件.pptx VIP
- _2025年证券专项《证券投资顾问》超高频考点汇总.pdf VIP
- 在线网课学习课堂《医学信息素养(广州医大)》单元测试考核答案.docx VIP
文档评论(0)