zigbee学习(1)----点亮LED

一、前言

  其实我把zigbee后面的组网那些都看完了,现在开始写也是当复习吧。

二、原理分析

  ①:看过好多博客,刚开始都是直接讲配置寄存器,但我觉得需要且有必要了解一下cc2530这款单片机。zigbee就在人家上面搭载嘛

  

  CC2530微控制器采用QFN40封装,有40 个引脚。其中,有21数字I/O端口,其中P0P18 端口P2仅有5可以使用。21个端口均可以通过编程进行配置

  实际上,在P2端口的5个引脚中,有2个需要用作仿真,有2个需要用作晶振,你在CC2530的开发中真正能够使用的只有17引脚

  ②通过特殊功能寄存器来设置cc230引脚

  

  

  

  通过配置这些寄存器,就可控制I\0口。

      ③ 多将一句:#include "ioCC2530.h"      引入头文件 就可以直接使用寄存器的名称访问内存地址了。


这里加一个小插曲:   对寄存器的某些位清0 而不影响 其他位。该怎么做。(这里原博客作者为小蜜蜂老师)

 例如:寄存器P1TM的当前值是0x6c,现需要将该寄存器的第1位、第3 位和第5位设置为0,同时不能影响该寄存器其他位的值,那么,在C语言中应该怎么编写代码呢?

         使用“&=”将寄存器指定位清0,同时不影响其他位的值。

        正确写法:P1TM &= ~0x2A

        因为:逻辑操作的特点是,该位有0结果就为0,若为1则保存原来值不变。

        首先将字节 0000 0000要操作的位设置为1,即0010 1010,在将该数值取反,即1101 0101,也就是~0x2A。再将该值与寄存器P1TM“相与”,那么有0的位,即1、3、5位将被清0,其余的位会保持原来的值不变。

        所以:P1TM的当前值为0x6c,即0110 1100,

        0110 1100 && 1101 0101 = 0100 0100,即1、3、5位清0,其他位不变。

        <注意>:该方法只能操作多位同时清0,或者某一位清0的情况,如果要将寄存器的位既要清0又要置1,则不能采用这种写法。(其中原因自己思考一下)

        在不少嵌入式应用的源码程序中,对于寄存器的第n位的清0操作也可以写成:寄存器&= ~(0x01<<(n))其道理是一样的。

        <2> 对寄存器的某些位置1而不影响其他位。

        例如:寄存器P1TM的当前值是0x6c,现需要将该寄存器的第1位、第4位和第5位设置为1,同时不能影响该寄存器其他位的值,那么,在C语言中应该怎么编写代码呢?

        使用“|=”将寄存器指定位置1,同时不影响其他位的值。

        正确写法:P1TM |= 0x32

        因为:逻辑操作的特点是,该位有1结果就为1,若为0则保存原来值不变。

        首先将字节 0000 0000要操作的位设置为1,即0011 0010,也就是0x32。 再将该值与寄存器P1TM“相或”,那个有1的位,即1、4、5位将被设置为1,其余的位会保持原来的值不变。

        所以:P1TM的当前值为0x6c,即0110 1100,

        0110 1100 || 0011 0010 = 0111 1110,即1、4、5位置1,其他位不变。

        同样要注意:该方法只能操作多位同时置1,或者某一位置1的情况。

        对于寄存器的第n位的清0操作也可以写成:寄存 |= (0x01<<(n))


最后是编写代码:

#include <ioCC2530.h>
#define uint unsigned int
#define uchar unsigned char #define LED1 P1_0 //定义P1_0口为LED1控制端 #define LED2 P1_1 //定义P1_1口为LED2控制端 #define LED3 P1_4 //定义P1_4口为LED3控制端 /* 函 数 名 : IO_Init 功能描述 : LED_IO初始化函数 输入参数 : NONE 输出参数 : NONE 返 回 值 : NONE */ void IO_Init(void) { P1DIR |= 0xff; //P1端口定义为输出 LED1 = 0; //点亮LED1 LED2 = 0; //点亮LED2 LED3 = 0; //点亮LED3
}
/* 函 数 名 : Delayms 功能描述 : 毫秒延时 输入参数 : xms:延时时间,如 i=xms 即延时i毫秒 输出参数 : none 返 回 值 : none */ void Delayms(uint xms)
{
uint i,j; for(i=xms;i>0;i--) for(j=587;j>0;j--);
}
/* 函 数 名 : main 功能描述 : LED测试(通用IO的输出使用) 输入参数 : NONE 输出参数 : NONE 返 回 值 : NONE */ void main ( void ) {
IO_Init ();
//调用初始化程序 Delayms ( 2000 ); //延时2s while ( 1 )
{ LED1
= ~ LED1; LED2 = ~ LED2; LED3 = ~ LED3; Delayms ( 500 ); //延时0.5s
}
}

最后总结:

  编写这个函数,主要就是配置I\O口相关的寄存器。通过延时函数实现我们等国闪烁效果。

猜你喜欢

转载自www.cnblogs.com/mengnan-konghai/p/13192185.html