您的位置:首页 > 其它

按键通用程序处理模型

2015-11-05 15:48 183 查看
/****************************************************************************

*

* 文件名: 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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: