×
嵌入式 > 技术百科 > 详情

STM8L之自定义长短按键

发布时间:2021-04-19 发布时间:
|

简介


本文介绍STM8L系列如何自定义一个长短按键。


实验平台


编译软件:IAR for STM8 1.42.2


硬件平台:stm8l101f3p6开发板


仿真器:ST-LINK


库函数版本:STM8L_STMTouch_Lib_V1.1.0


六、硬件原理图

本文使用PB2作为按键引脚,PB2配置为内部上拉输入,当KEY1按键按下时,PB2被拉低。


实验步骤


1、工程中添加长短按键的驱动


1)写一个长短按键的驱动GUA_Key.c (存放在工程的USER文件夹中)


//******************************************************************************                          

//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文件夹中)

//******************************************************************************                          

//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)添加驱动的路径


$PROJ_DIR$..USER  

注意USER文件夹是与“Project”等文件夹同级的自定义文件,用于存放香瓜写的代码。


2、应用层中调用


1)添加头文件(main.c中)


#include "GUA_Key.h"


2)初始化(main.c的main函数中)

  //按键初始化

  GUA_Key_Init();


3)编写测试代码(main.c的main函数中)

①替换main.c


//******************************************************************************


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ZigBee技术语音图像无线监控系统的设计与实现