电路图
首先,要想点亮LED灯,那就必须了解开发板上led所对应的引脚,最直接的方法就是看电路图(这边所使用的是物联网技能大赛对应的ZigBee开发板,若用其它板子得对引脚和代码进行更替):
如图可以看出led灯的引脚分别对应到
D3 | P1_0 |
D4 | P1_1 |
D5 | P1_3 |
D6 | P1_4 |
了解了led灯对应的引脚,再来看看两个重要的寄存器
PxSEL 端口功能寄存器
位 | 位名称 | 复位值 | 操作 | 描述 |
7:0 | SELPx[7:0] | 0x00 | R/W | 设置 Px_7 到 Px_0 端口的功能。 0:对应端口被设置为通用 I/O 功能。 1:对应端口被设置为外设功能。 |
PxDIR 端口方向寄存器
位 | 位名称 | 复位值 | 操作 | 描述 |
7:0 | DIRPx[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_7 | P1_6 | P1_5 | P1_4 | P1_3 | P1_2 | P1_1 | P1_0 |
0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 |
8个引脚刚好对应一个字节的二进制位,将其以上转换成十六进制则是0x1b
相或则是因为想不影响其它引脚工作,使其保持原来的状态:
P1_7 | P1_6 | P1_5 | P1_4 | P1_3 | P1_2 | P1_1 | P1_0 | |
原来的状态 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 |
| 想要置1的引脚 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 |
结果 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
黄色的是想要改变的引脚值,紫色是最开始其它引脚的状态值,可以看出通过 | 可以很好的解决这种情况。
下面如果我们想让四个灯一开始进入程序就熄灭的状态,还需将其设置为低电平。(& 也是为了想要将某些引脚置0时不影响到其它引脚)
P1 &= ~0x1b;
当然也可以换种写法:
P1_0 = 0; P1_1 = 0; P1_3 = 0; P1_4 = 0;
都是对P1端口的引脚进行操作。
同理将4个引脚设置成高电平的代码则是:
| |
实现案例
硬件清单:
(左边是下载器,右边是开发板)
接下来我们来编写代码将第一颗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);
}
}
该代码实现效果与上面视频一致。