| 四、实验前提 1、在进行本文步骤前,请先阅读以下博文:
 暂无
 
 
 2、在进行本文步骤前,请先实现以下博文:
 
 暂无
 
 
 
 五、基础知识
 暂无
 
 
 六、硬件原理图 
 
  
 本文使用PB2作为按键引脚,PB2配置为内部上拉输入,当KEY1按键按下时,PB2被拉低。 
 
 七、实验步骤 
 1、工程中添加长短按键的驱动 1)写一个长短按键的驱动GUA_Key.c (存放在工程的USER文件夹中)[cpp] view plain copy 
   
 
 //******************************************************************************                            //name:             GUA_Key.c               //introduce:        按键驱动        //author:           甜甜的大香瓜                     //email:            897503845@qq.com         //QQ group          香瓜单片机之STM8/STM32(164311667)                      //changetime:       2016.11.14       //******************************************************************************    #include "stm8l10x.h"  #include "GUA_Key.h"    /*********************宏定义************************/  #ifndef U8    typedef unsigned char U8;    #endif      #ifndef U32    typedef unsigned long U32;    #endif      //按键引脚宏  #define GUA_KEY_PORT               GPIOB  #define GUA_KEY_PIN                GPIO_Pin_2  #define GUA_KEY_MODE               GPIO_Mode_In_PU_No_IT    //按键触发宏  #define GUA_KEY_TRIGGER            RESET                                //低电平触发    //按键消抖宏  #define GUA_KEY_DISAPPEARS_SHAKES_SHORT_COUNT           2000            //短按键消抖数,约20ms  #define GUA_KEY_DISAPPEARS_SHAKES_LONG_COUNT            300000          //长按键消抖数,约3S    /*********************内部变量************************/  static U32 sGUA_Key_DisappearsShakes_TriggerCount = 0;                  //消抖时的触发状态计数值    //******************************************************************************                //name:             GUA_Key_Scan               //introduce:        按键检测触发状态            //parameter:        none      //return:           GUA_KEY_STATUS_IDLE or GUA_KEY_STATUS_TRIGGER_SHORT or GUA_KEY_STATUS_TRIGGER_LONG or GUA_KEY_STATUS_NO_LOOSEN               //author:           甜甜的大香瓜                     //email:            897503845@qq.com         //QQ group          香瓜单片机之STM8/STM32(164311667)                      //changetime:       2016.11.14                        //******************************************************************************    U8 GUA_Key_Scan(void)      {        //触发    if(GPIO_ReadInputDataBit(GUA_KEY_PORT, GUA_KEY_PIN) == GUA_KEY_TRIGGER)     {      //如果上一次按键是长按键结束的,需要检测到松开方可开始下一次计数      if(sGUA_Key_DisappearsShakes_TriggerCount >= GUA_KEY_DISAPPEARS_SHAKES_LONG_COUNT)      {            return GUA_KEY_STATUS_NO_LOOSEN;      }          //计数      sGUA_Key_DisappearsShakes_TriggerCount++;            //判断计数是否足够      while(sGUA_Key_DisappearsShakes_TriggerCount >= GUA_KEY_DISAPPEARS_SHAKES_SHORT_COUNT)      {        //检测到松开、超时的时候,则处理        if((GPIO_ReadInputDataBit(GUA_KEY_PORT, GUA_KEY_PIN) != GUA_KEY_TRIGGER) || (sGUA_Key_DisappearsShakes_TriggerCount >= GUA_KEY_DISAPPEARS_SHAKES_LONG_COUNT))        {          //长按键时          if(sGUA_Key_DisappearsShakes_TriggerCount >= GUA_KEY_DISAPPEARS_SHAKES_LONG_COUNT)          {                      return GUA_KEY_STATUS_TRIGGER_LONG;                                   }          //短按键时          else          {                     return GUA_KEY_STATUS_TRIGGER_SHORT;                                    }        }            //继续计数用来判断长短按键        sGUA_Key_DisappearsShakes_TriggerCount++;            }        }    //未触发    else    {      sGUA_Key_DisappearsShakes_TriggerCount = 0;     }        return GUA_KEY_STATUS_IDLE;    }     //******************************************************************************                //name:             GUA_Key_Init               //introduce:        按键初始化            //parameter:        none      //return:           none             //author:           甜甜的大香瓜                     //email:            897503845@qq.com         //QQ group          香瓜单片机之STM8/STM32(164311667)                      //changetime:       2016.11.14                       //******************************************************************************    void GUA_Key_Init(void)  {    //按键IO初始化    GPIO_Init(GUA_KEY_PORT, GUA_KEY_PIN, GUA_KEY_MODE);      }  
 
 2)写一个长短按键的驱动头文件GUA_Key.h(存放在工程的USER文件夹中)
 
 [cpp] view plain copy
 
   
 
 //******************************************************************************                            //name:             GUA_Key.h               //introduce:        按键驱动的头文件        //author:           甜甜的大香瓜                     //email:            897503845@qq.com         //QQ group          香瓜单片机之STM8/STM32(164311667)                      //changetime:       2016.11.14       //******************************************************************************    #ifndef _GUA_KEY_H_  #define _GUA_KEY_H_     /*********************宏定义************************/  //按键的触发状态  #define GUA_KEY_STATUS_IDLE                             0            //按键没触发  #define GUA_KEY_STATUS_TRIGGER_SHORT                    1            //短按键触发  #define GUA_KEY_STATUS_TRIGGER_LONG                     2            //长按键触发  #define GUA_KEY_STATUS_NO_LOOSEN                        3            //长按键触发后未松开    /*********************外部函数声明************************/   unsigned char GUA_Key_Scan(void);    void GUA_Key_Init(void);    #endif  
 
 3)工程中添加GUA_Key.c
 
 
  
 
 4)添加驱动的路径
 [cpp] view plain copy
 
   
 
 注意USER文件夹是与“Project”等文件夹同级的自定义文件,用于存放香瓜写的代码。
 
 
 
 
 2、应用层中调用 3)编写测试代码(main.c的main函数中)
 
 
 
 八、注意事项
 
 暂无
 
 九、实验结果
 
 
 
 仿真并设置断点查看长短按键的处理,可发现: 1、3S以内的按键被判定为短按键,并跳转至短按键处理事件中处理。 2、3S以上的按键被判定为长按键,并跳转至长按键处理事件中处理。处理之后的下一次按键判定必须等待按键松开后才开始。 
 |