精华内容
下载资源
问答
  • 这对判断按键按下次数以及控制作用形成了一系列的干扰,为了保证能够正确的识别按键的触发,就必须对按键进行消抖。01按键抖动及消抖程序话不多说先上图。就比如上面的波形,前面几段比较短的抖...

    近期学习了关于FPGA的按键消抖程序,对于开发板上按键的抖动通常都是由于按键开关为机械弹性开关所导致,当机械触点断开或闭合时,由于弹性作用,按键不会立刻断开或闭合,因而在闭合及断开的瞬间会形成一连串的抖动。这对判断按键按下的次数以及控制作用形成了一系列的干扰,为了保证能够正确的识别按键的触发,就必须对按键进行消抖。

    01

    按键抖动及消抖程序

    话不多说先上图。

    1abc8a9e941f474193ac8d2cae7c8f0d.png

    就比如上面的波形,前面几段比较短的抖动和后面几段比较短的抖动都是由于机械按键的弹性所造成的。中间那段比较长的波形便是我们按下的一段,为了能够正确的识别到这段波形,便必须将几段抖动的波形滤除掉。

    下面便开始介绍消除抖动的程序,并通过按键控制四个LED进行二进制加减法运算。

    3dc18e3a2d8a9a2547e920ad6eb29242.png

    和以前的定义端口类型一样时钟信号、复位信号和按键控制和led输出。时钟信号连接开发板上的50M晶振端口,复位信号和按键端口也是靠外部按键控制,led端口连接着FPGA的四个LED端口,通过系统内部的信号控制,所以时钟信号clk和复位信号rst和按键控制都定义为input输入类型,led端口定义为output输出类型。

    0376c95806ef71a362f56b8514f80cfc.png

    这部分程序便是定义上升沿和下降沿,首先定义一个存储按键信号上一时刻的寄存器(key_r),用来存储按键上一时刻的状态。

    然后定义上升沿(pedge_key)和下降沿(nedge_key),对其进行定义和描述,第20行,pedge_key = ((!key_r) && key)这行代码是说,当按键的上一时刻为低电平且当前时刻为高电平时,此时为上升沿;nedge_key = (key_r && (!key))这行代码是说,当按键的上一时刻为高电平且当前时刻为低电平时,此时为下降沿。

    4483a8f62842622d865a7b8e9e2881d5.png

    此处的程序为计数的程序,用于判断按键按下后的时间,因为一般按键按下后最起码会有20ms的延时,这也就是上面的波形正常按下的脉宽要长而抖动的时间却很短,计数持续通过定义的一个使能端(en_cnt)控制,当使能端(en_cnt)为1时开始计数,当使能端为0时停止计数,这部分程序在下面消抖部分会使用到。

    e14389830b8eb526de3363ddc7444b39.png

    这部分便是消抖所用的程序,使用了类似于c语言中的switch  case语句,state为定义的判断按键当前状态的标志位,当state等于0时,判断按键此时是否按下触发下降沿;当系统检测到下降沿后便将state置1然后开始判断按键按下后低电平的持续时间,此时将计数信号的使能端给高电平,让计数程序开始计数,每一个周期(20ns)cnt加1,当计数时间大于20ms时判断为按键有效即停止计数将使能端置0,然后将state置2进行下一轮判断,如果在计数时间还未达到20ms时便检测到了上升沿,即判断为抖动并停止计数和将state置0,重新开始检测;当state置为2时,此时开始判断上升沿,当检测到上升沿之后便将state置3并将计数使能端置1开始计数,如果没有检测到则重复当前程序继续检测上升沿;当state置为3后便开始滤除掉按键松开后的抖动信号,也就是通过计数时间的长短来判断。

    到此为止按键消抖的程序基本就写完了,然后就开始写仿真的程序。

    bbbe360b216e4d01ca9b59692c3d1e34.png

    首先也是老生常谈的端口定义和引用前面的程序端口并进行连线。

    5d6a1cadd9eeb10c23ae59042d3d0978.png

    然后就是进行时钟仿真,首先开始让时钟信号置1,然后每隔10ns便让时钟信号clk翻转一次,这便是对50M时钟进行仿真。

    84f84e97c7acac7ca6ef18030bba7e99.png

    这部分便是对按键信号进行仿真,仿真按键按下时的情景,对应的上面那张图的几个抖动和两次实际按下的情景。

    02

    程序仿真

    首先来张全局仿真图。

    eb73694254a787247050db83bfcdd8ec.png

    这是我最后仿真结果,包含了对LED自减运算的仿真。

    ae8f191c0120a8bfac505d24e0667b9d.png

    这是按键识别成功波形的仿真,图中可见state由1到3的变化,一般在state为2时也就是检测到了有效的上升沿后按键便识别成功,此时led自减一个二进制数1'b1,然后计数器停止计数等现象。

    对于led自减的程序如下所示。

    dba566cea2f10a817bb7d3683eb521cf.png

    当state为2时也就是按键检测成功之后,首先判断led自减是否溢出,也就是四个灯是否全亮,如果是则返回重新开始计数,如果没有到顶溢出,则led执行相应的自减。

    在这里的key_flag_r是我定义的一个标志位,因为我昨天在这里遇到了一个bug问题,那就是state由2变为3时系统需要执行一个周期,一个周期也就是20ns,如果不用一个标志位限制一下,在这个20ns内,led会持续递减,也就违背了要求不是按键按一下减一次。

    标志位的设置为,当led在按键按下自减一次后,标志位置1,然后再加一个限制条件,当标志位为1时led不变化,当state为3时也就是按键过度后再将led的标志位清零。

    若不加标志位限制的波形如下所示。

    b54246d29cc98beda0c8d43fa0a6936c.png

    如上图所示,若不加标志位,在state为2时,led会持续递减,直到state为3。

    03

    实际现象

    今天将程序下载进FPGA中观察一下现象。

    按键没按一次,led进行一次二进制加法运算,至于为什么程序写的是减法,而现象却是加法,那是因为在FPGA中led一段接的上拉电阻,所以给低电平亮,则此处与程序则相反为加法运算。

    展开全文
  • 全部为0则按下,将按键当前状态(Keysta)置0; 其余状态都为抖动,按键当前状态不变。 在主程序里对按键状态进行判断,如果按键当前状态(Keysta)与按键历史状态(backup)不同,则说明按键状态发生变化。程序中...

    以Key4为例,使用定时中断2ms进行消抖,对连续8次(16ms)的按键状态进行判断.

    如果全部为1则弹起,将按键当前状态(Keysta)为1;

    全部为0则按下,将按键当前状态(Keysta)置0;

    其余状态都为抖动,按键当前状态不变

    在主程序里对按键状态进行判断,如果按键当前状态(Keysta)与按键历史状态(backup)不同,则说明按键状态发生变化。程序中是弹起时,按键次数改变,将最新的按键次数送给数码管显示,将按键历史状态更新为当前状态并进行下一次判断。源代码如下:

    #include<reg52.h>
    
    sbit ADDR0 = P1^0;
    sbit ADDR1 = P1^1;
    sbit ADDR2 = P1^2;
    sbit ADDR3 = P1^3;
    sbit ENLED = P1^4;
    sbit KEY1 = P2^4;
    sbit KEY2 = P2^5;
    sbit KEY3 = P2^6;
    sbit KEY4 = P2^7;
    
    unsigned char code LedChar[] ={
    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
    0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
    };
    
    bit KeySta = 1;           //位定义
    
    void main()
    {
    	bit backup = 1;       //定义一个位变量,保存前一次扫描的按键值。
    	unsigned char cnt = 0;
    
    	EA = 1;
    	ENLED = 0;            //使能U3 选中数码管DS1
    	ADDR3 = 1;			
    	ADDR2 = 0;
    	ADDR1 = 0;
    	ADDR0 = 0;
    	TMOD = 0x01;          //T0为模式1
    	TH0 = 0xf8;           //定时2ms
    	TL0 = 0xcd;
    	ET0 = 1;
    	TR0 = 1;              //启动T0
    	P2 = 0xf7;            //P2.3置0,即输出低电平
    	P0 = LedChar[cnt];    //显示按键次数
    	
    	while(1)
    	{
    		if(KeySta != backup)         //当前值与前次值不相等说明此时有动作
    		{
    			if(backup == 0)          //如果前次值为0,则说明是弹起动作
    			{
    				cnt++;               //按键次数加1
    				if(cnt >= 10)
    				{
    					cnt = 0;         //10次清0
    				}
     				P0 = LedChar[cnt];
    			}
    			backup = KeySta;         //更新备份为当前值
    		}
    
    	}
    }
    /*T0中断服务函数,用于按键状态的扫描并消抖*/
    void InterruptTimer0() interrupt 1
    {
    	static unsigned char keybuf =0xff;  //扫描缓冲区,保存一段时间内的扫描值
    	TH0 = 0xf8;                         //重新加载初值
    	TL0 = 0xcd;
    	keybuf= (keybuf<<1) |KEY4;          //缓冲区左移一位,并将当前扫描值移入最低位
    	if(keybuf == 0x00)                  //连续8次扫描值都为0,16ms内状态不变,即按键已按下
    	{
    		KeySta = 0;
    	}
    	else if(keybuf == 0xff)             //连续8次扫描值都为1,16ms内状态不变,即按键已弹起
    	{
    		KeySta = 1;
    	}
    	else                                //其他情况则按键状态还未稳定
    	{}	
    }

     

    展开全文
  • 这种新的按键扫描思想并不复杂,你需要定义一个 1ms 的定时器,在定时器中判断按键状态,如果按键按下,则按键的检测按下次数 加一,最后将 按键的检测按下次数 乘以 1ms 则可以得到按键按下时间,如果检测到...
  • android按键长按短功能的实现策略

    千次阅读 2012-07-10 15:00:12
    1.当按下键1的时候,就不断的计数,直到你放手电压值变化,再根据计数的次数判断上报长按还是短按的功能 没有按键的时候采样率为HZ/4,采样是HZ/40   static void lradc1_data_function(unsigned long data)...
    定时器轮休的方式,根据采样次数来区分长按还是短按
    1.当按下键1的时候,就不断的计数,直到你放手电压值变化,再根据计数的次数判断上报长按还是短按的功能
    没有按键的时候采样率为HZ/4,采样是HZ/40
     
    static void  lradc1_data_function(unsigned long data)
    248 {
    249         volatile unsigned int  reg_val;
    250         static int key_pressed = -1, count = 0;
    251     int delay = HZ/40;
    252         reg_val = readl(KEY_BASSADDRESS+LRADC_DATA1);
    253 //       printk("[lkj]  second lradc data1 =0x%x, s_headset_plug=%d \n", reg_val, s_headset_plug);
    254         //because recorder app close this, so ....
    255         writel( readl(baseaddr+0x28) | (1<<27),(baseaddr+(0x28)));
    256         writel( readl(baseaddr+0x28) | (1<<29),(baseaddr+(0x28)));
    258         if(s_first_headset_plug != 1 || s_mic_type != 1) {
    259                 mod_timer(&mic_data->timer, jiffies +  HZ/4);
    260                 printk("[lkj] input key hook key return \n");
    261                 return ;
    262         }
    263     if (reg_val >=0 && reg_val < 0x5 )
    264     {
    265             // hook key
    266             if (key_pressed == 0)
    267                 count++;
    268             else {
    269                 key_pressed = 0;
    270                 count = 0;
    271             }
    272             
    273             if (count > 5)
    274             {
    275                              sw_pressed[0] = 1;
    276                  input_report_key(sun4ikbd_dev, HOOK_KEY, 1);
    277                  input_sync(sun4ikbd_dev);
    278                  printk("[lkj] input key sw1 down \n");
    279                  count = 0;
    280             }
    282     
    283     
    284     }
    285     else if( reg_val >= 0x6 && reg_val <= 0xb  )  //根据电压值采取不同按键
    286     {
    287         // sw2
    288             if (key_pressed == 1)  //计数为了减小误触以及实现短按长按的功能
    289                 count++;
    290             else {
    291                 key_pressed = 1;
    292                 count = 0;
    293             }
    294             
    295             if (count > 5)   //计数到大于5时,有2种情况出现
    296             {
    297                              sw_pressed[1] = 1;
    298              //    printk("[lkj] input key sw2 down \n");
    299             }
    301     }
    302     else if ( reg_val >= 0xf && reg_val < 0x1f )
    303     {
    304         // sw3
    305              if (key_pressed == 2)
    306                 count++;
    307             else {
    308                 key_pressed = 2;
    309                 count = 0;
    310             }
    311             
    312             if (count > 5)
    313             {
    314                              sw_pressed[2] = 1;
    315            //      printk("[lkj] input key sw3 down \n");
    316             }
    318    }
    319     else if ( reg_val >= 0x34) {//大于0x34时,根据count的次数判断长按还是短按,并上报不同的功能
    320         key_pressed = -1;
    321                 if (sw_pressed[0])
    322                 {
    323                         sw_pressed[0] = 0;
    324                         input_report_key(sun4ikbd_dev, HOOK_KEY, 0);
    325                         input_sync(sun4ikbd_dev);
    326             //            printk("[lkj] input key sw1 up \n");
    327                 }
    328                 if (sw_pressed[1])
    329                 {
    330                         sw_pressed[1] = 0;
    331             if (count > 20){
    332                          input_report_key(sun4ikbd_dev,KEY_NEXTSONG,1);
    333                          input_sync(sun4ikbd_dev);
    334                          input_report_key(sun4ikbd_dev, KEY_NEXTSONG, 0);
    335                          input_sync(sun4ikbd_dev);
    336             
    337             }//long
    338              else{
    339              
    340                         input_report_key(sun4ikbd_dev, KEY_VOLUMEUP, 1);
    341                         input_sync(sun4ikbd_dev);
    342                         input_report_key(sun4ikbd_dev, KEY_VOLUMEUP, 0);
    343                         input_sync(sun4ikbd_dev);
    344              
    345              }//     shot
    347                 }
    348                 if (sw_pressed[2])
    349                 {
    350                         sw_pressed[2] = 0;
    351             if (count > 20){
    352                          input_report_key(sun4ikbd_dev,KEY_PREVIOUSSONG,1);
    353                          input_sync(sun4ikbd_dev);
    354                          input_report_key(sun4ikbd_dev, KEY_PREVIOUSSONG, 0);
    355                          input_sync(sun4ikbd_dev);
    356             
    357             }//long
    358              else{
    359              
    360                         input_report_key(sun4ikbd_dev, KEY_VOLUMEDOWN, 1);
    361                         input_sync(sun4ikbd_dev);
    362                         input_report_key(sun4ikbd_dev, KEY_VOLUMEDOWN, 0);
    363                         input_sync(sun4ikbd_dev);
    364              
    365              }//     shot
    366                 }
    367         count = 0;
    368         delay = HZ/4;
    369  }
    展开全文
  • 能够记录对应按键按下对应的次数 实现思想: 首先,通过定时器或者查询方式等周期性查询按键状态机的状态 接着在按键状态机中,需要获取得到对应按下的按键,然后通过对按键的前后状态进行对比,如果没有改变,则...

    目录

    一、按键状态机的作用

    二、按键状态机的实现

    1、按键状态机的宏定义

    2、按键状态机的枚举与相关结构体

    3、按键状态机的函数实现


    一、按键状态机的作用

    一般的按键状态机一般都具有以下功能:

    • 能够判断哪个按键按下
    • 能够判断按键是长按或者短按
    • 能够记录对应按键按下对应的次数

    实现思想:

    • 首先,通过定时器或者查询方式等周期性查询按键状态机的状态
    • 接着在按键状态机中,需要获取得到对应按下的按键,然后通过对按键的前后状态进行对比,如果没有改变,则增加按键时间。如果按键松开,则对按键结构体进行修改,将对应信息赋值给按键结构体。

    使用方法:

    • 通过不断检测按键状态机,当按键状态机改变后。通过对按键结构体的检索,可以得知按下按键的按键编号、按键时间长短、按键按下次数。
    • 然后执行对应按键的功能

    二、按键状态机的实现

    1、按键状态机的宏定义

    /* 按键key的编号 */
    #define KEY_DEFAULT_NUM					0x00
    #define KEY_0_NUM						0x01
    #define KEY_1_NUM						0x02
    #define KEY_2_NUM						0x04
    #define KEY_UP_NUM						0x08
    #define KEY_ALL_NUM						0xFF
    
    /* 按键时长状态定义 */
    #define KEY_PRESS_SHORT				10U

    2、按键状态机的枚举与相关结构体

    /* 按键状态对比 */
    typedef enum
    {
    	No_Change = 0,
    	Pressed_State,
    	Release_State,
    
    }exKeyCompareStateEnum;
    
    /* 按键按下时间长短 */
    typedef enum
    {
    	Key_State_Default = 0,
    	Key_State_Short,
    	Key_State_Long,
    
    }exKeyStateEnum;
    
    /* 按键结构体 */
    typedef struct
    {
    	uint8_t ucKeyNum;	/* 按键编号 */
    	uint8_t ucKeyState;	/* 按键时长状态 */
    	uint8_t ucKeyCount; /* 按键次数 */
    
    }exKeyTypeDef;
    

    3、按键状态机的函数实现

    /**
     * 按键状态机
     * @para 	ucKeyNum: 需要检测的按键编号
     * @retval	0: 状态未改变 	1: 状态改变
     */
    uint8_t ucKeyMachine(uint8_t ucKeyNum)
    {
    	static uint8_t ucNewKeyNum = 0, ucOldKeyNum = 0;
    	static uint8_t ucKeyPressedTime = 0;
    	static uint8_t ucEndFlag = 0;
    	uint8_t ucKeyState = No_Change;
    
    	/* 对应按键编号的按键状态 */
    	ucNewKeyNum = ucKeyScan(ucKeyNum);
    
    	/* 新按键状态 判断与处理 */
    	ucKeyState = ucKeyStateCompare(ucNewKeyNum, ucOldKeyNum);
    	switch(ucKeyState)
    	{
    	case No_Change: 	ucKeyPressedTime++;  break;								/* 按键状态改变,则增加按键时间 */
    	case Pressed_State: ucOldKeyNum = ucNewKeyNum; ucKeyPressedTime = 0; break;	/* 按键按下,则更改按键缓存,并且将按键时间置0 */
    	case Release_State: ucEndFlag = 1; break;									/* 按键松开,则进入按键结束 */
    	}
    
    	/* 按键结束 */
    	if(ucEndFlag == 1)
    	{
    		/* 更新按键次数 */
    		if(ex_KeyHandle.ucKeyNum == ucOldKeyNum)
    			ex_KeyHandle.ucKeyCount++;
    		else
    		{
    			ex_KeyHandle.ucKeyNum = ucOldKeyNum;
    			ex_KeyHandle.ucKeyCount = 0;
    		}
    
    		/* 更新按键状态时长 */
    		if(ucKeyPressedTime >= KEY_PRESS_SHORT)
    			ex_KeyHandle.ucKeyState = Key_State_Long;
    		else
    			ex_KeyHandle.ucKeyState = Key_State_Short;
    
    		/* 参数初始化 */
    		ucEndFlag = 0;
    		ucOldKeyNum = 0;
    		ucKeyPressedTime = 0;
    
    		return 1;
    	}
    
    	return 0;
    }
    
    
    /**
     * 按键扫描
     * @para 	ucKeyNum: 按键编号
     * @retval 	ucPressedKeyNum: 返回对应按下按键的编号, 未按下则返回 0
     */
    uint8_t ucKeyScan(uint8_t ucKeyNum)
    {
    	uint8_t ucPressedKeyNum = 0;
    
    	if(ucKeyNum & KEY_0_NUM)
    	{
    		if(HAL_GPIO_ReadPin(KEY_PORT, KEY_0_PIN) == GPIO_PIN_RESET)
    			ucPressedKeyNum |= KEY_0_NUM;
    	}
    
    	if(ucKeyNum & KEY_1_NUM)
    	{
    		if(HAL_GPIO_ReadPin(KEY_PORT, KEY_1_PIN) == GPIO_PIN_RESET)
    			ucPressedKeyNum |= KEY_1_NUM;
    	}
    
    	if(ucKeyNum & KEY_2_NUM)
    	{
    		if(HAL_GPIO_ReadPin(KEY_PORT, KEY_2_PIN) == GPIO_PIN_RESET)
    			ucPressedKeyNum |= KEY_2_NUM;
    	}
    
    	if(ucKeyNum & KEY_UP_NUM)
    	{
    		if(HAL_GPIO_ReadPin(KEY_UP_PORT, KEY_UP_PIN) == GPIO_PIN_SET)
    			ucPressedKeyNum |= KEY_UP_NUM;
    	}
    
    	return ucPressedKeyNum;
    }
    
    
    /**
     * 按键状态前后对比函数
     * @para 	ucNewKeyNum: 新键值状态
     * @para 	ucOldKeyNum: 旧键值状态
     * @retval 	返回对应键值改变的状态
     */
    uint8_t ucKeyStateCompare(uint8_t ucNewKeyNum, uint8_t ucOldKeyNum)
    {
    	if(ucNewKeyNum == ucOldKeyNum)
    		return No_Change;
    	else if((ucNewKeyNum & ucOldKeyNum) == ucOldKeyNum)
    		return Pressed_State;
    	else
    		return Release_State;
    }

     

    展开全文
  • 这样我们就可以同过判断 RC震荡频率的快慢来判断 是否有手指按下。 如何判断RC震荡频率的快慢呢? 这就和我们平时判断一个人做事情快慢是一样的。比如我们给个10S的时间,让两个人吃薯条如果吃的越多的,就说明...
  • C#——按键控制事件

    千次阅读 2018-06-07 15:11:56
    如果放在OnGUI()函数中则需加入一个bool来判断,因为在控制脚本激活的状态,它可以在每帧调用,的越久调用输出次数越多,有兴趣的可以试试。一般定义某个键有两种方法:(1)if (Input.GetKeyDown(KeyCode.A)) ...
  • 键盘按键事件简介代码实现按下直到松开才接着执行 简介代码实现按下直到松开才接着执行 功能简介: 进入方法,按下空格,输出记录,若5s内不放开,则弹出提示,若放开进入键盘松开事件,清除定时器,记录次数,...
  • 代码如下: 在MainActivity.java中 // 声明一个整型变量作为Back按键次数 private int ... // 按下Back按钮自动触发此函数 @Override public void onBackPressed() { // 判断Back按键次数 if (mBa
  • 适用于STVD环境。在STM8S003最小系统上PC7口作为红外遥控接收口,通过定时器的输入捕获功能来读取遥控器的高电平时长,...在定时器中断中判断连发码的次数,统计按键按下次数。按键松开后,返回按键值和按键次数
  • 开始/停止的按键一端接地,当读到相应的传入信号为0时,即可判断按键按下,再进行按键次数的计数,第一次按键为开始,第二次按键为暂停,第三次按键为开始,如此循环往复。当为开始状态时,定时器使能,为停止...
  • touch-screen with Timer

    2010-10-27 19:24:00
    在adc次数到达之后,再次启动定时器,并且将触摸屏重新设置成tc等待中断模式,这样在定时器函数里面可以判断按键是否抬起,进而是结束本次按键并开启tc中断还是继续计数所按下的键值。这里一共留下了两个参数可以...
  • 一:键盘扫描函数中功能键按下次数判断函数位置 之前将if(K1num!=0)  //功能键按下,判断+-操作// 这一语句以及其后的部分放到了与蓝色部分并列的位置,也就是功能键去抖动判断完成之后的按键确认,但是调试时发现...
  • 数码管显示实验

    千次阅读 2015-04-01 20:58:21
    判断按键SW8(INT1)是否按下,并对按键次数计数,显示在数码管之上;(单片机刚启动后,数码管显示为全0,当第一次按下SW8后,数码管显示0001,当第二次按下SW8后,数码管显示0002) 代码实现: //ICC-AVR ...
  •  在某一个线程中,每隔一秒去检测硬件上重置按键是否被按下(由驱动提供接口),如果检测到两次或者以上次数按下,就可以认为是长按,去执行重置的操作。注意判断时间也不能过长,如果硬件上也有重置,比如硬件...
  • 题目要求:输入一个字符串,有大写有小写,可以大写字母锁定,也可以shift,最后要求计算最少按键次数可以把这个字符串打印出来。 思路是这样的,最少要字符串长度len次,在后面遇到有大写出现后情况递增。...
  • keyboard复合键算法

    2012-04-03 13:43:38
    我大致算法就是,在驱动keyboard中断函数中判断是不是我们要复合用的哪个key,如果是则启动一个一秒的timer,在这个timer中去计算n的值(这个n就是你一秒钟按下抬起的次数),如果n=2表示单击了,如果n说明双击了,如果还是1...
  • C语言实现鼠标连点器

    千次阅读 2020-02-20 16:06:14
    有作为开始的按键输入标志 需要设置点击速度和点击次数(用Select来实现) 有可以在运行中暂停和继续的功能(Click来实现) 中途需要实现可以锁定鼠标和解锁的...GetAsyncKeyState(int vKey) 来判断是否用户按下了某个...
  • 游戏开始运行后,会不断有英文字母从窗体出现并往下掉落,玩家通过按下键盘上相应的字母键,可以将正在掉落的字母消除掉,如果任由字母掉落在窗体下方所绘制的“地面”上,玩家会受到“伤害”,受伤次数达到5次则...
  • 手势部分没啥问题,我们可以通过MotionEvent中定义的Event Code来判断当前手势的状态(按下或者释放等) imageButton_white1.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View view,...
  • jd) //判断计数次数是否小于标识 pwm=1; //输出高电平PWM else pwm=0; //低电平PWM count=(count+1); //计数次数继续增加 count=count@; //计数次数必须小于40,因为0.5ms*40=20ms,这是舵机PWM的固定周期 } void ...
  • 4)按下“脉搏测量键”,脉搏测量指示灯亮,把手指放到红外对管之间,脉搏测量开始,直到听到一声响声,表示脉搏测量完毕,脉搏次数在屏幕上有显示; 5)按下“摔倒检测键”,摔倒检测指示灯亮,摔倒检测功能开启,...
  • 软件可以设置参数:按下和放开鼠标按键的时间间隔、两次双击鼠标按键的时间间隔以及鼠标滚轮反响滚动事件间隔。此外,也可以单独屏蔽鼠标左键或右键,亦或是选择两者都屏蔽。运行程序以后,在设定间隔之内发生的两...
  • 按键值 CLOSE_BIT EQU 40H ;显示屏蔽(和位选相与后送P2) A1_MINUTE EQU 41H ;闹铃1 分钟 A1_HOUR EQU 42H ;闹铃1 小时 A1_SWITCH EQU 43H ;闹铃1 开关 A2_MINUTE EQU 44H ;闹铃2 分钟 A2_HOUR EQU 45H ...
  • 分机按键呼叫,通过无线数据发射模块发射信号,主机通过接收模块接收到从机发射的信号后,判断是否符合通信协议,符合的话并声光报警,提醒工作人员,同时显示呼叫的号码,工作人员看到信息后,可以通过按下清音键来...
  • led1632电路图

    2011-04-24 15:46:35
    你的解码程序和我现在用的解码程序大体是一样的,我自己实际做了一下,发现按下遥控器,接收到红外信号后,数码管闪的厉害。我用的是6位动态数码管。不知道你有没有遇到这样的情况? 分析解码程序,感觉是中断的时间...
  • 键盘消息源代码

    2004-02-06 00:00:00
    "按下" : "抬起"))//判断转换状态 ); ReleaseDC (hwnd, hdc); ValidateRect (hwnd, NULL); } //函数:WndProc //作用:处理主窗口的消息 LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, ...
  • Excel VBA实用技巧大全 附书源码

    热门讨论 2010-10-08 18:59:24
    01036设置【Enter】键后单元格的移动方向 01037设置最近使用的文件清单中的最多文件数 01038设置新工作簿中的工作表个数 01039设置文件的默认位置 01040设置保存自动恢复文件的时间间隔和保存位置 01041停止屏幕...
  • 两个操作按键实现2秒过磅,自动判断是否打印,无需切换页面,方便快捷省心省力。  4.支持中维世纪C890采集卡,实现3路视频监控,并分别将皮重、毛重过磅图像保存到指定硬盘目录中。  5.称重项目字段可根据企业...
  • 7.24 将按下按键显示在网页上 221 7.25 检查是否按下Ctrl、Alt、Shift键 222 7.26 取得键盘的方向键 223 7.27 用方向键来控制图片的移动 224 7.28 显示不同的鼠标指针样式 226 7.29 使用外部的鼠标指针样式 ...

空空如也

空空如也

1 2 3
收藏数 59
精华内容 23
关键字:

判断按键按下次数