多功能检测按键-3 单按 长按 多个按键 响应方式

/***************************************
// 函数功能:按键扫描
//这是我第三次对按键扫描的优化,为什么我要这么做呢,很简单,
//我只想将简单的事情不断完善好
//第一次发表:http://blog.csdn.net/chuangwu2009/article/details/9466715
//第一次发表:http://blog.csdn.net/chuangwu2009/article/details/18032195
*****************************************/

/* 按键响应方式我个人总结了下,一共有11种(包括无按键)
按键响应方式:1:单按键按下响应 2:单按键按下释放响应 3:多按键按下响应

其中按下相应有:1.1:按下马上响应
				1.2:长按后马上响应
				1.3:长按后一直响应(如:长按累加更改时间设置)

释放响应有:      2.1:短按释放响应
				2.2长按释放响应

多按键按下响应有: 1.1 1.2 1.3 2.1 2.2四种组合按键响应方式
*/
#define  SETB0   (unsigned char)0x01
#define  SETB1   (unsigned char)0x02
#define  SETB2   (unsigned char)0x04
#define  SETB3   (unsigned char)0x05
#define  SETB4   (unsigned char)0x10
#define  SETB5   (unsigned char)0x20
#define  SETB6   (unsigned char)0x40
#define  SETB7   (unsigned char)0x80

typedef union uFLG1{
	uint8 Flg ;
    struct FLAG1{
        uint8	Flg1   : 1;
        uint8	Flg2   : 1;
        uint8	Flg3   : 1;
        uint8	Flg4   : 1;
        uint8	Flg5   : 1;
        uint8	Flg6   : 1;
        uint8	Flg7   : 1;
        uint8	Flg8   : 1;
    }tFlg1;
}uFlg1;

uFlg1  F_KEY={0};
//位定义
#define		f_onekey			F_KEY.tFlg1.Flg1//有单按键按下标志
#define		F_longonekey	F_KEY.tFlg1.Flg2//长按标志
#define		f_mulkey			F_KEY.tFlg1.Flg3//多按键标志
#define		F_longmulkey 	F_KEY.tFlg1.Flg4//有多按键按下标志
#define 	F_first    		F_KEY.tFlg1.Flg5//上电识别是否上电按下 开机初始化时 执行 F_first = 1;

//按键响应模式
#define  NONE_KEY			  (unsigned char)0//无效按键值-无按键

#define  ONE_DOWN 			(unsigned char)1
//单个按键按下响应--(短按)按下马上响应
#define	 ONE_LONG_DOWN  (unsigned char)2
//单个按键长按下响应--长按时间到后的(马上)响应
#define  MUL_DOWN			  (unsigned char)3
//多个按键按下响应
#define  MUL_LONG_DOWN  (unsigned char)4
//多个按键长按下响应
#define  ONE_UP    			(unsigned char)5
//单个按键释放响应
#define  MUL_UP    			(unsigned char)6
//多个按键释放响应
#define  ONE_LONG_UP		(unsigned char)7
//单个按键长按后释放响应
#define  MUL_LONG_UP		(unsigned char)8
//多个按键长按后释放响应
#define  ONE_AL_DOWN		(unsigned char)9
//单按键长按之后的响应-长按后一直响应(如:长按累加更改时间设置)
#define  MUL_AL_DOWN		(unsigned char)10
//多按键长按之后的响应

#define  LongAndShortUpIsSame		//长按和短按释放按键功能一样
//定义此宏意思是 在短按按键释放后 或者长按按键后
// 功能执行是一样的 即执行ONE_UP或者MUL_UP的动作

static	 uint8	key_value1=0;//单前按键值
//按键值寄存器-当前按下的值-按下马上响应一次动作

static	uint8	key_value2=0;
//按键值寄存器-前一次的值
//--长按响应一次动作或者按键短按释放响应一次动作
static	uint8	key_value3=0;
//按键值寄存器长按的值---长按后一直响应

static	uint8 mode_key=0;//按键响应模式

void Key_scan(void)	 //
{

  static	uint8	key_delay=0;//按键去抖动寄存器
  static	uint8	key_value0=0;//前一次按键值寄存器

  static	uint8	key1_mult=0;//多按键寄存器2

  static	uint8	key_longtime=0;//长按时间累积寄存器1
  static	uint8	key_longtime1=0;//长按时间累积寄存器2

  uint8	key_mult=0;//多按键寄存器1

  if(!P_K0)//
  {
		key_value1|=SETB0;
		key_mult++;
  } 

  if(!P_K1)//
  {
		key_value1|=SETB1;
		key_mult++;
  }
  /*
  if(!P_K2)//
  {
		key_value1|=SETB2;
		key_mult++;
  }
  if(!P_K3)//
  {
		key_value1|=SETB3;
		key_mult++;
  }
  if(!P_K4)//
  {
		key_value1|=SETB4;
		key_mult++;
  }
  */

  if(key_value1 == key_value0)//如不响等,保存当前按键值,清抖动寄存器,以此次识别
  {
    if(key_delay > 10)//抖动处理
    {
      if(key_value1 > 0)//无按键按下确认,等于0时表示无按键
      {
        if(1 == key_mult)
        {//单按键按下处理程序
            if(!f_onekey)
            { //单按键短按按下处理程序
                    f_onekey=1;
                    key1_mult=0;
                    mode_key=ONE_DOWN;
            }
            else
            {//单按键长按
							if(!F_longonekey)
							{//还没达到长按时间
								if(++key_longtime>=100)//
								{
									 key_longtime=0;
									 if(++key_longtime1>=15)
									 {//长按时间到
													 key_longtime1=0;
													 mode_key=ONE_LONG_DOWN;
													 F_longonekey=1;
													//长按按键处理程序
									 }
								}
								else
								{//还没达到长按时间
									mode_key=NONE_KEY;
								}
							}
							else
							{//单按键长按之后的响应

								mode_key = ONE_AL_DOWN;

							}
            }
        }
        else
        {	   //多按键按下处理程序
          key1_mult=1;
          if(!f_mulkey)
          {//多按键短按下相应
							f_mulkey=1;
							f_onekey=1;
		//	f_onekey=1;	防止多个按键释放时候,不同时释放,响应单个按键功能
							mode_key=MUL_DOWN;
          }
          else
          {//多按键长按
						if(!F_longmulkey)
						{
							if(++key_longtime>=100)//2毫秒1次  100*2*15=3秒
							{
								 key_longtime=0;
								 if(++key_longtime1>=15)
								 {
									 key_longtime1=0;//3秒时间到	

									 F_longmulkey=1;
									//多按键长按按键处理程序
									 mode_key=MUL_LONG_DOWN;
									}

							 }
							 else
							{
											mode_key=NONE_KEY;
							}
						}
						else
						{
										//多按键长按之后的响应
										mode_key = MUL_AL_DOWN;
						}
				  }
			  }
       }
        else//按键释放或者无按键
       {

        f_mulkey=0;
        F_first=0;

        key_longtime=0;
        key_longtime1=0;
        if(F_longonekey)
        {//长按单按键释放
            F_longonekey=0;
            #ifdef (LongAndShortUpIsSame)
						 mode_key=ONE_UP;
						#else
						 mode_key=ONE_LONG_UP;
						#endif

        }
        else if(F_longmulkey)
        {//长按多按键释放
            F_longmulkey=0;	

						#ifdef (LongAndShortUpIsSame)
						 mode_key=MUL_UP;
						#else
						 mode_key=MUL_LONG_UP;
						#endif

        }
        else if(f_onekey)
        {//短按按键释放

            if(0==key1_mult)
            {
                mode_key=ONE_UP;
            }
            else
            {
                mode_key=MUL_UP;
            }
        }
        else
        {
             mode_key=NONE_KEY;
        }
        f_onekey=0;
       }
    }
    else
    {//滤波处理
            key_delay++;
    }
  }
  else
  {
          key_value0=key_value1;
          key_delay=0;
  }

}

//*************************************
// 函数名称:key_deal
// 函数功能:按键响应后的处理
// 入口参数:无
// 出口参数:无
//***************************************/

void key_deal(void)
{
  static uint8	key_longtime=0;//长按时间累积寄存器1

  switch(mode_key)
  {
    case ONE_DOWN://单个按键按下响应
    {
			switch(key_value1)
			{
			 case SETB1://P_K1短按下响应
			 {
						key_value2 =	key_value1;		

						if(F_first)
						{//按住按键上电响应-要执行的动作-常用于自检

							break;
						}
							break;
				}
				 case SETB0:///P_K0短按下响应
				 {
							key_value2 =	key_value1;
							if(F_first)
							{

									break;
							}

							break;
				 }
				default:
				break;
			}

    key_value1 = 0;	

    break;
    }
    case ONE_LONG_DOWN://单个按键长按下响应--相应一次
    {
				key_value3=key_value2;

				  switch(key_value2)
					{

						case SETB1:
					 {		

									break;
					 }
					 case SETB0:
					 {		

									break;
					 }

									default:
									break;
					}

					key_value2=0;

    break;
    }
    case MUL_DOWN://多个按键按下响应
    {
					switch(key_value1)
					{
							case (SETB1|SETB0):
						 {
														key_value2 = key_value1;
										break;
						 }
						default:
						break;
					}
          key_value1=0;

    break;
    }
    case MUL_LONG_DOWN://多个按键长按下响应
    {

				if(key_value2==(SETB0|SETB1))
				{
					key_value3=key_value2;
				}

				key_value2=0;
    break;
    }
    case ONE_UP://单个按键释放响应
    {
				switch(key_value2)
				{
								 case SETB0:
								 {//TURBO释放

												break;
								 }
								 case SETB1:
								 {							 	

												break;
								 }
								default:
								break;
				}
					key_value2=0;//按键释放后清零
    break;
    }
    case MUL_UP://多个按键释放响应
    {
					key_value2=0;//按键释放后清零
					key_value3=0;

    break;
    }
    case ONE_LONG_UP://单个按键长按后释放响应
    {	

				switch(key_value3)
				{
						 case SETB0:
						 {//TURBO释放

										break;
						 }
						 case SETB1:
						 {							 	

										break;
						 }
						default:
						break;
				}
				key_value2=0;//
				key_value3=0;

    break;
    }
    case MUL_LONG_UP://多个按键长按后释放响应
    {

				key_value2=0;//按键释放后清零
				key_value3=0;
    break;
    }
    case ONE_AL_DOWN://单按键长按之后的响应
    {

			if(++key_longtime>=100)//2毫秒1次  40*15*5=3秒
			{
				key_longtime=0;

				 switch(key_value3)
				{
					 case SETB0:
					 {							 	

									break;
					 }
					 case SETB1:
					 {							 	

									break;
					 }
					default:
					break;
				}
			}
    break;
    }
    case MUL_AL_DOWN://多按键长按之后的响应
    {
          if(++key_longtime>=100)//2毫秒1次  40*15*5=3秒
				{
								 key_longtime=0;
				}
    break;
    }
    default:
    break;
  }
}

多功能检测按键-3 单按 长按 多个按键 响应方式

时间: 2024-10-10 10:27:04

多功能检测按键-3 单按 长按 多个按键 响应方式的相关文章

令人窒息的「记忆」功能,让表单提交不用重复输入

通常我们在提交表单的时候需要提交多次,但是旧版本每提交一次打开链接提交时所有的内容都需要重新填写,而系统更新后,我们设置一下就可以无需对某些列重复填写. 记忆功能 如下图所示,针对一些不需长时间更改的字段,我们可以设置「记忆」功能.设置了记忆功能的列,在提交者第一次提交之后,再次打开表单链接时,将不用重复输入相关值.数据会自动出现. 如何设置 1.针对某一列进行单独设置 您可以如图点击「设置列属性」,勾选「记住上次输入」 2.针对多列进行批量设置 您可以如图在高级设置页面里,进行批量的「记忆」勾

