CC2530 IO 口配置我们需要配置三个寄存器 P1SEL P1DIR P1INP功能如下表所示: (详细参考 CC2530 datasheet.pdf

* P1SEL (0:普通 IO 1:第二功能)

* P1DIR (0:输入 1:输出 )
* P1INP (0:上拉/下拉 1:三态 )

按照表格寄存器内容,我们对 LED1 和按键 S1,也就是 P1.0 P0.0 口进行配置,

P1.0 输出高电平时 LED1 被点亮,S1 按下时 P0.0 被拉低。所以配置如下:
LED1 初始化:

1 P1SEL &=~0x01; //作为普通 IO 口
2 P1DIR |= 0x01; //P1_0 定义为输出
3 P1INP |= 0X01; //打开下拉

按键 S1 初始化:

1 P0SEL &= ~0X01; //设置 P00 为普通 IO 口
2 P0DIR &= ~0X01; //按键在 P00 口,设置为输入模式
3 P0INP &= ~0x01; //打开 P00 上拉电阻,不影响

由于 CC2530 寄存器初始化时默认是:

P1SEL = 0x00;
P1DIR = 0x00 ;
P1INP = 0X00;

所以 IO 口初始化我们可以简化初始化指令:

1 P1DIR |= 0x01; //P1_0 定义为输出
2 P1INP |= 0X01; //打开下拉
3 P0DIR &= ~0X10; //按键在 P00 口,设置为输入模式 

实例程序源代码:

 1 /**************************************
 2 程序描述:依次按下按键 S1 控制 LED1 的亮和灭
 3 **************************************/
 4 #include <ioCC2530.h>
 5 #define uint unsigned int
 6 #define uchar unsigned char
 7 //定义控制 LED 灯的端口
 8 #define LED1 P1_0 //LED1 为 P1.0 口控制
 9 #define KEY1 P0_0 //KEY1 为 P0.0 口控制
10 //函数声明
11 void Delayms(uint); //延时函数
12 void InitLed(void); //初始化 LED1
13 void KeyInit(); //按键初始化
14 uchar KeyScan(); //按键扫描程序
15 /****************************
16 延时函数
17 *****************************/
18 void Delayms(uint xms) //i=xms 即延时 i 毫秒
19 {
20     uint I,j;
21     for(i=xms;i>0;i--)
22         for(j=587;j>0;j--);45
23 }
24 /****************************
25 LED 初始化函数
26 *****************************/
27 void InitLed(void)
28 {
29     P1DIR |= 0x01; //P1_0 定义为输出
30     P1INP |= 0X01; //打开下拉
31     LED1 = 0; //LED1 灯熄灭
32 }
33 /****************************
34 按键初始化函数
35 *****************************/
36 void InitKey()
37 {
38     P0SEL &= ~0X01; //设置 P00 为普通 IO 口
39     P0DIR &= ~0X01; //按键在 P00 口,设置为输入模式
40     P0INP &= ~0x01; //打开 P00 上拉电阻,不影响
41 }
42 /****************************
43 按键检测函数
44 *****************************/
45 uchar KeyScan(void)
46 {
47     if(KEY1==0)
48     { 
49         Delayms(10); //去抖动
50             if(KEY1==0)
51             {
52                 while(!KEY1); //松手检测46
53                 return 1; //有按键按下
54             }
55             return 0; //无按键按下
56     }
57 }
58 /***************************
59 主函数
60 ***************************/
61 void main(void)
62 {
63     InitLed(); //调用初始化函数
64     InitKey();
65     while(1)
66     {
67         if(KeyScan()) //按键改变 LED 状态
68         LED1=~LED1;
69     }
70 }                   

我的板子上有2两个按键:

#include<ioCC2530.h>

#define LED1 P1_0    //定义P10口为LED1控制端
#define LED2 P1_1    //定义P11口为LED2控制端
#define LED3 P1_4    //定义P14口为LED3控制端

#define KEY1 P0_1    
#define KEY2 P2_0
void IO_Init(void)
{
  
  /*
  P1SEL (0:普通 IO 口 1:第二功能)
  P1DIR (0:输入 1:输出 )
  P1INP (0:上拉/下拉 1:三态 )
  */
  P1SEL &= ~0x13;
  P0SEL &= ~0x02;
  P2SEL &= ~0x01;
  
  //P1DIR |= 0x01;     //P1_0定义为输出
  P1DIR |= 0x13;  //P10、P11、P14定义为输出
  
  P0DIR &= ~0x02;
  P2DIR &= ~0x01;//P01,P20定义为输入
  
  
  P1INP &= ~0X13;     //打开下拉
  P0INP &= ~0X02;     //打开下拉
  P2INP &= ~0X01;     //打开下拉
  
  
  LED1 = 1;       //关闭LED1
  LED2 = 1;       //关闭LED2
  LED3 = 1;       //关闭LED3
 
}

void main(void)
{   
    IO_Init();      //调用初始化程序
   
    while(1)
    {
      if(KEY1 == 0)
      {
        LED1 = !LED1;
        while(!KEY1);
      }
      if(KEY2 == 0)
      {
        LED2 = !LED2;
        while(!KEY2);
      }
    }
}

 

版权声明:本文为tianxxl原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/tianxxl/p/9867096.html