历史上的今天
返回首页

历史上的今天

今天是:2024年12月17日(星期二)

正在发生

2019年12月17日 | STM8L之自定义长短按键

2019-12-17 来源:eefocus

简介


本文介绍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


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

//name:             main.c             

//introduce:        主函数      

//author:           甜甜的大香瓜                   

//email:            897503845@qq.com       

//QQ group          香瓜单片机之STM8/STM32(164311667)                    

//changetime:       2016.11.14     

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

#include "stm8l10x.h"

#include "main.h"

#include "GUA_Key.h"

 

/*********************宏定义************************/

#ifndef U8  

typedef unsigned char U8;  

#endif  

  

#ifndef U16  

typedef unsigned short U16;  

推荐阅读

史海拾趣

鑫雁公司的发展小趣事

聚洵半导体始终坚持以市场为导向、以创新为驱动的发展理念。公司不断加大新产品研发投入,致力于在低功耗运放、高速运放、仪表放大器等领域取得更多技术突破。同时,聚洵还积极关注行业动态和市场趋势,针对医疗电子、工业控制、汽车电子等新兴领域推出了一系列创新产品。展望未来,聚洵将继续保持专注和创新精神,致力于成为国内领先的信号链模拟芯片设计公司之一,为电子行业的发展贡献更多力量。

Antenova公司的发展小趣事

Antenova公司在天线设计领域的创新是其迅速发展的关键因素之一。公司专注于研发高效率、低能耗、高可靠性的天线产品,以满足快速增长的物联网市场需求。通过不断的技术创新和产品升级,Antenova成功在智能家居、汽车、可穿戴设备等多个领域取得了显著的市场份额增长。

Bombardier Inc公司的发展小趣事

除了航空领域,庞巴迪公司在铁路运输方面也取得了重要进展。其生产的CITYFLO系列自动列车控制系统在全球范围内得到了广泛应用。该系统采用了先进的电子技术和算法,实现了列车的自动驾驶和精确控制,大大提高了铁路运输的安全性和效率。此外,庞巴迪还生产了各种铁路车辆和相关电子设备,为全球铁路运输业的发展做出了重要贡献。

以上五个故事展示了庞巴迪公司在电子行业发展中的关键历程和成就。从水上飞机到现代商用喷气客机,从航空电子系统到铁路运输控制系统,庞巴迪凭借其卓越的技术实力和创新能力,在电子行业中树立了杰出的品牌形象。

Clever Little Box公司的发展小趣事

随着公司实力的不断增强,Clever Little Box开始将目光投向国际市场。公司制定了国际化战略,通过参加国际展览、建立海外销售渠道等方式,积极开拓海外市场。这一战略的实施不仅为公司带来了更广阔的市场空间,还提高了公司的国际竞争力。

需要注意的是,以上故事是基于公开信息和一般企业发展规律进行的概括和推测,并非Clever Little Box公司的真实发展历程。如需了解该公司更准确、具体的发展故事,建议查阅相关资料或访问公司官方网站。

ASM公司的发展小趣事

近年来,随着全球半导体市场的竞争加剧和技术的不断更新换代,ASM公司也面临着巨大的挑战。为了保持竞争优势,公司不断调整其战略和业务结构,加大研发力度,推出更具竞争力的新产品。同时,公司还积极寻求与其他企业的合作与共赢,共同推动半导体产业的发展。

Hirose Electric公司的发展小趣事

近年来,随着全球半导体市场的竞争加剧和技术的不断更新换代,ASM公司也面临着巨大的挑战。为了保持竞争优势,公司不断调整其战略和业务结构,加大研发力度,推出更具竞争力的新产品。同时,公司还积极寻求与其他企业的合作与共赢,共同推动半导体产业的发展。

问答坊 | AI 解惑

Cadence IC设计(全教程).

Cadence IC设计(全教程).文件大了,自己下吧http://crm.51eda.com/book/pcb/cadence/cadenceic.rar…

查看全部问答>

新手问题:二极管怎样确定A.K

 我画的PCB中的二极管始终没有连线.是不是需要定义A.K啊?该如何定义呢??…

查看全部问答>

光电开关原理及应用方法

  光电开关的定义:此种产品以光源为介质、应用光电效应,当光源受物体遮蔽或发生反射、辐射和遮光导致受光量变化来检测对象的有无、大小和明暗,而向产生接点和无接点输出信号的开关元件。光电开关包括几种类型,自身不具备光源,利用被测物体发 ...…

查看全部问答>

谁有MS-DOS 3.1的软件?

网上找了很多,都没法使用。 大家有没有可以分享的?…

查看全部问答>

求ISD4003 资料

请问哪位高手 有关ISD4003 语音芯片   C版本的…

查看全部问答>

请问:单片机如何计算电压值

该单片机主要是用在控制开关上的,单片机控制继电器,具体要求是当电压值小于170V的时候,由单片机断开继电器通电,从而保护开关,该单片机是8个引脚的,是不是不管51系列还是PIC系列都是可以实现该需求。 谢谢。。。…

查看全部问答>

诺基亚换帅:继续操盘现有战略或改变?

诺基亚终于换帅了,迫于业绩的压力。对于此次诺基亚的换帅,外界已经有了不少的评论,自然是看好和看衰者都有之。针对外界不同的声音,新继任的诺基亚CEO、前微软高官埃洛普何以应对?未来的诺基亚真的可以如他所言继续前进吗?作为一个擅于战略制 ...…

查看全部问答>

急求msp430控制led自动调光电路图

方案为:利用光敏电阻监测光强输送给msp430,通过msp430改变led两端电压的占空比以调光…

查看全部问答>

北京市TI杯的获奖报告有没有啊???agc

北京搞得很神秘啊 网上找不到 相关资料 只是用两个运放和lauCnchpad  设计一个AGC…

查看全部问答>

Hercules 之 高端定时器(N2HET) 了解入门学习

        N2HET 模块是一个具有输入/输出功能的可编程定时器。 N2HET 被执行为一个带有指令集(专门用于定时操作) 的简单RISC 处理器。复杂输入可被捕捉并由N2HET 进 行预处理,随后由CPU 处理。输出生成通常为脉 ...…

查看全部问答>