是老恭呀 2024-05-22 14:51 采纳率: 0%
浏览 6
已结题

cc2530双击控制呼吸灯

有没有同学帮忙改进一下,我打的这段代码为什么不能双击控制呼吸灯的呼吸
(目的:长按灯1亮,松开灯1、2亮;双击灯1变为呼吸灯,再次双击呼吸灯变为当前亮度)

#include<ioCC2530.h>
#define LED1 P1_0
#define LED2 P1_1
#define SW1 P1_2

unsigned char h=1;
void delay(unsigned int t)
{
  unsigned int x,y;
  for(x=0;x<t;x++)
  {
    for(y=0;y<400;y++);
  }
}

void LED()
{
  P1SEL &=~0x03;
  P1SEL &=~0x04;
  P1DIR |=0x03;
  P1DIR &=~0x04;
  LED1=0;
  LED2=0;
  IEN2 |=0x10;
  P1IEN |=0x04;
  PICTL |=0x02;
  EA=1;
}

void LEDT1()
{
  T1CTL |=0x01;
  PERCFG = 0x40;
  P1SEL |= 0x01;
  T1CCTL2 |=0x64;
  T1CC2L |=0xFF;
  T1CC2H |=h;
}
unsigned int keytime=0,keycut=0,b=0,a=1;
//keytime长按时间,keycut点击次数,b控制呼吸;1呼吸0熄灭//
void key()
{
  LED();
  while(1)
  {
    if(SW1==0)
    {
      delay(50);
      if(SW1==0)
      {
        keytime=0;
        while(SW1==0  )
        {
          delay(1);
          keytime++;
          if(keytime>500)
          {
            LED1=1;
            LED2=0;
          }
        }
        if(SW1==1)
        {
          if(keytime>500)
            LED1=LED2=1;
          else
            keycut++;
        }
      }
      if(keycut>1)
      {
        if(b==0)
          b=1;
        else if(b==1)
          b=0;
        keycut=0;
      }
    }
  }
}

void main()
{
  LED();
  LEDT1();
  key();
  while(1)
  {
    if((T1STAT & 0X04) >0)
    {
      T1STAT &=0xfb;
      if(b==1)
        h++;
      else
        h--;
      T1CC2L =0XFF;
      T1CC2H =h;
      if(h >=254)
        b=0;
      if(h==0)  
        b=1;
    }
  }
}

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2024-05-22 14:51
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    【您想要解决的问题】: 您提问的目的是要改进现有的CC2530单片机程序,使其能够通过双击控制呼吸灯的亮灭状态,即实现双击来切换呼吸灯的呼吸效果。

    【问题出现原因】:

    1. 程序中keytime变量用于检测按键按下的时间,但当前的逻辑没有明确区分单击和双击。
    2. keycut变量用于记录点击次数,但在当前的逻辑中,双击的检测和处理似乎并不明确。
    3. 程序中b变量用于控制呼吸灯的呼吸状态,但如何通过双击来改变b的值,实现呼吸灯的控制逻辑需要改进。

    【问题解决方案】:

    1. 需要增加一个变量来记录上一次按键的时间,以便判断是否为双击。
    2. 需要修改按键处理逻辑,以便能够检测双击事件,并据此切换呼吸灯的状态。

    【提供代码】: 以下是修改后的代码片段,主要增加了双击检测逻辑,并修改了呼吸灯控制逻辑:

    // ...[省略其他代码]...
    
    unsigned int lastPressTime = 0; // 新增变量,记录上一次按键按下的时间
    
    void key()
    {
      LED();
      while(1)
      {
        if(SW1==0)
        {
          delay(50);
          if(SW1==0)
          {
            unsigned int currentTime = 0; // 假设有一个函数可以获取当前时间
            if(currentTime - lastPressTime < 300) // 300为双击间隔时间,可调整
            {
              // 双击事件
              if(b == 0)
                b = 1;
              else if(b == 1)
                b = 0;
            }
            else
            {
              // 单击事件
              keytime = 0;
              while(SW1==0)
              {
                delay(1);
                keytime++;
                if(keytime>500)
                {
                  LED1=1;
                  LED2=0;
                }
              }
              if(SW1==1)
              {
                if(keytime>500)
                  LED1=LED2=1;
                else
                  keycut++;
              }
            }
            lastPressTime = currentTime; // 更新上一次按键按下的时间
          }
        }
      }
    }
    
    // ...[省略其他代码]...
    

    【代码运行方式】:

    1. 需要在支持CC2530单片机的开发环境中编译和下载程序。
    2. 确保单片机连接正确,并且呼吸灯和按键SW1的硬件连接没有问题。

    【代码预期运行结果】:

    • 当用户双击按键SW1时,呼吸灯的呼吸效果会切换。
    • 如果呼吸灯当前处于呼吸状态,双击后会停止呼吸,LED1和LED2保持当前亮度。
    • 如果呼吸灯当前处于停止状态,双击后会开始呼吸。

    【推荐相关链接】:

    1. CC2530数据手册
    2. CC2530开发板教程
    3. 单片机呼吸灯控制教程
    4. 单片机按键去抖动处理
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月29日
  • 修改了问题 5月22日
  • 创建了问题 5月22日

悬赏问题

  • ¥20 gitlab 中文路径,无法下载
  • ¥15 用动态规划算法均分纸牌
  • ¥30 udp socket,bind 0.0.0.0 ,如何自动选取用户访问的服务器IP来回复数据
  • ¥15 关于树的路径求解问题
  • ¥15 yolo在训练时候出现File "D:\yolo\yolov5-7.0\train.py"line 638,in <module>
  • ¥30 戴尔inspiron独显直连
  • ¥15 进行一项代码设计遇到问题
  • ¥15 Mutisim中关于74LS192N计数器芯片设计(计数器)
  • ¥50 fastadmin后台无法删除文件
  • ¥15 oracle查询Socket read timed out错误