例如key.c
- #include "key.h"
-
- u16 Count[8] = {0,0,0,0,0,0,0,0};
- u8 LastState = 0; //8位变量 b0=1,代表k0上一次按下过
-
- //========================================================================
- // 函数名称: KEY_Deal
- // 函数功能: 按键状态读取
- // 入口参数: 无
- // 函数返回: 无
- // 当前版本: VER1.0
- // 修改日期: 2023 - 1-1
- // 当前作者:
- // 其他备注:循环读取八个端口的状态,并将按下的时间赋值给 Count 数组,按下的状态赋值给LastState
- //========================================================================
- void KEY_Deal(void) //检查所有的按键状态 10ms执行一次
- {
- u8 i = 0;
- for(i=0;i<8;i++) //循环8次 i的取值范围是0-7 代表了P30-P37的状态查询
- {
- if( ~KEY & ( 1<<i ) ) //持续按下,变量+1
- {
- if( Count[i]<60000 )
- Count[i] ++; //按键按下,这个计数变量+1
- }
- else //按键松开了,变量清0
- {
- if( Count[i]>0 ) //如果这个变量是按下过的
- {
- LastState |= (1<<i); //这个变量相应的标志位置位
- }
- else
- {
- LastState &= ~(1<<i); //这个变量相应的标志位清0
- }
- Count[i] = 0; //按键按下,这个计数变量清0
- }
- }
- }
-
- //========================================================================
- // 函数名称: KEY_ReadState
- // 函数功能: 读取指定的按钮的状态
- // 入口参数: @keynum : 按钮的端口号 例如P32端口,端口号就是2
- // 函数返回: 看其他备注
- // 当前版本: VER1.0
- // 修改日期: 2023 - 1- 1
- // 当前作者:
- // 其他备注: 函数返回值如下
- // #define KEY_NOPRESS 0 //按键未按下
- // #define KEY_FILCKER 1 //消抖
- // #define KEY_PRESS 2 //单击
- // #define KEY_PRESSOVER 3 //单击结束
- // #define KEY_LONGPRESS 4 //长按3秒
- // #define KEY_LONGOVER 5 //长按结束
- // #define KEY_RELAX 6 //按键松开
- //========================================================================
-
- u8 KEY_ReadState(u8 keynum) //读取指定的按键的状态 10ms执行一次
- {
- if( Count[keynum]>0 ) //按键是按下的各种状态返回
- {
- if( Count[keynum]<3 ) //按下<30ms 返回消抖状态
- {
- return KEY_FILCKER;
- }
- else if( Count[keynum]==3 ) //按下正好30ms 返回单击
- {
- return KEY_PRESS;
- }
- else if( Count[keynum]<300 ) //按下不到3000ms 返回单击结束
- {
- return KEY_PRESSOVER;
- }
- else if( Count[keynum]==300 ) //按下正好3000ms 返回长按状态
- {
- return KEY_LONGPRESS;
- }
- else //长按结束
- {
- return KEY_LONGOVER;
- }
-
- }
- else //按键已经松开了,返回各种状态
- {
- if( LastState &( 1<<keynum ) ) //按键之前按下过
- {
- return KEY_RELAX;
- }
- else //按键之前没有按下
- {
- return KEY_NOPRESS;
- }
- }
- }
-
-
复制代码
key.h
- #ifndef __KEY_H
- #define __KEY_H
-
- #include "COMM/stc.h" //调用头文件
- #include "COMM/usb.h"
-
- //------------------------------引脚定义------------------------------
- #define KEY P3 //P32-P35
-
- #define KEY1 2 //按键1
- #define KEY2 3 //按键2
- #define KEY3 4 //按键3
- #define KEY4 5 //按键4
-
- //------------------------------变量声明------------------------------
- #define KEY_NOPRESS 0 //按键未按下
- #define KEY_FILCKER 1 //消抖
- #define KEY_PRESS 2 //单击
- #define KEY_PRESSOVER 3 //单击结束
- #define KEY_LONGPRESS 4 //长按3秒
- #define KEY_LONGOVER 5 //长按结束
- #define KEY_RELAX 6 //按键松开
-
-
- //------------------------------函数声明------------------------------
- void KEY_Deal(void); //检查所有的按键状态
- u8 KEY_ReadState(u8 keynum); //读取指定的按键的状态
-
- #endif
-
复制代码
如上key.c就是函数的定义,key.h就是函数的声明,另外的不管什么文件只要调用了key.h就可以使用这里申明的KEY_Deal和KEY_ReadState函数,因为函数定义的名称有且只有一个,整个工程只会有一个KEY_Deal和KEY_ReadState函数,只要文件的路径选对,引用的头文件选对,任意的.h文件里申明的函数都能随意调用
|