CC2530 GPIO 控制LED灯

GPIO简介

        I/O 也称为 General Purpose Input Output (通用输入/输出)简称为 GPIO、 I/O,是单片机通用输入输出接口的总称。通常情况下单片机的计算单元通过向 I/O 控制寄存器写入数据可以控制 I/O 口输入输出模式,实现对某些设备的控制或信号采集的功能。若将通用 I/O 进行组合配置可以实现较为复杂的总线控制接口和串行通信接口。

        CC2530 的 I/O 用作通用 I/O 时,引脚可以组成 3 个 8 位端口,端口 0、端口 1 和端口 2,表示为P0、 P1 和 P2。其中, P0 和 P1 是完全的 8 位端口,而 P2 仅有 5 位可用。所有的端口均可以通过 SFR寄存器 P0、 P1 和 P2 位寻址和字节寻址。每个端口引脚都可以单独设置为通用 I/O 或外部设备 I/O。


寄存器介绍

CC2530的通用I/O端口相关的常用寄存器有下面4个:

(x表示端口)

PxSEL:端口功能选择,设置端口是通用I/O还是外设功能

 PxDIR:作为通用I/O时,用来设置数据的传输方向。

PxINP:作为通用输入端口时,选择输入模式是上拉下拉还是三态

 Px:数据端口,用来控制端口的输出或获取端口的输入。

C语言对寄存器位操作

1.某些位清0而不影响其他位

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

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

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

 正确写法:P0SEL &= ~0x2A;

对于寄存器的第n位的清0操作也可以写成:寄存器 &= ~(0x01<<(n));其道理是一样的。

2.某些位置1而不影响其他位

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

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

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

正确写法:P1SEL |= 0x32;

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

通用I/O端口寄存器配置的基本思路

(LED灯接在P1_0、P1_1)

设置P0SEL寄存器,将P1_0、P1_1设置为通用I/O端口。

设置P0DIR寄存器,将P1_0和P1_1设置为输出。

设置I/O输出高电平或者低电平(0点亮/1熄灭)

代码实现

void LED_init(void)
{
   P1SEL&= ~(0x03<<0);      //设置P1_0,P1_1为通用I/O
   P1DIR |= (0x03<<0);      //设置P1.0 P1.1为输出
   P1_0=0;                  //P1_0点亮
   P1_1=1;                  //P1_1熄灭
}

主函数调用LED_init()函数就可以实现点亮灯。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值