stm8s105K4 多按键,多功能 长短按键 区分 有限状态机

2019-12-11 18:33发布

自己测试没有什么问题,求鉴定
这个按键要每20MS 调用一下,然后用


原程序如下

/********************************
用之前把IO设置为上拉输入后每20ms调用一次就行了
每次调用 Skcankeystep()后再测试什么按键

按键处理  

*****/


#ifndef _stm8_key
#define _stm8_key 1
#include "stm8s207r.h"
#define key1   0
#define key2   1
#define key3   2
#define key4   3
#define Keyport PB_IDR
#define Key1up    (Keyport&(1<<key1))
#define Key1down  !(Keyport&(1<<key1))
#define Key2up    (Keyport&(1<<key2))
#define Key2down  !(Keyport&(1<<key2))
#define Key3up    (Keyport&(1<<key3))
#define Key3down  !(Keyport&(1<<key3))
#define Key4up    (Keyport&(1<<key4))
#define Key4down  !(Keyport&(1<<key4))
#define Key_mode_scan  1
#define Key_mode_delay  2
#define Key_mode_valu  3
#define Key_mode_K4UP 4


#define GIC_Key_Valu_Key1down 1
#define GIC_Key_Valu_Key2down 2
#define GIC_Key_Valu_Key3down 3
#define GIC_Key_Valu_Key4down 4

#define GIC_Key_Valu_Key1up  5
#define GIC_Key_Valu_Key2up  6
#define GIC_Key_Valu_Key3up  7
#define GIC_Key_Valu_Key4_long_up  8

#define  GIC_Key_Valu_Key4_short_up  9
#define  GIC_Key_Longkey_Delaytiem  250  //0.02S*250 =5s
#define  GIC_Key_Step_time          300

#define  GIC_Nokey   0;
#define  GIC_Cleardelay_time 0;
unsigned long int   GLV_Key_Scan_time;

unsigned int GIV_Key_valu;
unsigned int GIV_Key_Mode_Step=Key_mode_scan;
unsigned int GIV_Key4_delaytime ;


