snwuzhisheng 发表于 2012-6-5 10:01:40

发一个状态机做的 按键扫描功能 硬件调试没有问题

本帖最后由 snwuzhisheng 于 2012-6-5 10:57 编辑

硬件描述;
两个按键 一个数码管
功能描述;
当K1长按的时候 进入调节模式 四位数码管显示HXXX (其中H是高度的缩写 xxx表示数值)
当K1再次长按的时候 退出调节模式
调节模式下
当K1短按的时候 数码管在HXXXLXXXGXXX中循环显示 (H代表高度 L代表长度 G代表高度)
当K2短按的时候 增加xxx数值 按下一直按下 一直增加

这个函数每隔100ms 调用一次 没有专门的按键消抖状态运行良好
void keylong()
{
static unsigned char state=0,keynum; //keynum用来技术按键次数 keynum=2的话 说明200ms内 按下累计有两次按下了
switch (state)
        {
      case 0://只有当K1长按时 进入调节模式
                  if(K1==0)       
                          {
                          keynum++;
                          if (keynum>=10)//连续的按了十个周期 10*100ms 是长按 进入case 1
                                {
                               keynum=0;
                               state=1;
                               KEY_DELAY=100;//扫描周期重新赋值 100ms
                               oillevel=10000;//这个不要管吧 数码管程序对这个数值计算后 就显示H000了
                               goto out;//直接退出多重嵌套
                                }
                          }
                        else//不是连续的按 那就累加清零
                        keynum=0;
                        KEY_DELAY=100; //这个是扫描的周期 100ms扫描一次
                        out:
                break;                        

                case 1:        //K1短按切换不同模式 K2按加数值(有连续加功能)        K1长按退出
                  if(K1==0)       
                  {
                  /*----------------短按--*/
                  oillevel=oillevel+1000;//这个不要管吧 数码管程序对这个数值计算后 就在H000 L000 G000循环显示
                   KEY_DELAY=100;                       
                  if(oillevel>=12500) oillevel=10000;//超过返回 H000
                  /*----------------长按--*/
                  keynum++;
                  if(keynum>=10) {state=0;keynum=0;oillevel=999;goto out1;}
                  }
                  else
                  keynum=0;
                                            
                  if(K2==0)        oillevel++;       //如果K2 被按下 数码管就一直加数值 当然单次按的话 也会加 100ms只是实验值 挺好的 没具体研究
                  KEY_DELAY=100;
                  out1:
                break;        
   
        }       
       

}
那个 有兴趣看完的 可以给点意见 嘿嘿 发点贴 混点分数

snwuzhisheng 发表于 2012-6-5 10:22:22

上面写错了
简单说
当按键1长按 进入参数设置 再次长按退出参数设置
在设置状态下 按K1 设置不同参数 按K2 增加参数

时光黑白 发表于 2012-6-5 10:25:49

有个问题不明白,K1短按时程序如何消抖?你程序里面只有长按后下一步才能进入case 1
没看懂楼主的程序.{:dizzy:}

snwuzhisheng 发表于 2012-6-5 10:36:02

时光黑白 发表于 2012-6-5 10:25 static/image/common/back.gif
有个问题不明白,K1短按时程序如何消抖?你程序里面只有长按后下一步才能进入case 1
没看懂楼主的程序.{:di ...

{:3_48:}是啊 只有长按 case1 其他时候 不做处理

snwuzhisheng 发表于 2012-6-5 10:38:49

snwuzhisheng 发表于 2012-6-5 10:36 static/image/common/back.gif
是啊 只有长按 case1 其他时候 不做处理

{:3_54:} 一语惊醒梦中人 我完全可以 把长按去掉
按K1 在 长度 高度 宽度 参数上设置 然后第四次后 又回到正常运行状态 {:3_52:}

时光黑白 发表于 2012-6-5 10:39:10

那不是每次进来都要设置?设置完了后才能操作别的啊。

snwuzhisheng 发表于 2012-6-5 10:40:41

时光黑白 发表于 2012-6-5 10:39 static/image/common/back.gif
那不是每次进来都要设置?设置完了后才能操作别的啊。

{:3_49:} 没有啊 其他任务继续进行 例如ad采集 数码管显示

时光黑白 发表于 2012-6-5 10:56:31

我知道,我是说每次要操作按键,要先长按K1才能操作K2

snwuzhisheng 发表于 2012-6-5 10:59:12

{:3_48:}没错 没错 这个兄弟看的没错 就是要实现这功能 因为产品出去 一般只要设置一次就不要设置了 但是领导又不希望在程序里面改 直接烧写

yao1 发表于 2012-6-5 12:46:21

这个还是延迟函数的 还是中断控制好点啊
产品要求不高的我都这么写
if(s_set==0&&flash==0)//按下3秒进入设定
{
         Delayms(50);      
         while(s_set==0)
         {
            Delayms(50);
            key_press_i++;
            if(key_press_i>60)break;// press 3 second            
      }
      if(key_press_i>60)
      {
            。。。。。
      }

snwuzhisheng 发表于 2012-6-5 14:41:24

yao1 发表于 2012-6-5 12:46 static/image/common/back.gif
这个还是延迟函数的 还是中断控制好点啊
产品要求不高的我都这么写
if(s_set==0&&flash==0)//按下3秒进入 ...

请问下 Delayms(50);   的时候是不是什么都不做 就光延时来着?

yao1 发表于 2012-6-5 14:55:25

snwuzhisheng 发表于 2012-6-5 14:41 static/image/common/back.gif
请问下 Delayms(50);   的时候是不是什么都不做 就光延时来着?

对 产品要求设置好后记忆才开始自动运行设置过程一切停止运行 所以延迟函数也没事

yao1 发表于 2012-6-5 14:57:01

我觉得用不用状态机看产品要求 一些比较简单的就没必要用状态机的

ldzhi2012 发表于 2012-7-19 20:06:25

这个程序。。。。。学习了!

miaoxun206 发表于 2012-8-9 16:46:15

先mark一下

bbxyliyang08 发表于 2012-11-4 22:02:46

yao1 发表于 2012-6-5 14:57 static/image/common/back.gif
我觉得用不用状态机看产品要求 一些比较简单的就没必要用状态机的

状态机只是一种方法
页: [1]
查看完整版本: 发一个状态机做的 按键扫描功能 硬件调试没有问题