历史上的今天
今天是: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;
上一篇:STM8L之按键中断
下一篇:STM8L之timer2定时中断
史海拾趣
|
Cadence IC设计(全教程).文件大了,自己下吧http://crm.51eda.com/book/pcb/cadence/cadenceic.rar… 查看全部问答> |
|
光电开关的定义:此种产品以光源为介质、应用光电效应,当光源受物体遮蔽或发生反射、辐射和遮光导致受光量变化来检测对象的有无、大小和明暗,而向产生接点和无接点输出信号的开关元件。光电开关包括几种类型,自身不具备光源,利用被测物体发 ...… 查看全部问答> |
|
该单片机主要是用在控制开关上的,单片机控制继电器,具体要求是当电压值小于170V的时候,由单片机断开继电器通电,从而保护开关,该单片机是8个引脚的,是不是不管51系列还是PIC系列都是可以实现该需求。 谢谢。。。… 查看全部问答> |
|
诺基亚终于换帅了,迫于业绩的压力。对于此次诺基亚的换帅,外界已经有了不少的评论,自然是看好和看衰者都有之。针对外界不同的声音,新继任的诺基亚CEO、前微软高官埃洛普何以应对?未来的诺基亚真的可以如他所言继续前进吗?作为一个擅于战略制 ...… 查看全部问答> |
|
Hercules 之 高端定时器(N2HET) 了解入门学习 N2HET 模块是一个具有输入/输出功能的可编程定时器。 N2HET 被执行为一个带有指令集(专门用于定时操作) 的简单RISC 处理器。复杂输入可被捕捉并由N2HET 进 行预处理,随后由CPU 处理。输出生成通常为脉 ...… 查看全部问答> |




