⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readme.txt

📁 键盘处理程序。完成从按键扫描、去抖到按键类型判断的全过程。
💻 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 + -