zigbee(题型整理4)

题目:Zigbee节点板通电,程序开始运行时D5闪烁,2S后该LED变常亮,其余灯灭单击模块上的SW1(按下时间不超过1秒),D5、D6、D3、D4、依次闪烁1s后变常亮;长按“SW”,所有灯灭

本题难点是判断短按还是长按,所以我使用了一个计时器来判断。
核心代码是判断,返回temp

uint8 scankey()
{
  if(KEY1==0)
  {
    delay(100);
    count1=0;
    if(KEY1==0)
    {
      while(!KEY1){
        temp=count1;
        if(temp==100){
          break;
        }
       }
      return 1;
     }
  }
  return 0;
}
#include "hal_defs.h"
#include "hal_cc8051.h"
#include "hal_int.h"
#include "hal_mcu.h"
#include "hal_board.h"
#include "hal_led.h"
#include "hal_rf.h"
#include "basic_rf.h"
#include "hal_uart.h" 
#include "sensor_drv/sensor.h"
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
/*****点对点通讯地址设置******/
#define RF_CHANNEL                22         // 频道 11~26
#define PAN_ID                    0x8888     //网络id 
#define MY_ADDR                   0x1015     //本机模块地址
#define SEND_ADDR                 0xAC3A     //发送地址
/**************************************************/  
static basicRfCfg_t basicRfConfig;
// 无线RF初始化
#define LED3 P1_0
#define LED4 P1_1
#define KEY1 P1_2
#define LED5 P1_3
#define LED6 P1_4


uint8 txdata_1[1]={1};
uint8 txdata_2[1]={2};

uint8 rxdata[1];

uint8 count_stat=0;
long long count_timer=0;
long long count1=0;
long long temp=0;
void ConfigRf_Init(void)
{
    basicRfConfig.panId       =   PAN_ID;
    basicRfConfig.channel     =   RF_CHANNEL;
    basicRfConfig.myAddr      =   MY_ADDR;
    basicRfConfig.ackRequest  =   TRUE;
    while(basicRfInit(&basicRfConfig) == FAILED);
    basicRfReceiveOn();
}

void init()
{
  P1SEL &=~0X1f;
  P1DIR |=0X1b;//led
  P1DIR &=~0x04;//key
  LED4=LED5=LED3=LED6=0;

  T3CTL |=0X06;//0000 0110 溢出中断屏蔽,模式是模模式
  T3CTL |=0X08;// 0000 1000 出中断屏蔽
  EA=1;
  T3IE=1;
  T3CTL |=0Xe0;//1110 0000 128分频
  T3CTL &=~0x03;
  T3CC0 =0Xfa;//250
  T3CTL |=0X10;//启动定时器
}

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

uint8 scankey()
{
  if(KEY1==0)
  {
    delay(100);
    count1=0;
    if(KEY1==0)
    {
      while(!KEY1){
        temp=count1;
        if(temp==100){
          break;
        }
       }
      return 1;
     }
  }
  return 0;
}

void main(void)
{
    halBoardInit();//选手不得在此函数内添加代码
    ConfigRf_Init();//选手不得在此函数内添加代码
    init();
    while(1)
    {
      /* user code start */
      if(scankey())
      {
        if(temp<=50){
          halMcuWaitMs(350);
          basicRfSendPacket(SEND_ADDR,txdata_1,1);
          temp=0;
        }
        else if(temp==100){
          halMcuWaitMs(350);
          basicRfSendPacket(SEND_ADDR,txdata_2,1);
          temp=0;
        }
      }


      if(basicRfPacketIsReady()){
        halMcuWaitMs(350);
        if((basicRfReceive(rxdata,1,NULL)>0))
        {
            if(rxdata[0]==1)
            {
              LED4=1;
            }
            else if(rxdata[0]==2)
            {
              LED4=0;
            }
        }
      }

    /* user code end */
    }
}




#pragma vector=T3_VECTOR
__interrupt void T1_int (void)
{
  IRCON =0X00;
  count_timer++;
  if (count_timer==10)
  {
    count1++;
    count_timer=0;
  }
  if(count1>1500)
    count1=0;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值