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

2020-02-02 09:32发布

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

硬件描述;
两个按键 一个数码管
功能描述;
当K1长按的时候 进入调节模式 四位数码管显示HXXX (其中H是高度的缩写 xxx表示数值)
当K1再次长按的时候 退出调节模式
调节模式下
当K1短按的时候 数码管在HXXX  LXXX  GXXX中循环显示 (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;        
   
        }       
         

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

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
snwuzhisheng
1楼-- · 2020-02-02 10:57
上面写错了
简单说
当按键1长按 进入参数设置 再次长按退出参数设置
在设置状态下 按K1 设置不同参数 按K2 增加参数
时光黑白
2楼-- · 2020-02-02 12:03
 精彩回答 2  元偷偷看……
snwuzhisheng
3楼-- · 2020-02-02 17:31
时光黑白 发表于 2012-6-5 10:25
有个问题不明白,K1短按时程序如何消抖?你程序里面只有长按后下一步才能进入case 1
没看懂楼主的程序.{:di ...

是啊 只有长按 case1 其他时候 不做处理
snwuzhisheng
4楼-- · 2020-02-02 17:50
snwuzhisheng 发表于 2012-6-5 10:36
是啊 只有长按 case1 其他时候 不做处理

一语惊醒梦中人 我完全可以 把长按去掉
按K1 在 长度 高度 宽度 参数上设置 然后第四次后 又回到正常运行状态
时光黑白
5楼-- · 2020-02-02 19:52
那不是每次进来都要设置?设置完了后才能操作别的啊。
snwuzhisheng
6楼-- · 2020-02-02 20:43
时光黑白 发表于 2012-6-5 10:39
那不是每次进来都要设置?设置完了后才能操作别的啊。

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

一周热门 更多>