Zigbee学习日记(三) 肆无忌惮控制IO口
goJhou 发布于2017-12 浏览:3106 回复:3
5
收藏

为了能更得心应手的让CC2530听话,必须学会如何肆无忌惮,自如地去控制每个IO口的引脚。

IO口一共工作在两个模式下,一个是普通IO口模式、另一个是片上外设模式

普通IO口,由软件控制高低电平变化

片上外设,将变化交由外接设备控制

在CC2530标准的40脚芯片上,P1_0、P1_1具备有20mAh的驱动力,其余只有5mAh,需要知晓

 

CC2530 40脚版本,P0组有8个脚,P1组有8个脚,P2组有5个脚

 

以第2期的点亮LED1为栗,我们如何让一颗LED1点亮需要如下3步

  1. 令P1_0处于普通IO口模式
  2. 令P1_0处于输出状态
  3. 将P1_0设为低电平

针对引脚工作模式,我们有P0SEL,P1SEL,P2SEL 这三个寄存器来管理P0的IO组,P1的IO组,P2的IO组

 

P0SEL与P1SEL从低到高总共有8位,分别控制P0和P1的各8个引脚

P2SEL针对只保存低3位,分别是P2_0,P2_3,P2_4的模式。  因为P2_1,P2_2是下载程序时使用的脚,不允许更改工作模式。高5位有其他用途

在这三个SEL寄存器控制IO口的几位,0表示普通IO模式,1表示片上外设

 

P0DIR、P1DIR、P2DIR三个寄存器控制IO引脚是输入状态还是输出状态。

 

同样的,P2DIR比较特殊,低5位管理P2DIR的5个引脚,这里包含了P2_1,P2_2,需要注意一下。 P2DIR第6位是未使用的位 高2位有其他用途

 

所以默认的最标准的点亮LED1的做法如下

 

void main()
{
P1SEL &= 0xFE;//1111 1110 将P1_0的位给0,以将该IO口模式设置为普通IO口模式。

P1DIR |= 0x01;//0000 0001 将P1_0的位给1,以将该IO口状态设置成输出状态

P1_0 = 0; //设置低电平

while(1);
}

 

如何将IO口设置成输入状态工作

根据输入状态来变化LED的亮暗,也是一种常用的现象。

在P0_4这个引脚上有一颗LED0.而我的底板上,P0_6和GND接有一个跳线帽。

通过对P0_6进行相应设置去影响P0_4

P0SEL &= 0xBF;//1011 1111 普通IO口

P0DIR &= 0xBF;//1011 1111 输入状态

在将IO口设置成输入状态之后,我们需要指定IO口的输入模式。总共有上拉输入、下拉输入、三态输入 3个输入模式类型

上拉就是要接到电源正极,有时候可以直接接到电源正极,有时候需要通过电阻接到电源正极。也意味着默认是从VCC接过来的,如果没接地,默认是高电平

下拉就是接地。

三态就是导通,截止,高阻,高阻就是电阻变得特别大。

这输入模式也有一组寄存器来控制。为P0INP、P1INP、P2INP来控制。

P0INP、P1INP控制P0,P1组各8个引脚的输入模式。 

P2INP的低5位表示P2_0~P2_4的5个引脚的输入模式。0为上拉或下拉  1为三态

P2INP的高3位从低到高依次表示P0组、P1组、P2组是上拉还是下拉。0为上拉、1为下拉,仅影响P0INP、P1INP为0的IO脚

P0INP &= 0xBF; //让P0_6处于上下拉模式
P2INP |= 0xDF; //让P0组处于上拉模式   至于用什么模式要根据物理电路来使用


//P0_4输出状态 这个脚是个LED
P0SEL &= 0xEF;//1110 1111 普通IO
P0DIR |= 0x10;//0001 0000 输出
while(1)
{
  if(1 == P0_6) //当P0_6处于高电平时
{
P0_4=0; //点亮LED
}else
{
P0_4=1; //熄灭LED
}
}

之后将跳线帽从P0_6和GND之间拔掉,LED点亮。插上跳线帽 LED灭。

 

默认所有寄存器在上电时所有位都是0.所以有时候针对寄存器某些位对0的设置可以忽略。但是最好写上,以保证寄存器正确。

收藏
点赞
5
个赞
共3条回复 最后由goJhou回复于2019-04
#5goJhou回复于2019-04
#3 独孤焰坤回复
 #2周俊316回复于4小时前 手动点赞

你牛逼。。。

0
#3独孤焰坤回复于2017-12


 #2周俊316回复于4小时前
手动点赞

0
#2周俊316回复于2017-12

手动点赞

0
TOP
切换版块