当前位置: 代码迷 >> 综合 >> 按键函数
  详细解决方案

按键函数

热度:16   发布时间:2024-03-06 05:35:23.0
//按键参数
//**********************************************************
#define KEY_LP_TIME      1500  /* 长按时间       单位 ms                  */
#define KEY_DOUBLE_TIME  350   /* 两次按下间隔不超过此值为双击事件 */unsigned int  KEY1_LP_FLG;    /* 按键长按标志                   */
unsigned int  KEY1_PR_FLG;    /* 按键按下标志                   */unsigned int  Key1LtDelay;    /* 按键抬起消抖时间               */
unsigned int  Key1PrDelay; 	 /* 按键按下消抖时间               */
unsigned int  Key1PrCnt;      /* 按键按下次数计数 检测双击      */
unsigned int Key1PrTimeCnt;  /* 连续两次按下时长计数 检测双击  */
unsigned int Key1PrTime;     /* 按键按下时长计数 检测长按      */
//**********************************************************
/* 此函数是1ms运行一次 所以时间单位为1ms */void Key1Scan(void){ //1ms扫描一次if(KEY1 == 0){Key1LtDelay = 0;if(!KEY1_PR_FLG){Key1PrDelay++;if(Key1PrDelay>20){Key1PrDelay = 0;KEY1_PR_FLG = 1;/********** User Code **********/Key1PrCnt++;                       /* 计数按下次数 */if(Key1PrCnt>2){ Key1PrCnt = 0; }  KEY1_LP_FLG = 0;Key1PrTime  = 0;/************* End *************/}			}}else{Key1PrDelay = 0;if(KEY1_PR_FLG){Key1LtDelay++;if(Key1LtDelay>20){Key1LtDelay = 0;KEY1_PR_FLG = 0;/********** User Code **********/KEY1_LP_FLG = 0;     /* 抬起按键轻触长按标志 *//* 当按键按下但是超过双击检测时间 未达到长按时间 此时认为是一个单击事件 */if(Key1PrTime >= KEY_DOUBLE_TIME){//单击事件}/************* End *************/				}}		}//长按检测if(KEY1_PR_FLG){if(!KEY1_LP_FLG){Key1PrTime++;if(Key1PrTime >= KEY_LP_TIME){Key1PrTime = 0; KEY1_LP_FLG = 1;  /* 长按1.5S 置位长按标志 *//********** User Code **********///长按事件/************ End *************/}}}//双击检测if(Key1PrCnt==1){	if(Key1PrTimeCnt < KEY_DOUBLE_TIME){ Key1PrTimeCnt++;   }else{if(!KEY1_PR_FLG){ //单击事件}Key1PrTimeCnt = 0;Key1PrCnt     = 0;}}else if(Key1PrCnt==2){if(Key1PrTimeCnt < KEY_DOUBLE_TIME){//双击事件}Key1PrCnt     = 0;Key1PrTimeCnt = 0;}
}

 

  相关解决方案