📄 readme.txt
字号:
1. 概述
该键盘处理程序可以完成从按键扫描、去抖到按键类型判断的全过程。使得
上层程序可以比较简单的实现按键判断和按键类型的判断。
该按键处理程序通用性非常好,几乎可以适用于绝大多数的按键应用场合。
该处理程序以状态机转换为核心,对按键的状态进行判断和记录,可以提供
下列按键类型的判断:
短按键(未抬起)(C_SKeyState)
抬起的短按键(C_SReleaseKeyState)
长按键(未抬起)(C_LKeyState)
抬起的长按键(C_LReleaseKeyState)
重复按键(按住不动,以一定频率产生的按键事件)
该处理程序在去抖、长短按键判断等与时间相关的处理上均采用了相对比较
合理的方法,使得整体效率较好,为复杂按键的应用提供了基础。
针对不同的系统,只需要为具体的键盘编写读取键值的驱动函数,即可使用
这个处理程序完成按键扫描,在系统中应用的时候不再需要关心去抖、长短键判
断等工作。
2. 使用前的准备
用户在使用前只需遵循以下步骤即可:
1. 根据实际的键盘编写两个底层驱动函数:
void DrvKeyInit(void)
完成键盘的初始化(一般情况下该函数完成IO初始化等)
unsigned int DrvGetKeyID(void)
得到当前按下的按键的键值(该键值可以是有规律的,也可以是没
有规律的,本按键处理程序并不关心键值是否有规律,而仅仅是将
其传递给上层程序)
压缩包中附带有一个1*8按键的底层驱动。使用61的IO口直接扩展按键。
2. 修改Key.h中的C_Null对应的值
该值对应着DrvGetKeyID()函数当没有键按下的时候返回的键值。
3. 修改Key.h中的去抖时间、长按键时间、重复按键时间设置
C_DebounceLimit 去抖时间
C_LKeyLimit 长按键的判断时间,超过此时间认为是长按键
C_FirstRepeatTim 首次重复按键的判断时间,超过此时间则认为按
键开始重复
C_RepeatTim 重复按键判断时间,如果按键不抬起,则以该时
间为周期触发按键事件
以上数值与实际时间的对应关系为:
实际时间=KeyScan_ServiceLoop()函数被调用的周期×设定值
例如,将KeyScan_ServiceLoop()放置在1024Hz实际中断中调用,则调用
周期大约为1ms,设置C_LKeyLimit时间为1024,则意味着超过1024×1ms
之后认为按键达到了长按键的状态。即按键按下1秒钟之后认为是一个长
按键。
3. 应用指南
该键盘处理程序的使用较为简单。
首先需要确定按键扫描的方式。
如果使用中断扫描按键,则将KeyScan_ServiceLoop()函数安置在相应的
中断服务程序中调用。
如果希望使用前台扫描方式,则将KeyScan_ServiceLoop()函数安置在主
循环中调用。
典型应用如下:
unsigned int Key, KeyType; // 存储键值和按键类型的变量
KeyScan_Init(); // 按键扫描初始化
while(1)
{
Key = KeyScan_GetKey(&KeyType); // 得到按键和按键类型
if(C_Null != Key) // 如果有键按下
{
switch(Key)
{ // 处理按键
// 这里写按键处理程序
case KEY1: // 首先判断是哪个键按下
if(C_SReleaseKeyState == KeyType)
{ // 然后判断是何种按键
// Released Short Key Event Process
}
else if(C_LReleaseKeyState == KeyType)
{
// Released Long Key Event Process
}
break;
case KEY2:
if(C_SReleaseKeyState == KeyType)
{
// Released Short Key Event Process
}
else if(KeyScan_CheckRepeat())
{ // 如果希望处理重复按键,
// 直接调用这个函数即可
// Repeat Key Event Process
}
break;
}
}
// Other System Process
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -