找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 71963|回复: 153
收起左侧

状态机按键扫描,看懂了会增长你的功力。。。。

  [复制链接]
ID:69862 发表于 2014-12-14 21:19 | 显示全部楼层 |阅读模式
本帖最后由 xiao_yp2014 于 2016-1-21 14:37 编辑

大家好!我叫肖亚平,从小热爱上了电子技术,读书时阴差阳错的选择了电子这方面的专业,学习电子技术。对于我的理解来说,学校里面学到的技术不是全部实用,但是必须有用,所以一直奋斗在前线。我对学习总结出一句话“压力不是有人努力,而是比你牛X N倍的人依然在努力
说在前面:
              做单片机开发少不了的就是通过按键和单片机交流,按键是单片机交流的一个桥梁,所以状态机按键扫描犹如嵌入式一样的火爆,在网上一搜一大把,一说起按键,学了单片机的人都知道有个叫做“状态机扫描的方法”,这个方法确实比其它的按键方法要好得多,我记得在星期五的一个下午,一个网友叫我帮他调一个程序,他当时说按下按键显示就不显示了,我一想,按键肯定有问题,我打开程序一看,里面居然还有像这样的语句存在“ while(!Key); ”这明显是给自己找麻烦,给CPU挖陷阱嘛,下面分享一个状态机的按键扫描方法,据说这种方法是实时最高的,今天我也是亲自试过,确定如此。


捕获.PNG


程序如下:main.c
  1. /********************************************************************************************
  2. 名    称:状态机按键扫描
  3. 功    能:运用状态机思想,实现按下按键LED点亮,再按一下LED灯熄灭。
  4. 作    者:肖亚平
  5. 创建时间:2014年12月14日
  6. 修改时间:
  7. 备    注:
  8. **************************************************************************************************/
  9. #include<reg52.h>                 //头文件
  10. #include"Key_State.h"         //按键扫描头文件

  11. sbit Led = P0^7;                 //LED灯输出

  12. unsigned char Key_Number = 0; //按键值

  13. /********************************************************************************************
  14. 函数名称:主程序
  15. 功    能:程序执行的入口
  16. 返 回 值:无
  17. 时    间:2014-12-14        
  18. 备    注:
  19. **************************************************************************************************/
  20. void main()
  21. {
  22.    while(1)
  23.    {
  24.        Key_Number = read_key();        //调用按键扫描函数,取得按键值,10MS调用一次,这里我没有计时

  25.            if(Key_Number == 1)                //按键返回值是1
  26.            {
  27.               Led = ~Led;                        //LED灯取反
  28.            }
  29.    }
  30. }
复制代码

Key_State.c
  1. #include<reg52.h>

  2. sbit key_sr1 = P1^6;  // 按键输入口

  3. #define key_state_0        0   //按键的初始状态
  4. #define key_state_1        1   //按键按下的状态
  5. #define key_state_2        2   //按键释放的状态

  6. /********************************************************************************************
  7. 函数名称:按键扫描程序
  8. 功    能:检测按键,并返回按键值
  9. 返 回 值:key_press
  10. 时    间:2014-12-14        
  11. 备    注:
  12. **************************************************************************************************/
  13. unsigned char read_key(void)
  14. {
  15.     static char key_state = 0;     //按键的状态
  16.     unsigned char key_press;       //按键是否被按下
  17.         unsigned char key_return = 0;  //按键返回值
  18.     key_press = key_sr1;         // 读按键I/O电?
  19.    
  20.     switch (key_state)
  21.     {
  22.         case key_state_0:                 // 按键初始态
  23.                 if (!key_press)
  24.                 {
  25.                                 key_state = key_state_1;// 键被按下,状态转换到键确认态
  26.                         }
  27.                         break;
  28.                                 
  29.         case key_state_1:                   // 按键确认态
  30.             if (!key_press)
  31.             {
  32.                 key_return = 1;         // 按键仍按下,按键确认输出为“1”
  33.                 key_state = key_state_2;// 状态转换到键释放态
  34.             }
  35.             else
  36.             {
  37.                                 key_state = key_state_0; // 按键已抬起,转换到按键初始态
  38.                         }
  39.             break;
  40.                                 
  41.         case key_state_2:
  42.             if (key_press)
  43.                         {
  44.                             key_state = key_state_0;//按键已释放,转换到按键初始态
  45.             }
  46.             break;
  47.    }
  48. return key_return;                            //返回按键值
  49. }
复制代码

Key_State.h
  1. #ifndef __Key_State_H__
  2. #define __Key_State_H__

  3. unsigned char read_key(void);

  4. #endif
复制代码


Key_State.zip (34.43 KB, 下载次数: 1413)

评分

参与人数 4黑币 +51 收起 理由
陈润源home + 10 谢谢肖哥,师弟又学到东西了
botgs + 5 赞一个!
goty2000 + 1 多谢楼主,这次可以彻底摆脱while(KEY==0);.
暗光 + 35 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:68618 发表于 2014-12-15 02:27 来自手机 | 显示全部楼层
大师的解说风趣幽默,简单易懂。又学到了知识,谢谢,万分感谢
回复

使用道具 举报

ID:69862 发表于 2014-12-15 09:27 | 显示全部楼层
aabbcc 发表于 2014-12-15 02:27
大师的解说风趣幽默,简单易懂。又学到了知识,谢谢,万分感谢

希望对你有帮助,相互学习。。。。
回复

使用道具 举报

ID:68804 发表于 2014-12-15 11:10 | 显示全部楼层
学习了
回复

使用道具 举报