jQuery中的$.support功能检测

jQuery对浏览器兼容性的处理 jQuery给我们带来的最大好处就是帮我们处理好了浏览器之间的兼容性.jQuery处理兼容性时主要是进行功能检测.$.support中存放了浏览器对各个具有兼容性功能的兼容性,主要在jQuery内部处理.当我开发插件时,也可以直接通过它来判断. $.support检测的功能 1.boxModel:如果页面是按照w3c css盒模型来渲染返回true,在IE6.IE7中的混淆模式放回false. 2.checkOn:动态创建的radio和checkbox的默认值是

功能检测技术 typeOf

Javascript与很多编程语言不同,它不能够控制其运行环境.再写php代码时,只要在服务器端部署了正确的版本,那么程序就绝对能够运行,对于其他python或ruby后端语言来说,也不存在什么灰色区域.Javascript就不同了,它与所有的前端语言一样,都需要各大浏览器的支持. 前端语言必须通过浏览器渲染页面时才能被运行和执行,服务器与客户端的浏览器通过HTTP请求进行通信,接受资源后的浏览器再进行渲染.有很多因素,诸如浏览器对各项功能的支持程度.网络连接速度.屏幕大小.渲染效率等,都是完全

web-project 故障查看功能 检测是否启动fmd服务

def check_fmd_service(): try: output = subprocess.check_output('svcs -H -o state fmd',shell=True) state = output.decode('UTF-8').strip() if state == 'online': return True elif state == 'disabled': subprocess.call('svcadm enable fmd',shell=True) log_d

webshell多功能检测【超越菜刀】

webshell多功能检测[超越菜刀], 功能1:多线程检测webshell存活,以及可写的目录权限. 功能2:多线程检测webshell的根目录权限. 功能3:多线程检测webshell的首页修改权限. 功能4:多线程检测webshell是否被劫持. 功能5:多线程检测webshell的百度收录. 功能6:可批量导出,可写权限,根目录权限,首页权限等. 检测出的结果于xise相同,功能多于xise! 检测速度比xise快N倍占用电脑资源少! 下载地址:https://pan.baidu.com

功能 列表字段如何实现多选框或图标的编辑方式——JEPLUS软件快速开发平台

JEPLUS之功能 列表字段如何实现多选框或图标的编辑方式 当我们在点击列表字段是我们可以添加一些独特的显示状态,比如点击时变亮未点击是暗灰色,咱们可以理解为就给字段进行配置一个选中的样式与未点击的样式今天给大家介绍下怎么来实现. 一.效果展示 二.准备工作 1.JEPLUS平台5.0.0.2 2.数据库MySql 5.7 三.实现步骤 1.首先我们要进行字段的列表配置 选择它的选中时样式,不选中的样式. 进行这样的配置之后就可以实现了点击时是亮色,未点击是灰色. 查看原文及阅读更多 原文地址:

js功能检测

怎么检测浏览器是否支持某一功能? 1 function isLocalStorageSupported() { 2 var testKey = 'test', 3 storage = window.sessionStorage; 4 try { 5 storage.setItem(testKey, 'testValue'); 6 storage.removeItem(testKey); 7 return true; 8 } catch (error) { 9 return false; 10 }

42、通过ontouch检测expandableListview的单击、长按、列表滚动

一.在model定义变量: public boolean isExpandableListviewScroll = false;//这个是 首先监听expandableListview的滚动: Expandablelistview_all_waiting_push.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollS

配置静态路由并能使用BFD功能检测

组网需求? ? 在 Switch A 上配置静态路由可以到达 120.1.1.0/24 网段,在 Switch B 上配置静态路由可以到达 121.1.1.0/24 网段,并都使能 BFD 检测功能.? ? 在 Switch C 和 Switch D 上配置静态路由可以到达 120.1.1.0/24 网段和 121.1.1.0/24 网段.? ? Switch A 存在到 Switch B 的接口 Loopback1 (2.2.2.9/32)的路由,出接口为 Vlan-interface10:S