按键通用程序处理模型

/****************************************************************************
*
* 文件名: sysytick.c
* 内容简述: 本模块实现3个按键的检测,具有滤波机制,支持按下,弹起和长按动作。
* 通过GetKey()函数可以读取键值
*
*/


/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdio.h>


#include "button.h"


static BUTTON_T s_BtnUser1; /* USER1 键 */
static BUTTON_T s_BtnUser2; /* USER2 键 */
static BUTTON_T s_BtnTamper; /* TAMPER 键 */


static KEY_FIFO_T s_Key; /* 按键FIFO变量,结构体 */


/*
USER1键    : PA0  (低电平表示按下)
    USER2键    : PA8  (低电平表示按下)
TAMPEER键  : PC13 (低电平表示按下)


定义3个函数,判断按键是否按下,返回值1 表示按下,0表示未按下
*/
static uint8_t IsKeyDownUser1(void) {if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET) return 1; return 0;}
static uint8_t IsKeyDownUser2(void) {if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == Bit_SET) return 0; return 1;}
static uint8_t IsKeyDownTamper(void)    {if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == Bit_SET) return 0; return 1;}
 


//**************************************************************************************************
// [名称]void InitButtonVar(void)
// [功能] 初始化所有的按键变量,这个函数需要在systic中断启动前调用1次
//  [作者]         
// [日期]
// [版本]
//**************************************************************************************************


void InitButtonVar(void)
{
/* 对按键FIFO读写指针清零 */
s_Key.Read = 0;
s_Key.Write = 0;


/* 初始化USER1按键变量 */
s_BtnUser1.IsKeyDownFunc = IsKeyDownUser1; /* 判断按键按下的函数 */
s_BtnUser1.FilterTime = BUTTON_FILTER_TIME; /* 按键滤波时间 */
s_BtnUser1.LongTime = BUTTON_LONG_TIME; /* 长按时间 */
s_BtnUser1.Count = s_BtnUser1.FilterTime / 2; /* 计数器设置为滤波时间的一半 */
s_BtnUser1.State = 0; /* 按键缺省状态,0为未按下 */
s_BtnUser1.KeyCodeDown = KEY_DOWN_USER1; /* 按键按下的键值代码 */
s_BtnUser1.KeyCodeUp = KEY_UP_USER1; /* 按键弹起的键值代码 */
s_BtnUser1.KeyCodeLong = KEY_HOLD_USER1; /* 按键被持续按下的键值代码 */

/* 初始化USER2按键变量 */
s_BtnUser2.IsKeyDownFunc = IsKeyDownUser2; /* 判断按键按下的函数 */
s_BtnUser2.FilterTime = BUTTON_FILTER_TIME; /* 按键滤波时间 */
s_BtnUser2.LongTime = BUTTON_LONG_TIME; /* 长按时间 */
s_BtnUser2.Count = s_BtnUser2.FilterTime / 2; /* 计数器设置为滤波时间的一半 */
s_BtnUser2.State = 0;    /* 按键缺省状态,0为未按下 */
s_BtnUser2.KeyCodeDown = KEY_DOWN_USER2; /* 按键按下的键值代码 */
s_BtnUser2.KeyCodeUp = KEY_UP_USER2; /* 按键弹起的键值代码 */
s_BtnUser2.KeyCodeLong = KEY_HOLD_USER2; /* 按键被持续按下的键值代码 */


/* 初始化TAMPER按键变量 */
s_BtnTamper.IsKeyDownFunc = IsKeyDownTamper; /* 判断按键按下的函数 */
s_BtnTamper.FilterTime = BUTTON_FILTER_TIME; /* 按键滤波时间 */
s_BtnTamper.LongTime = 0; /* 长按时间, 0表示不检测 */
s_BtnTamper.Count = s_BtnTamper.FilterTime / 2; /* 计数器设置为滤波时间的一半 */
s_BtnTamper.State = 0; /* 按键缺省状态,0为未按下 */
s_BtnTamper.KeyCodeDown = KEY_DOWN_TAMPER; /* 按键按下的键值代码 */
s_BtnTamper.KeyCodeUp = 0; /* 按键弹起的键值代码 */
s_BtnTamper.KeyCodeLong = 0; /* 按键被持续按下的键值代码 */
}




//**************************************************************************************************
// [名称]void PutKey(uint8_t _KeyCode)
// [功能] 将1个键值压入按键FIFO缓冲区
//  [作者]         
// [日期]
// [版本]
//**************************************************************************************************


void PutKey(uint8_t keycode)
{
s_Key.Buf[s_Key.Write] = keycode;


if (++s_Key.Write  >= KEY_FIFO_SIZE)
{
s_Key.Write = 0;
}
}


//**************************************************************************************************
// [名称]uint8_t GetKey(void)
// [功能] 返回键值, KEY_NONE ( = 0) 表示无键按下
//         从按键FIFO取1个键值
//  [作者]      
// [日期]
// [版本]
//**************************************************************************************************


uint8_t GetKey(void)
{
uint8_t ret;


if (s_Key.Read == s_Key.Write)
{
return KEY_NONE;
}
else
{
ret = s_Key.Buf[s_Key.Read];


if (++s_Key.Read >= KEY_FIFO_SIZE)
{
s_Key.Read = 0;
}
return ret;
}
}
//**************************************************************************************************
// [名称]static void DetectButton(BUTTON_T *pbtn)
// [功能] 检测指定的按键 
//  [作者] 王玺联          
// [日期]
// [版本]
//**************************************************************************************************


static void DetectButton(BUTTON_T *pbtn)
{
// 如果没有初始化按键函数,则报错 可以不进行一下处理直接返回
if (pbtn->IsKeyDownFunc == 0)
{
return;
}


if (pbtn->IsKeyDownFunc())
{
if (pbtn->Count < pbtn->FilterTime)
{
pbtn->Count = pbtn->FilterTime;
}
else if(pbtn->Count < 2 * pbtn->FilterTime)
{
pbtn->Count++;
}
else
{
if (pbtn->State == 0)
{
pbtn->State = 1;


// 按键按下的消息 
if (pbtn->KeyCodeDown > 0)
{
//键值放入按键FIFO 
PutKey(pbtn->KeyCodeDown);
}
}


if (pbtn->LongTime > 0)
{
if (pbtn->LongCount < pbtn->LongTime)
{
//按键持续按下的消息 
if (++pbtn->LongCount == pbtn->LongTime)
{
// 键值放入按键FIFO 
PutKey(pbtn->KeyCodeLong);
}
}
}
}
}
else
{
if(pbtn->Count > pbtn->FilterTime)
{
pbtn->Count = pbtn->FilterTime;
}
else if(pbtn->Count != 0)
{
pbtn->Count--;
}
else
{
if (pbtn->State == 1)
{
pbtn->State = 0;


//按键弹起的消息 
if (pbtn->KeyCodeUp > 0)
{
//按键值放入按键FIFO 
PutKey(pbtn->KeyCodeUp);
}
}
}


pbtn->LongCount = 0;
}
}




//**************************************************************************************************
// [名称]void KeyPro(void)
// [功能] 检测所有的按键,这个函数要被systic的中断服务程序调用
//  [作者]        
// [日期]
// [版本]
//**************************************************************************************************


void KeyPro(void)
{
    // USER1 键
DetectButton(&s_BtnUser1);

// USER2 键
DetectButton(&s_BtnUser2);

//TAMPER 键 
DetectButton(&s_BtnTamper);
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万能之王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值