搜索
bottom↓
回复: 12

请教马老师:“一个按键两种状态”的按键状态机,我的思路对吗?

[复制链接]

出0入0汤圆

发表于 2009-3-16 09:12:58 | 显示全部楼层 |阅读模式
1、在参数设置模式下,每按一次“↑”键,数码管上的数字+1
2、在运行模式下,每隔20ms只要检测到“↑”键对应的电平为低电平,就认为有一次按键


unsigned char Key_value1;
unsigned char Key_value2;
unsigned char set_mark;//参数设置状态

  if (time_10ms_ok)
    {
       time_10ms_ok=0;
       switch (key_state)
       {
            case 0://读电平
                Key_value1=PINB&0x01;
                break;
            case 1://再次读电平
               Key_value2=PINB&0x01;
               if (Key_value1=Key_value2)//前后两次电平相同
               {
                    if (!(Key_value1 & 0x01)//如果有按键按下
                    {
                         if (set_mark)//如果参数设置状态下
                         {
                            key_mark=TRUE;//置按键标志
              key_code = number_plus_key;//置数值+1键   
                             key_state=2;//转去判断按键是否释放
                         }
                         else         //如果运行状态下
                         {
                             key_mark=TRUE;//置按键标志
              key_code = Quick_plus_key;//置快速+1键 
                            key_state=0
                          }
                    }
                        
               }
               else
                 key_state=0;
                break;
          case 2:
              if (pinb&0x01)
                key_state=0;
               break;
       }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2009-3-16 09:16:20 | 显示全部楼层
搞的好复杂啊。
建议把消抖动部分独立出来。

出0入0汤圆

发表于 2009-3-16 09:43:22 | 显示全部楼层
不好。

按健扫描就只负责按健检测有无按健,以及是哪个健。返回给上层就可以了。

在上层代码中,再应该使用状态机,把工作状态分成“设置”和“运行”,然后在各自的状态中根据按健做自己的事情。

这样各个部分的代码相对独立,互不干扰,结构更加清楚,调试修改也方便。

参考:


if (time_10ms_ok)  key_value = read_key();  read_key()10ms执行一次,返回键值No_KEY、KEY_1、KEY_2....
switch (work_state)
{
    case SET_STATE:
         if (key_value == KEY_1)
         {}
         .......
         break;
    case RUN_STATE:
         if(key_value == KEY_1)
         {}
         .......
         break;
}   

至于read_key()本身也采用状态机方式扫描,见我编写的教程相关部分。

以上供参考。

出0入0汤圆

 楼主| 发表于 2009-3-16 11:59:30 | 显示全部楼层
谢谢,
 目前主要的问题是:
  (1)、当设置状态时,每按一次“↑”键,检测到低电平后,必须要判断该键是否已经释放(即变为高电平),才能再次判断该键是否按下。
  (2)、当运行状态时,只要检测到低电平,就认为一次有效的按键。不需要检测该按键是否已经释放。

  而马老师的按键状态机如下:
    
    状态0:
       读键端口
          if (有按键按下)
                  转状态1
    状态1: 
       读键端口
          if (前后两次相同)
       {
                  置按键标志
                  转状态2,等等按键释放
               }
               else
         转状态0
    状态2:
       读键端口
       if (按键已经释放)
         转状态0     

出0入0汤圆

发表于 2009-3-16 12:13:26 | 显示全部楼层
那就不做按健处理,在运行状态时,只要单独检测I/O口电平就可以了。

if (time_10ms_ok)  key_value = read_key();  read_key()10ms执行一次,返回键值No_KEY、KEY_1、KEY_2....
switch (work_state)  
{
    case SET_STATE:
         if (key_value == KEY_1)  
         {}
         .......
         break;
    case RUN_STATE:
         if(time_20ms_ok && (PORTA.0 == 0))
         {
              time_20ms_ok = 0;
              if (PORTA.0 == 0)
              {}
          }
         .......
         break;
}

出0入0汤圆

发表于 2009-3-16 12:23:54 | 显示全部楼层
MARK

出0入0汤圆

 楼主| 发表于 2009-3-16 13:11:10 | 显示全部楼层
谢谢。

出0入0汤圆

 楼主| 发表于 2009-3-24 09:31:13 | 显示全部楼层
最终方案:
   系统共有三个键,参数表共有二级,第一级只需要在正常状态下,按一下SET即可进入。
 第二级参数必须长按SET键3秒才能进入。
   (1)、SET键
      (a)、按一下SET键,进入参数设置过程(进入一级参数),此后可以通过按SET键翻阅下一个参数。
      (b)、长按SET键3秒,进入第二级参数,此后可以通过按SET键翻阅下一个参数 
   (2)、↑键
            (a)、正常状态下,只要检测到低电平,就认为一次有效的按键,无需等待该键释放。
            (b)、设置状态下,只要检测到低电平,就认为一次有效的按键,必须需等待该键释放。(被设定数值+1)
   (3)、↓键
            (a)、正常状态下,只要检测到低电平,就认为一次有效的按键,无需等待该键释放。
            (b)、设置状态下,只要检测到低电平,就认为一次有效的按键,必须需等待该键释放。(被设定数值-1)

出0入0汤圆

发表于 2009-3-26 22:18:21 | 显示全部楼层
Mark

出0入0汤圆

发表于 2010-1-5 23:05:17 | 显示全部楼层
等待 下文

出0入0汤圆

发表于 2010-4-3 22:58:05 | 显示全部楼层
我觉得用状态机做键盘,最好分开写,一个是键盘检测,别一个是键盘功能。我在学习了马老师的键盘程序后自己写了一个,很好用

出0入0汤圆

发表于 2011-5-16 01:15:49 | 显示全部楼层
不错,好用
头像被屏蔽

出0入0汤圆

发表于 2011-12-17 09:49:10 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 00:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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