hubertdong 发表于 2016-12-12 21:09:58

一个按键短按、长按检测程序

对一个按键短按、长按检测程序:
#define BUTTON_PIN_1   7       // 定义一个按键Button pin1
#define DC_PIN                13      // LED pin

int get_key(void)
{    int k0,k1,tt=0;
AA1:k0=digitalRead(BUTTON_PIN_1);delay(30);
      k1=digitalRead(BUTTON_PIN_1);
      if(k1==LOW) goto AA1;//判断按键是否低电平,如果低,循环检测,如果高则下一句
AA2:   tt++;                        //对按键高电平计数
      k0=digitalRead(BUTTON_PIN_1);delay(10);
      k1=digitalRead(BUTTON_PIN_1);
      if(k1==HIGH) goto AA2;//判断按键是否高电平,如果高,继续计数,如果低电平,则表示按键结束
   if(tt<30)    return 11;         //如果按键时间小于30*10ms=0.3s,则返回“11”,也可以自己任意定义返回值
   if(tt>150)return 12;         //如果按键时间大于150*10ms=1.5s,则返回“22”,也可以自己任意定义返回值,如果需要更长时间,修改系数150即可
}

void setup() {
pinMode(BUTTON_PIN_1,INPUT);
pinMode(DC_PIN,OUTPUT);
delay(100);
digitalWrite(DC_PIN,LOW);
}
//短按<300ms,LED亮;
//长按>1500ms,LED熄灭。
void caidan()/*菜单选择*/
{int ch;
for(;;)
{       ch=get_key();
switch(ch)
{
   case 11:    /*短按LED亮 */
    digitalWrite(DC_PIN,HIGH);
    delay(10);
    break;

   case 12:    /*长按LED灭 */
    digitalWrite(DC_PIN,LOW);
    delay(10);
    break;
   defult: break;
} /*   End of switch   */
} /*   End for(;;)   */
} /*End caidan()    */

void loop()
{   
while(1) {
          caidan();
          delay(10);
      }//End while
}

单片机菜鸟 发表于 2016-12-13 08:08:15

其实对于一些按键感觉这个不适用

hubertdong 发表于 2016-12-13 14:55:02

单片机菜鸟 发表于 2016-12-13 08:08
其实对于一些按键感觉这个不适用

其实可以在函数里面判断多个按键的:)

单片机菜鸟 发表于 2016-12-13 15:08:30

hubertdong 发表于 2016-12-13 14:55
其实可以在函数里面判断多个按键的

没有我是说防抖那里

hubertdong 发表于 2016-12-13 18:05:18

单片机菜鸟 发表于 2016-12-13 15:08
没有我是说防抖那里

经验证,对小型的按键防抖还行:P

ignore 发表于 2017-1-23 09:30:36

hubertdong 发表于 2016-12-13 14:55
其实可以在函数里面判断多个按键的

对于,红外按键,
页: [1]
查看完整版本: 一个按键短按、长按检测程序