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

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;        
   
        }       
         

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

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
yao1
2020-02-03 01:13
这个还是延迟函数的 还是中断控制好点啊
产品要求不高的我都这么写
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)
        {
              。。。。。
        }

一周热门 更多>