一.cc2330 IO端口
(一)io介绍
CC2530有21个数字输入/输出引脚,可以配置为通用数字I/O或外设I/O信号,配置为连接到ADC、定时器或USART外伤。这些I/O的用途可以通过一系列寄存器配置,由用户程序加以实现。
(二)IO 特性
I/O端口具备如下重要特性:
21个数字I/O引脚
可以配置为通用I/O或外部设备I/O
输入口具备上拉或下拉能力
具有外部中断能力
TIP:21个I/O引脚都可以用作于外部中断源入口。因此如果需要外部设备可以产生中断,外部中断功能也可以从睡眠模式唤醒设备。
(三)IO引脚
由电路图可以得知一共有51个可用IO端口,当用作通用I/O 时,引脚可以组成3 个8 位端口,端口0、端口1 和端口2,表示为P0、P1 和P2。其中,P0和P1 是完全的8 位端口,而P2 仅有5 位可用。所有的端口均可以通过SFR 寄存器P0、P1 和P2 位寻址和字节寻址。每个端口引脚都可以单独设置通用I/O 或外部设备I/O。除了两个高驱动输出口P1.0 和P1.1 各具备20 mA 的输出驱动能力之外,所有的输出均具备4 mA 的驱动
能力。
二.LED灯IO寄存器及其理解
TIP:我们的2530 LED分布在P1端口
如果我们需要通过代码控制LED的亮灭 那么我们就要通过代码将cc2530的寄存器功能设置为 普通IO口 且 配置为输出,下面我们讲解如何认识这两个寄存器
(一)寄存器PxSEL,其中x 为端口的标号0~2,用来设置端口的每个引脚为通用I/O 或者是外部设备I/O 信号。(这个寄存器控制端口功能 在下面我们叫其功能寄存器)
因为我们的灯在P1的IO口,所以我在这里只对P1端口进行讲解,如果存在其他疑问请发邮件联系,邮箱468078841@qq.com
1.我们要控制LED灯的闪烁就必须要将其设置为普通的IO口,
配置寄存器的方法:
将功能寄存器第一位端口1值0 P1SEL & = ~0x02;
解释:**0x02为16进制 将其转为二进制表示为 0000 0010 取反后为 1111 1101 (这里的二进制高低位分别对应上面表格的端口0到端口七) 这时候我们由于不知道P1SEL端口是处于什么状态 这时候我们只知道在这里我是要将P1.1为普通IO口 也就是第二位值0 这时候为了避免引起不必要的错误 我们选用&=学过C语言的都知道 1&任何数为任何数, 0&任何数为0 ,我们在这里可以保证 我们的代码P1SEL & = ~0x02只对第二位进行了操作改变
练习 : 将P1.3 P1.2 P1.1 P1.0设置为通用口
首先我们要提前取反 0000 1111 等于16 进制0x0F
P1SEL &= ~0x0F
取反是因为我比较菜 前几位方便运算 个人习惯 不喜勿喷
significant:**在这里我们要理解八位二进制与P1处八个端口的映射对应关系,了解这个才可以保证以后学会其他寄存器操作。
(2)在任何时候,要改变一个端口引脚的方向,就使用寄存器PxDIR 来设置每个端口引脚为输入或输出。因此只要设置PxDIR 中的指定位为1,其对应的引脚口就被设置为输出了。(这个寄存器控制端口的输入输出在下面我们叫其输入输出寄存器)
1.我们要控制LED灯的闪烁就必须要将其设置为输出,
在前面我们已经知道如何见P1SEL如何设置了 在这里,我们就不提这里了 但是为了加强练习 我在这里设置几个小问题,希望可以独立完成
(1)端口1设置为输出口
P1DIR |= 0x01;
在这里我用 |= 运算符是因为我们需要将这一位设置为1 1或上任何数为1 0或上任何数 为任何数,
(2)端口2和端口1一起设置为输出模式
P1DIR |= 0x06;
三.实战操作点亮LED灯
在上面我们已经知道了如何将端口设置为可以点亮LED灯的步骤 在这里我将讲述如何控制LED灯的亮灭
(一)了解端口
这个为我们的LED灯端口电路图,接下来的基础实验我也都会以这个电路图为模板写下去,
我们可以看到 这是一个二极管 当P1.1 P1.2,P1.3为低电平时灯就可以闪烁 在代码中 如果我们已经设置好之后 我们可以直接令端口等于0 则点亮 为1 则熄灭
(二)实战演示
题目要求,将D4,D2,D3,初始时全部熄灭,然后依次闪烁
#include "ioCC2530.h" //引入头文件 类似C语言 #include"stdio.h"
#define D4 P1_0 //宏 定义引脚为端口 方便记忆
#define D2 P1_1
#define D3 P1_2
void LED_INIT(void); //函数申明 这里建议书写规范
void delay(unsigned int time);
void delay(unsigned int time) //延时函数 这里是为了让程序多执行几次for循环 让函数延时
{
for(unsigned char j = 0; j < time;j++)
{
for(unsigned int i = 0; i < time; i++)
{
}
}
}
void LED_INIT(void) //LED初始化函数
{
P1SEL &= ~0x07; // P1SEL &= ~(0000 0111)P1SEL &= (1111 1000)
P1DIR |= 0x07;
P1 = 0x07;
}
void main(void)
{
LED_INIT(); //初始化
while(1)
{
D4 = 0; //D4亮
delay(100);
D4 = 1; //D4灭
D2 = 0;
delay(100);
D2 = 1;
D3 = 0;
delay(100);
D3 = 1;
}
}
余呆呆java基础点击
zigbee菜鸟笔记(四)基础实验检测按键输入点击