写一个针对于CC2530的代码,要求如下:1.ZigBee节点盒通电或重置,节点盒的LED1、LED2灯都不亮。 2.长按SW1键不松开,LED1灯亮,LED2灯熄灭。 3.松开SW1键,LED1、LED2亮灯都常亮。 4.双击SW1可以控制LED1灯实现呼吸灯效果,LED2灯保持熄灭状态。 5.再次双击SW1可以控制LED1维持当前亮度不再发生变化,LED2继续保持熄灭状态。
时间: 2024-02-19 08:02:53 浏览: 136
下面是一个基于CC2530的代码,实现了所述的功能:
```c
#include "hal_board.h"
#include "hal_defs.h"
#include "hal_led.h"
#include "hal_key.h"
#include "hal_timer.h"
#include "hal_types.h"
#define LED1_ON() HalLedSet(1, HAL_LED_MODE_ON)
#define LED1_OFF() HalLedSet(1, HAL_LED_MODE_OFF)
#define LED2_ON() HalLedSet(2, HAL_LED_MODE_ON)
#define LED2_OFF() HalLedSet(2, HAL_LED_MODE_OFF)
#define LED_BLINK_TIME 200 // 呼吸灯效果的时间间隔,单位为毫秒
static uint8_t sw1_pressed;
static uint8_t sw1_double_click;
void sw1_isr(void)
{
// 判断 SW1 是否按下
if (HAL_KEY_SW_1 == HalKeyRead(HAL_KEY_SW_1_PIN))
{
// SW1 按下了
sw1_pressed = 1;
sw1_double_click++;
HalTimerDelay(50); // 延迟 50ms
}
else
{
// SW1 松开了
sw1_pressed = 0;
if (sw1_double_click == 1) // 单击
{
LED1_ON();
HalTimerDelay(LED_BLINK_TIME);
LED1_OFF();
}
else if (sw1_double_click == 2) // 双击
{
static uint8_t breathing_step = 0;
static uint16_t breathing_time = 0;
if (breathing_step == 0)
{
breathing_step = 1;
breathing_time = 0;
LED1_ON();
}
else if (breathing_step == 1)
{
breathing_time += LED_BLINK_TIME;
if (breathing_time >= 1000)
{
breathing_step = 2;
breathing_time = 0;
}
else
{
uint8_t brightness = breathing_time * 255 / 1000;
HalLedSetBrightness(1, brightness);
HalTimerDelay(LED_BLINK_TIME);
}
}
else if (breathing_step == 2)
{
breathing_time += LED_BLINK_TIME;
if (breathing_time >= 1000)
{
breathing_step = 0;
breathing_time = 0;
}
else
{
uint8_t brightness = 255 - breathing_time * 255 / 1000;
HalLedSetBrightness(1, brightness);
HalTimerDelay(LED_BLINK_TIME);
}
}
}
sw1_double_click = 0;
}
}
void main(void)
{
// 初始化 LED 和按键
HalBoardInit();
HalLedSet(1, HAL_LED_MODE_OFF);
HalLedSet(2, HAL_LED_MODE_OFF);
HalKeyConfig(HAL_KEY_SW_1, HAL_KEY_CONFIG_NORMAL | HAL_KEY_CONFIG_AUTOREPEAT);
HalKeyRegisterCallback(HAL_KEY_SW_1, sw1_isr);
while (1)
{
if (sw1_pressed)
{
LED1_ON();
LED2_OFF();
}
else
{
LED1_ON();
LED2_ON();
}
}
}
```
请注意,这只是一个示例代码,可能需要根据实际硬件和需求进行修改。
阅读全文