void Skcankey(void)
{
if(Key4down)
{
  GIV_Key_valu=4;
}
if(Key3down)
{
  GIV_Key_valu=3;
}
if(Key2down)
{
  GIV_Key_valu=2;
}
if(Key1down)
{
  GIV_Key_valu=1;
}
if(Key1up&&Key2up&&Key3up&&Key4up)
{
{
  GIV_Key_valu=5;
}
}


}
/**
以下程序是为了测试有状态机测试写的
2011年12月25日21时34分39秒
ver 01


*/
void Skcankeystep (void)
{
  switch(GIV_Key_Mode_Step)
  {
          case Key_mode_scan:
        {
           if (Key4down||Key3down||Key2down||Key1down)
          {
            if(Key1down)
       {
                                                GIV_Key_valu=GIC_Key_Valu_Key1down;
        }
                                if(Key2down)
        {
           GIV_Key_valu=GIC_Key_Valu_Key2down;
        }
                                if(Key3down)
        {
            GIV_Key_valu=GIC_Key_Valu_Key3down;
         }
                                 if(Key4down)
         {
           GIV_Key_valu=GIC_Key_Valu_Key4down;
          }
                                        GIV_Key_Mode_Step=Key_mode_delay;
          }       
   
         else
    {
                  GIV_Key_valu=GIC_Nokey;//把上次的值清去 2011年12月26日09时24分37秒test
                }               
         
           break;
        }
                  case Key_mode_delay://
        {  
          if (Key4down||Key3down||Key2down||Key1down)
          {
            if(Key1down)
       {
                                                GIV_Key_valu=GIC_Key_Valu_Key1down;
                                                GIV_Key_Mode_Step=Key_mode_valu;
        }
                                if(Key2down)
        {
           GIV_Key_valu=GIC_Key_Valu_Key2down;
                                         GIV_Key_Mode_Step=Key_mode_valu;
        }
                                if(Key3down)
        {
            GIV_Key_valu=GIC_Key_Valu_Key3down;
                                                GIV_Key_Mode_Step=Key_mode_valu;
         }
                                 if(Key4down)
         {
           GIV_Key_valu=GIC_Key_Valu_Key4down;
                                         
                                         GIV_Key_Mode_Step=Key_mode_valu;
                                         GIV_Key4_delaytime=GIC_Cleardelay_time;
          }
                                       
                }
               
                 else
    { GIV_Key_valu=GIC_Nokey;
                  GIV_Key_Mode_Step=Key_mode_scan;//这个是防止按键太快时
                        //在状态2中一直等待
                }       
        break;
        }
                  case Key_mode_valu:
        {
          switch(GIV_Key_valu)
        {
          case GIC_Key_Valu_Key1down:
          {         if(Key1up)
        {
            GIV_Key_valu=GIC_Key_Valu_Key1up;
                                                GIV_Key_Mode_Step=Key_mode_scan;
         }
                                 break;
                }
                case GIC_Key_Valu_Key2down:
          {         if(Key2up)
        {
            GIV_Key_valu=GIC_Key_Valu_Key2up;
                                                GIV_Key_Mode_Step=Key_mode_scan;
         }
                                 break;
                }
                case GIC_Key_Valu_Key3down:
          {         if(Key3up)
        {
            GIV_Key_valu=GIC_Key_Valu_Key3up;
                                                GIV_Key_Mode_Step=Key_mode_scan;
         }
                                 break;
                }
                                case GIC_Key_Valu_Key4down:
          {          GIV_Key4_delaytime++;
                   if(Key4down&&(GIV_Key4_delaytime>GIC_Key_Longkey_Delaytiem))
        {
            
                                                GIV_Key_Mode_Step=Key_mode_K4UP;
                                                GIV_Key4_delaytime=GIC_Cleardelay_time;
         }
                                 if(Key4up&&(GIV_Key4_delaytime<GIC_Key_Longkey_Delaytiem))
                         {
                         GIV_Key_valu=GIC_Key_Valu_Key4_short_up;
                         GIV_Key_Mode_Step=Key_mode_scan;
                         GIV_Key4_delaytime=GIC_Cleardelay_time; //n2011年12月25日23时03分36秒 test ok
                         }
                               
                       
                                 break;
                }
          
        }
         
          break;
        }
         case Key_mode_K4UP:
{
  if(Key4up)
  {
     GIV_Key_valu=GIC_Key_Valu_Key4_long_up;
                 GIV_Key_Mode_Step=Key_mode_scan;
                 GIV_Key4_delaytime=GIC_Cleardelay_time;
  }
     break;
}
        }
}
/*
状态机测试程序  2011年12月26日09时04分54秒

*/

#endif
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
wjjcyy
1楼-- · 2019-12-11 19:31
还有我自己在网络下找的资料 也为按键处理的
都是在状态机的基础上做的

点击此处下载 ourdev_708004JHV2RX.doc(文件大小:32K) (原文件名:多功能按键.doc)
点击此处下载 ourdev_708005PD3DPE.doc(文件大小:44K) (原文件名:新型按键程序.doc)
wangrice
2楼-- · 2019-12-11 19:37
谢谢楼主分享哈!
wjjcyy
3楼-- · 2019-12-11 21:37
突然想起我的这个有个BUG ,,,, 就是它在按下时会有一个值.. 如果单独用这个值没有问题,,但当用到按键按下,与抬起时,在一个功能中,,,就会有问题...


               这个我要更改下,,以前版本有BUG ..请注意..不过如果我把变量增加一个,,就是在按下时的值放到一个变量中
              
                抬起时再放入一个变量 ,,然后测试想用的按键,,就好了........今天试试 ...
wuguoyan
4楼-- · 2019-12-12 02:46
 精彩回答 2  元偷偷看……
linh05
5楼-- · 2019-12-12 02:50
这个匠人手记里也有比较详细的分析。呵呵
wb156351
6楼-- · 2019-12-12 04:18
mark

一周热门 更多>