按键通用程序处理模型
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);
}
*
* 文件名: 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);
}
相关文章推荐
- [转载]Jmeter那点事·ForEach和If控制器
- 自定义View很简单 - Android翻页效果原理实现之模拟扭曲
- AIX操作系统vi命令的使用方式
- 机器学习
- easyui datagrid 只有点击checkbox才起选中或者取消作用
- leetcode 166:Fraction to Recurring Decimal java实现(细致分析)
- OpenGL ES 3.0之Shading Language(八)
- Android Socket通信
- ios的@property属性和@synthesize属性
- 关于LDA主题模型的理解
- 自定义View很简单 - Android翻页效果原理实现之曲线的实现
- 协同过滤算法 R/mapreduce/spark mllib多语言实现
- asp.net calender控件显示一周之内的日期
- 多线程
- 图片的旋转
- ListView性能优化
- Android 二维码
- iOS关于破解ipa包
- 怎样用MyEclipse编写调试JSP网页
- java中的多线程