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;
}
若没有本文 Issue,您可以使用 Comment 模版新建。
GitHub Issues