【物联网技能竞赛】【ZigBee】CC2530点亮Led入门笔记

电路图

首先,要想点亮LED灯,那就必须了解开发板上led所对应的引脚,最直接的方法就是看电路图(这边所使用的是物联网技能大赛对应的ZigBee开发板,若用其它板子得对引脚和代码进行更替):

 

 如图可以看出led灯的引脚分别对应到

D3P1_0
D4P1_1
D5P1_3
D6P1_4


了解了led灯对应的引脚,再来看看两个重要的寄存器

PxSEL 端口功能寄存器

 位名称 复位值操作 描述
7:0 SELPx[7:0]  0x00  R/W 

 设置 Px_7 到 Px_0 端口的功能。

0:对应端口被设置为通用 I/O 功能。

1:对应端口被设置为外设功能。

PxDIR 端口方向寄存器

 位名称 复位值操作 描述
7:0DIRPx[7:0] 0x00  R/W 

 设置 Px_7 到 Px_0 端口的传输方向。 0:输入

1:输出

我们要想将led灯点亮,需将led灯对应的四个引脚的PxSEL端口功能寄存器设置成通用 I/O 功能,和将PxDIR 端口方向寄存器设置成输出。

LED灯引脚初始化详解

我们要让led点亮,要先让P1SEL设置为通用IO

P1SEL &= ~0xFF;

这行代码的意思就是把P1端口的每一个引脚都设置成通用IO

接下来把D3、D4、D5、D6全部设置成输出模式

P1DIR |= 0x1b;

通过PxDIR 端口方向寄存器得知,要让D3、D4、D5、D6设置成输出模式,得将其置1。如表:

P1_7P1_6P1_5P1_4P1_3P1_2P1_1P1_0
00011011

8个引脚刚好对应一个字节的二进制位,将其以上转换成十六进制则是0x1b

相或则是因为想不影响其它引脚工作,使其保持原来的状态:

P1_7P1_6P1_5P1_4P1_3P1_2P1_1P1_0
原来的状态01010110
| 想要置1的引脚00011011
结果01011111

黄色的是想要改变的引脚值,紫色是最开始其它引脚的状态值,可以看出通过 | 可以很好的解决这种情况。

 下面如果我们想让四个灯一开始进入程序就熄灭的状态,还需将其设置为低电平。(& 也是为了想要将某些引脚置0时不影响到其它引脚

P1 &= ~0x1b;

当然也可以换种写法:

P1_0 = 0;
P1_1 = 0;
P1_3 = 0;
P1_4 = 0;

都是对P1端口的引脚进行操作。

同理将4个引脚设置成高电平的代码则是:

P1DIR |= 0x1b;
P1_0 = 1;
P1_1 = 1;
P1_3 = 1;
P1_4 = 1;

实现案例

硬件清单:

 (左边是下载器,右边是开发板)

 接下来我们来编写代码将第一颗LED灯点亮吧!

 

(新建工程) 

(新建.c文件----Cltr+S进行保存) 

(将.c文件添加到工程中) 

(编译程序)

(配置下载器和开发板的型号)

(将程序下载到开发板)

 完整代码--(复制黏贴代码后将程序编译下载即可看到演示视频的效果):

#include <iocc2530.h>

void led_init()
{
  P1SEL &= ~0x1b;
  P1DIR |= 0x1b;
  P1 &= ~0x1b;
}
void Delay(int t)
{
  for(int i=0;i<t;i++)
  {
    for(int j=0;j<521;j++);
  }
}
int main()
{
  led_init();
  while(1)
  {
    P1 |= 0x1b;
    Delay(1000);
    P1 &= ~0x1b;
    Delay(1000);
  }
}

Delay()函数是起到一个延时效果(空执行),让灯亮一会再熄灭和让灯灭一会再亮起,这样子才会有下方视频的效果。

效果视频:

CC2530点灯展示视频

使用竞赛工程文件来实现:

竞赛工程文件提供了相关的函数,我们通过调用这些函数也可以实现相同的功能

(打开hal_led.c)

函数功能所需参数
halLedInit初始化板上四个LED的引脚


函数功能所需参数
halLedSet将其中某个LED的引脚置高电平1~4

函数功能所需参数
halLedClear将其中某个LED的引脚置高电平1~4

函数功能所需参数
halLedToggle将其中某个LED的引脚状态反转(原先高电平,那就置为低电平;原先低电平,那就置为高电平)

main.c 代码:

#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 <stdio.h>
#include <string.h>
#include <stdarg.h>

void Delay(int t)
{
  for(int i=0;i<t;i++)
  {
    for(int j=0;j<521;j++);
  }
}
/********************MAIN************************/
void main(void)
{
    halBoardInit();
    halLedInit();
    for(int i=1;i<=4;i++)
    {
      halLedClear(i);
    }
    while(1)
    {
      for(int i=1;i<=4;i++)
      {
        halLedSet(i);
      }
      Delay(1000);
      for(int i=1;i<=4;i++)
      {
        halLedClear(i);
      }
      Delay(1000);
    }
}

该代码实现效果与上面视频一致。

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曦&渊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值