ID:69862 发表于 2014-12-15 11:36 | 显示全部楼层

相互学习,希望对你有帮助,。。。。
回复

使用道具 举报

ID:48140 发表于 2014-12-18 08:14 来自手机 | 显示全部楼层
学习一下。
回复

使用道具 举报

ID:69862 发表于 2014-12-18 08:23 | 显示全部楼层

相互学习,希望对你有帮助,。。。。
回复

使用道具 举报

ID:70075 发表于 2014-12-21 22:03 | 显示全部楼层
好东西  赞一个
回复

使用道具 举报

ID:70075 发表于 2014-12-21 22:04 | 显示全部楼层
回去好好看
回复

使用道具 举报

ID:5501 发表于 2014-12-24 22:46 | 显示全部楼层
好好研究下,听说过状态机按键很好,一直还没学会,谢谢楼主讲解。
回复

使用道具 举报

ID:69862 发表于 2014-12-25 12:14 | 显示全部楼层
shgdd520com 发表于 2014-12-24 22:46
好好研究下,听说过状态机按键很好,一直还没学会,谢谢楼主讲解。

其实也不难,只是把一个按键,分成了几个状态。在不同的状态下需要作不同的判断。。。。
回复

使用道具 举报

ID:70544 发表于 2014-12-28 15:08 | 显示全部楼层
好东西  赞一个
回复

使用道具 举报

ID:59269 发表于 2014-12-28 21:45 | 显示全部楼层
下载学习,谢谢分享
回复

使用道具 举报

ID:73002 发表于 2015-2-5 22:31 | 显示全部楼层
下载学习,谢谢分享
回复

使用道具 举报

ID:29438 发表于 2015-2-7 08:49 | 显示全部楼层
学习了,谢谢!
回复

使用道具 举报

ID:73030 发表于 2015-2-7 15:03 来自手机 | 显示全部楼层
学无止境,谢谢。
回复

使用道具 举报

ID:73450 发表于 2015-2-13 20:56 | 显示全部楼层
学习一下
回复

使用道具 举报

ID:73995 发表于 2015-3-1 15:10 | 显示全部楼层
学习学习,
回复

使用道具 举报

ID:74044 发表于 2015-3-2 16:51 | 显示全部楼层
学习学习一下,谢谢楼主
回复

使用道具 举报

ID:46228 发表于 2015-3-3 22:42 | 显示全部楼层
又学到了知识,万分感谢,太感动了
回复

使用道具 举报

ID:29438 发表于 2015-3-4 13:24 | 显示全部楼层
谢谢!
回复

使用道具 举报

ID:47760 发表于 2015-3-5 06:31 来自手机 | 显示全部楼层
l谢谢楼主讲解
回复

使用道具 举报

ID:73572 发表于 2015-3-6 10:42 来自手机 | 显示全部楼层
正好最近一直为这个问题烦忧,多谢分享。回去慢慢研究研究
回复

使用道具 举报

ID:74706 发表于 2015-3-16 11:31 | 显示全部楼层
学习了,很好的方法
回复

使用道具 举报

ID:75007 发表于 2015-3-21 16:47 | 显示全部楼层
hehehe学习下
回复

使用道具 举报

ID:37003 发表于 2015-3-24 16:59 | 显示全部楼层
很不错的思路
回复

使用道具 举报

ID:86418 发表于 2015-7-21 22:02 | 显示全部楼层
支持长按么
回复

使用道具 举报

ID:87496 发表于 2015-8-3 01:29 | 显示全部楼层
好东西啊,下来看看!~
回复

使用道具 举报

ID:79544 发表于 2015-8-3 18:29 | 显示全部楼层
独立按键,那矩阵按键呢?
回复

使用道具 举报

ID:64178 发表于 2015-8-4 09:13 | 显示全部楼层
已下载,看看,谢谢LZ
回复

使用道具 举报

ID:87682 发表于 2015-8-5 13:15 | 显示全部楼层
正好需要,多谢搂住
回复

使用道具 举报

ID:87781 发表于 2015-8-6 20:37 | 显示全部楼层
正在学习,很好的资料,谢谢分享
回复

使用道具 举报

ID:87781 发表于 2015-8-6 20:38 | 显示全部楼层
很好的资料,代码整洁,可读性高,谢谢楼主
回复

使用道具 举报

ID:62929 发表于 2015-8-8 10:18 来自手机 | 显示全部楼层
很有用谢谢啦
回复

使用道具 举报

ID:86753 发表于 2015-8-8 19:29 | 显示全部楼层
楼主问一下,这个程序是只可以扫描一个按键吗?因为我只看到一个按键定义。还有正常的判断按键是否按下的程序不是应该有检测到按键按下之后有一个延时躲避抖动吗?这样的设计会使按键判断不准确吗?谢谢楼主,我小白一个……
回复

使用道具 举报

ID:84495 发表于 2015-8-10 17:18 | 显示全部楼层
看看是何神器,,赢得一楼如此美赞
回复

使用道具 举报

ID:89194 发表于 2015-9-1 10:04 | 显示全部楼层
最近在研究这个状态机按键,下来看下
回复

使用道具 举报

ID:89194 发表于 2015-9-1 10:09 | 显示全部楼层
下下来看了一下,写的很简单明了,便于理解!
回复

使用道具 举报

ID:90231 发表于 2015-9-16 08:42 | 显示全部楼层
感觉很有帮助,现在就是需要规范程序
回复

使用道具 举报

ID:90296 发表于 2015-9-16 21:30 | 显示全部楼层
这个怎么用。我也下来看看
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表