单片机识别按钮的单击、双击和长按操作的C语言代码

本源码以cc2530单片机为例,SW1表示控制开关,0为按下,1为释放。根基单片机的频率和个人需要设置延迟delay变量的值

//0:释放  1:单击  2:双击  3:长按
int swstatus()
{ 
  int delay=100;//判定延迟
  int t=0;
 
  if(SW1==1)
  {
    return 0;
  }
  
  if(SW1==0)
  {
    for(int i=delay;i>0;i--)
    {
      if(t==0)
      {
        for(int j=0;j<2000;j++) 
          { 
             if(SW1==1) 
               { 
                   t=1; 
                   break;
               } 
          }
       }
  }

 if(t==1)
 { 
   for(int i=delay;i>0;0;i--)
   {
     for(int j=0;j<500;j++)
     {
          if(SW1==0)
          {
            while(!SW1);
            return 2;
          }
      }
   }
   return 1;
   }
   else
   {
     return 3;
   }
 }
}

以下代码是该函数的一个应用:单击切换led灯,双击开启跑马灯,长按关闭开启所有led灯

#include "ioCC2530.h"  
#include "stdio.h"

#define LED1 P1_0
#define LED2 P1_1
#define LED3 P1_3
#define LED4 P1_4
#define SW1 P1_2

void delay(unsigned int time)
{ unsigned int i;
  unsigned char j;
  for(i = 0; i < time; i++)
  {  for(j = 0; j < 240; j++)
      {   asm("NOP");
          asm("NOP");
          asm("NOP");
       }  
   }  
}

void light()
{
  LED1 = ~LED1;
  LED2 = ~LED2;
}

//get switch status,
int swstatus()
{ 
  int delay=100;//判定延迟
  int t=0;
 
  if(SW1==1)
  {
    return 0;
  }
  
  if(SW1==0)
  {
    for(int i=delay;i>0;i--)
    {
      if(t==0)
      {
        for(int j=0;j<2000;j++)
        {
          if(SW1==1)
          {
             t=1;
             break;
          }
        }
      }
    }
    
    if(t==1)
    {
      for(int i=delay;i>0;i--)
      {
        for(int j=0;j<500;j++)
        {
          if(SW1==0)
          {
            while(!SW1);
            return 2;
          }
        }
      }       
      return 1;
    }
    else
    {
      return 3;
    }
  }
}

void main(void)
{
   // P1SEL &= ~(0x01 << 0); // 设置P1.0为普通IO口,0为IO口,1为外设功能
   // P1DIR |= 0x01<<0;    // 设置为输出, P1DIR 为P1端口的方向寄存器,
                           // 0:I/O引脚切换成输入模式;1:I/O引脚切换成输出模式
   // P1SEL &= ~0x07;
    P1DIR |= 0x1B;
    
    P1INP &=~0x04;
    P2INP &=~0x40;
    
    LED1=0;
    LED2=0;
    LED3=0;
    LED4=0;
    
    int t=0;
    while(1)
    {
      int swt = swstatus();
      if(swt==1)
      {
        printf("切换灯\n");
        switch(t)
        {
        case 0:LED1=0;LED2=1;LED3=0;LED4=0;t++;break;
        case 1:LED1=0;LED2=0;LED3=1;LED4=0;t++;break;
        case 2:LED1=0;LED2=0;LED3=0;LED4=1;t++;break;
        case 3:LED1=1;LED2=0;LED3=0;LED4=0;t=0;break;
        }
      }
      if(swt==2)
      {
        printf("跑马灯\n");
        while(1)
        {
              LED1=0;LED2=1;LED3=0;LED4=0;delay(3000);
              LED1=0;LED2=0;LED3=1;LED4=0;delay(3000);
              LED1=0;LED2=0;LED3=0;LED4=1;delay(3000);
              LED1=1;LED2=0;LED3=0;LED4=0;delay(3000);
              if(swstatus()==2)break;
        }
      }
      if(swt==3)
      {
        printf("全部灯\n");
        while(1)
        {
            LED1=1;
            LED2=1;
            LED3=1;
            LED4=1;
          if(swstatus()==3)
          {           
            LED1=0;
            LED2=0;
            LED3=0;
            LED4=0;
            delay(500);
            break;
          }
        }
      }
    }
}


发表评论

[/0o0] [..^v^..] [0_0] [T.T] [=3-❤] [❤.❤] [^v^] [-.0] [!- -] [=x=] [→_→] [><] 更多 »
昵称

抢沙发~