zigbee(题型整理2)

zigbeeCC2530的按键触发题型
题目:单片机

  1. 按键按下抬起led灯点亮
  2. 按键按下led灯点亮

按键按下抬起led灯点亮

#include <ioCC2530.h>

#define uint unsigned int
#define uchar unsigned char


#define LED1 P1_0   //LED1为P1.0口控制
#define KEY1 P0_4      //KEY1为P0.1口控制

void Delayms(uint);     //延时函数
void InitLed(void);     //初始化LED1
void KeyInit();                 //按键初始化
uchar KeyScan();                //按键扫描程序

void Delayms(uint xms)   //i=xms 即延时i毫秒
{
 uint i,j;
 for(i=xms;i>0;i--)
   for(j=587;j>0;j--);
}

void InitLed(void)
{
    P1DIR |= 0x01;  //P1_0定义为输出
        LED1 = 1;       //LED1灯熄灭     
}

void InitKey()
{
  P0SEL &= ~0X10;    //设置P04为普通IO口  
  P0DIR &= ~0X10;   //按键在P04 口,设置为输入模式 
  P0INP &=  ~0x10;   //打开P04上拉电阻,不影响
}

uchar KeyScan(void)
{
  if(KEY1==0)
  {Delayms(10);
      if(KEY1==0)
      {
        while(!KEY1);  //松手检测
        return 1;      //有按键按下
      }
  }
  return 0;           //无按键按下
}

void main(void)
{
    InitLed();      //调用初始化函数
    InitKey();
        while(1)
    {
          if(KeyScan())       //按键改变LED状态
           LED1=~LED1;     

        }
}

按键按下led灯点亮

#include <ioCC2530.h>

#define D1 P1_0
#define SW1 P0_0

#define uint unsigned int
#define uchar unsigned char

void init()
{
  P1SEL &=~0X01;
  P1DIR |=0X01;
  D1=0;

  P0SEL &=~0X01;
  P0DIR &=~0X01;

}
void delay(uint xms)
{
  uint i,j;
  for (i=0;i<xms;i++)
    for (j=0;j<240;j++)
    {
      asm("NOP");
      asm("NOP");
      asm("NOP");
    }
}

uint keyscan()
{
  if(SW1==0)
  {
    delay(100);
    if(SW1==0){
      while(!SW1);
      return 1;
    }
  }
  return 0;
}

int main(void)
{
  init();
  while(1)
  {
    if(keyscan()==1)
      D1=!D1;
    }
}

由于该博客不涉及到中断操作,使用的是简单的触发方式。

以下是一个针对CC2530的代码,实现了您所要求的功能: ```c #include "ZComDef.h" #include "OSAL.h" #include "OSAL_Tasks.h" #include "ZDApp.h" #include "ZDObject.h" #include "AF.h" #include "ZDProfile.h" #include "OnBoard.h" #include "hal_led.h" #include "hal_key.h" #define LED1_PIN HAL_BOARD_IO_LED1 #define LED2_PIN HAL_BOARD_IO_LED2 #define SW1_PIN HAL_BOARD_IO_KEY_LEFT #define SW_INTERVAL_MS 300 // LED1呼吸灯状态 typedef enum { LED1_BREATHING_UP, LED1_BREATHING_DOWN } led1BreathingState_t; // LED1呼吸灯定时器回调函数 static void led1BreathingTimerCallback(uint8_t endpoint, uint8_t data); // SW1按键回调函数 static void sw1Callback(uint8_t keys, uint8_t state); // LED1呼吸灯变亮的时间间隔 #define LED1_BREATHING_UP_INTERVAL_MS 20 // LED1呼吸灯变暗的时间间隔 #define LED1_BREATHING_DOWN_INTERVAL_MS 20 // LED1呼吸灯最大亮度 #define LED1_BREATHING_MAX_BRIGHTNESS 255 // LED1呼吸灯当前亮度 static uint8_t led1BreathingBrightness = 0; // LED1呼吸灯方向 static led1BreathingState_t led1BreathingDirection = LED1_BREATHING_UP; // LED1呼吸灯定时器ID static uint16_t led1BreathingTimerId = 0; void zmain(uint8_t zgArgc, uint8_t *zgArgv) { // 初始化系统 HAL_BOARD_INIT(); SystemResetSetup(); // 初始化键盘 HalKeyConfig(SW1_PIN, HAL_KEY_INTERRUPT_FALLING_EDGE, sw1Callback); // 初始化LED HalLedInit(); HalLedSet(LED1_PIN, HAL_LED_MODE_OFF); HalLedSet(LED2_PIN, HAL_LED_MODE_OFF); // 启动系统 osal_init_system(); } static void led1BreathingTimerCallback(uint8_t endpoint, uint8_t data) { if (led1BreathingDirection == LED1_BREATHING_UP) { led1BreathingBrightness += 1; if (led1BreathingBrightness >= LED1_BREATHING_MAX_BRIGHTNESS) { led1BreathingBrightness = LED1_BREATHING_MAX_BRIGHTNESS; led1BreathingDirection = LED1_BREATHING_DOWN; } } else { led1BreathingBrightness -= 1; if (led1BreathingBrightness == 0) { led1BreathingBrightness = 0; led1BreathingDirection = LED1_BREATHING_UP; } } HalLedSet(LED1_PIN, HAL_LED_MODE_PWM, led1BreathingBrightness, 0, 0); led1BreathingTimerId = osal_start_timerEx(0, SW_INTERVAL_MS, led1BreathingTimerCallback); } static void sw1Callback(uint8_t keys, uint8_t state) { // 按下按键 if (state == HAL_KEY_STATE_PUSHED) { // 取消LED1呼吸灯定时器 osal_stop_timerEx(0, led1BreathingTimerId); // LED1灯亮,LED2灯熄灭 HalLedSet(LED1_PIN, HAL_LED_MODE_ON); HalLedSet(LED2_PIN, HAL_LED_MODE_OFF); } // 放开按键 else if (state == HAL_KEY_STATE_RELEASED) { // 启动LED1呼吸灯定时器 led1BreathingDirection = LED1_BREATHING_UP; led1BreathingBrightness = 0; led1BreathingTimerId = osal_start_timerEx(0, SW_INTERVAL_MS, led1BreathingTimerCallback); // LED1灯常亮,LED2灯常亮 HalLedSet(LED1_PIN, HAL_LED_MODE_ON); HalLedSet(LED2_PIN, HAL_LED_MODE_ON); } // 双击按键 else if (state == HAL_KEY_STATE_DOUBLE) { // 取消LED1呼吸灯定时器 osal_stop_timerEx(0, led1BreathingTimerId); // LED1灯呼吸灯效果,LED2灯熄灭 HalLedSet(LED1_PIN, HAL_LED_MODE_OFF); HalLedSet(LED2_PIN, HAL_LED_MODE_OFF); osal_start_timerEx(0, SW_INTERVAL_MS, led1BreathingTimerCallback); } } ``` 代码主要分为三部分: 1. 初始化系统,包括初始化键盘和LED。 2. 在SW1按键回调函数中实现按键功能,包括长按、放开和双击三种状态。在长按状态下,LED1灯常亮,LED2灯熄灭;在放开状态下,LED1和LED2都常亮;在双击状态下,LED1灯实现呼吸灯效果,LED2灯保持熄灭状态。 3. 在LED1呼吸灯定时器回调函数中实现LED1呼吸灯效果,包括改变LED1亮度和方向,并设置LED1亮度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值