按键FIFO——安富莱大佬的代码

Sheldon_PL 2020-09-22 10:33:11
为什么要设计FIFO,安富莱大佬的回答:
1. 可靠地记录每一个按键事件,避免遗漏按键事件。特别是需要实现按键的按下、长按、自动连发、弹起等事件时。
2. 读取按键的函数可以设计为非阻塞的,不需要等待按键抖动滤波处理完毕。
3. 按键FIFO程序在嘀嗒定时器中定期的执行检测,不需要在主程序中一直做检测,这样可以有效地降低系统资源消耗。

typedef struct
{
下面是一个函数指针,指向判断按键手否按下的函数
uint8_t (*IsKeyDownFunc)(void); 按键按下的判断函数,1表示按下

uint8_t Count; 滤波器计数器
uint16_t LongCount; 长按计数器
uint16_t LongTime; 按键按下持续时间, 0表示不检测长按
uint8_t State; 按键当前状态(按下还是弹起)
uint8_t RepeatSpeed; 连续按键周期
uint8_t RepeatCount; 连续按键计数器
}KEY_T;


bsp_DetectKey这个函数key.c检测的核心


typedef struct
{
下面是一个函数指针,指向判断按键手否按下的函数
uint8_t (*IsKeyDownFunc)(void); 按键按下的判断函数,1表示按下

uint8_t Count; 滤波器计数器
uint16_t LongCount; 长按计数器
uint16_t LongTime; 按键按下持续时间, 0表示不检测长按
uint8_t State; 按键当前状态(按下还是弹起)
uint8_t RepeatSpeed; 连续按键周期
uint8_t RepeatCount; 连续按键计数器
}KEY_T;



主要就是对这个结构体的进行解算,bsp_KeyScan()函数里面不断进行扫描,bsp_KeyScan()主要是放在bsp_RunPer10ms(),然后丢到SysTick_Handler中10ms的扫描一次.

在bsp_DetectKey()函数里面直接调用外部结果提s_tBtn,然后进行数值的改变。

有两个初始化,一个是对结构体的值进行默认初始化,还有一个就是硬件的初始化,和我们普通的硬件端口初始化是一样的。
/* 对按键FIFO读写指针清零 */
s_tKey.Read = 0;
s_tKey.Write = 0;
s_tKey.Read2 = 0;

软件初始化需要拿出来单独说一下,初始化里面首先将FIFO缓冲设置初始值.
文件定义了一个结构体数组static KEY_T s_tBtn[KEY_COUNT],KEY_COUNT是按键的数量,而且这个数值是放在本文件中使用的,外部是无法调用的,真正读取键值的方式就是s_tBtn[0].IsKeyDownFunc = IsKeyDown1;
KEY_COUNT是按键的序号
typedef struct
{
uint8_t Buf[KEY_FIFO_SIZE]; /* 键值缓冲区 */
uint8_t Read; /* 缓冲区读指针1 */
uint8_t Write; /* 缓冲区写指针 */
uint8_t Read2; /* 缓冲区读指针2 */
}KEY_FIFO_T;



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

//bsp_PutKey(); 将一个键值压入按键FIFO.用来模拟一个按键
void bsp_PutKey(uint8_t _KeyCode)
{
s_tKey.Buf[s_tKey.Write] = _KeyCode;

if (++s_tKey.Write >= KEY_FIFO_SIZE)
{
s_tKey.Write = 0;
}
}
//bsp_GetKey(); 从FIFO缓冲区中读取一个键值.
uint8_t bsp_GetKey(void)
{
uint8_t ret;

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

if (++s_tKey.Read >= KEY_FIFO_SIZE)
{
s_tKey.Read = 0;
}
return ret;
}
}


...全文
1291 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

27,511

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