CC2530只具备QFN40封装 工作范围:2~3.6V(推荐选3.3V)

一共有21个通用IO口,其中这21个分为3组P0\P1\P2; 其中P0\P1组各8个IO,P2组5个(P2_0、P2_1、 P2_2、P2_3、 P2_4)。

这些口子都可以作为普通或对应的片上外设控制。

其中P1_0 P1_1有20mA的输出驱动能力,其余的只有4mA

PxSEL、PxDIR、PxINP Px(x分别对应0、1、2,用来控制对应的IO口组)3种寄存器;复位、默认都是0

PxSEL寄存器

PxSEL寄存器作用: 有8位,每一位对应具体的IO组中的相应的一个IO,决定它是普通IO口还是片上外设,0表示普通IO口,1表示片上外设。

PxDIR寄存器

PxDIR寄存器作用: 有8位,每一位对应具体的IO组中的相应的一个IO,决定它是输入还是输出,0表示输入,1表示输出。

特别注意:其中P2组只有5个IO口,低五位也对应P2_0 … P2_4 后面的位不用管。

PxINP寄存器

PxINP寄存器作用: 在输入的时候,8位,每一位对应具体的IO组中的相应的一个IO,决定它是上下拉模式还是三态,0表示上下拉模式,1表示三态。

特别注意:其中P2组只有5个IO口,低五位也对应P2_0 … P2_4 ,后面的3位决定在配置为上下拉模式的时候,组为上拉 还是下拉,0表示上拉,1表示下拉。

EA

总CPU开关中断,令其为1则为开关闭合

PxIE

组使能位,控制PxIEN

注意:可以直接令P0IE=1,若要设置P1IE为1,则令IEN2 |=0x10;相当于P1IE=1

PxIEN

对应的中断使能标志位,使用方法:PxIEN |= 0x__;为1则为闭合

PICTL寄存器

0代表上升沿,1代表下降沿。

PxIFG

中断状态标志寄存器, 当发生中断时,相应位将被置1

中断函数

pragma vector=PxINT_VECTOR(x=0,1,2)

pragma vector=PxINT_VECTOR(x=0,1,2)
__interrupt  void  fn()
{
PxIFG=0; PxIF=0;
}

函数最后需要将PxIFG和PxIF清零。

最后附上一段能够按按钮控制灯亮灭的代码

#include <iocc2530.h>
void delay()
{
   int i,j;
   for(i=0;i<1000;i++)
     for(j=0;j<30;j++);
}

void main()
{ 
  P0SEL &=0xDF;// 1101 1111 //P0_5设置为普通IO口
  P0DIR &=0xDF;// 1101 1111 //P0_5设置为输入
  P0INP &=0xDF;// 1101 1111 //P0_5设置为上下拉模式
  P2INP &=0xDF;// 1101 1111 //P0组配置成上拉模式
  
  EA=1;//闭合总CPU
  P0IE=1;//P1IE如果要设置为1,那么我们不能直接用P1IE=1,IEN2 |=0x10;// 0001 0000
  //IEN2 |=0x10;//相当于P1IE=1
  P0IEN |=0X20;// 0010 0000 设置3个中断使能标志位,让相应的中断开关合上
  
  PICTL |=0x01;//把P0这一组配置成下降沿触发//PICTL |=0x02则为把P1组配置成下降沿
  
  P1DIR |=0X01;//配置P1_0位输出
  while(1);//死循环,不结束函数
}
#pragma optimize=none
#pragma vector=P0INT_VECTOR
__interrupt void fsdfas()
{
    if(P0IFG & 0x20)// 0010 0000
    {//P0组的第5位 P0_5引发了外部中断
        delay();
        if(0==P0_5)
        {//说明确实是连接在P0_5的按钮触发了外部中断
           P1_0 ^=1;//异或操作
        }
    }
    P0IFG=0; 
    P0IF=0;
}