打印
[Zigbee]

CC2530按键

[复制链接]
739|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gwsan|  楼主 | 2019-7-31 10:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1 理论分析
1.1 CC2530 通用 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 的驱动能力。

寄存器 PxSEL,其中 x 为端口的标号 0~2,用来设置端口的每个引脚为通用 I/O或者是外部设备 I/O 信号。作为缺省的情况,每当复位之后,所有的数字输入/输出引脚都设置为通用输入引脚。

在任何时候,要改变一个端口引脚的方向,就使用寄存器 PxDIR 来设置每个端口引脚为输入或输出。因此只要设置 PxDIR 中的指定位为 1,其对应的引脚口就被设置为输出了。

当读取端口寄存器 P0、P1 和 P2 的值,不管引脚配置如何,输入引脚上的逻辑值都被返回。这在执行读-修改-写指令期间不适用。读-修改-写指令是:ANL,ORL,XRL,JBC,CPL,INC,DEC,DJNZ,MOV,CLR 和 SETB。在一个端口寄存器上操作,以下是正确的:当目标是端口寄存器 P0、P1 或 P2 中一个独立的位,寄存器的值,而不是引脚上的值,被读取、修改并写回端口寄存器。

用作输入时,通用 I/O 端口引脚可以设置为上拉、下拉或三态操作模式。作为缺省的情况,复位之后,所有的端口均设置为带上拉的输入。要取消输入的上拉或下拉功能,就要将 PxINP 中的对应位设置为 1。I/O 端口引脚 P1.0 和 P1.1 没有上拉/下拉功能。

注意:配置为外设 I/O 信号的引脚没有上拉/下拉功能,即使外设功能是一个输入。在电源模式 PM1、PM2 和 PM3 下 I/O 引脚保留当进入 PM1/PM2/PM3 时设置的I/O 模式和输出值(如果可用的话)。


使用特权

评论回复

相关帖子

沙发
gwsan|  楼主 | 2019-7-31 10:37 | 只看该作者
1.2 流程图

下面是很实验的流程图,大家可以结合这个图来学习编写程序。


使用特权

评论回复
板凳
gwsan|  楼主 | 2019-7-31 10:37 | 只看该作者
2 实验详解
2.1实验目的
1)、通过实验掌握CC2530芯片GPIO的配置方法
2)、掌握Led驱动电路及开关Led的原理
3)、掌握检测按键的方法

2.2实验设备
硬件:PC 机一台 ZB2530(底板、核心板、仿真器、USB 线) 一套
软件:/win7 系统,IAR 8.20 集成开发环境

使用特权

评论回复
地板
gwsan|  楼主 | 2019-7-31 10:38 | 只看该作者
2.3实验相关电路图

图2 LED电路图

图3 按键电路图

按键S1接在P0_1上,当按键松开时,P0_1通过电阻上拉为高电平,当按键S1按下时, P0_1为低电平。


使用特权

评论回复
5
gwsan|  楼主 | 2019-7-31 10:41 | 只看该作者
2.4实验分析
本实验用到的通用 IO,只需要配置 PxSEL、PxDIR、PxINP 这三个寄存器,接下来对它们进行配置:
(1) 希望配置 P0.1 端口为:通用 IO、上拉、输入;
P1.0、P1.1、P0.4 端口为:通用 IO、输出;
(2)PxSEL、PxDIR、PxINP 这三个寄存器作用和配置方法如表1、2、3、4所示(以P1为例):

表1 端口1的功能选择


表2 端口1的方向


表3 端口1的输入模式


(3) 所以,按照表格寄存器的内容,对LED配置如下:
P1SEL &=~0x01; //配置P1.0为通用IO口,默认为0的,可以不设
P1DIR |= 0x01; //P10 定义为输出

按键S1配置如下:
P0SEL &= ~0X02; //设置P01为普通IO口
P0DIR &= ~0X02; //按键在P01 口,设置为输入模式
P0INP &= ~0x02; //打开P01上拉电阻,不影响


使用特权

评论回复
6
gwsan|  楼主 | 2019-7-31 10:42 | 只看该作者
2.5参考代码
/**Includes*********************************************************************/
#include <ioCC2530.h>

/**宏定义***********************************************************************/
//定义数据类型
#define uint unsigned int
#define uchar unsigned char

//定义控制LED灯的端口
#define LED1 P1_0        //LED1为P1.0口控制
#define KEY1 P0_1       //KEY1为P0.1口控制

/**函数声明*********************************************************************/
void Delayms(uint);                //延时函数
void InitLed(void);                //初始化LED1
void InitKey();                 //按键初始化
uchar KeyScan();                //按键扫描程序


/**
  * @brief     主函数
  * @param     None
  * @retval    None
  */
void main(void)
{
  InitLed();                //调用初始化函数
  InitKey();
  while(1)
  {
   if(KeyScan())       //按键改变LED状态
     LED1=~LED1;      
  }
}

/**
  * @brief     普通延时函数
  * @param     xms 延时长度
  * @retval    None
  */
void Delayms(uint xms)   //i=xms 即延时i毫秒
{
uint i,j;
for(i=xms;i>0;i--)
   for(j=587;j>0;j--);
}

/**
  * @brief     LED初始化
  * @param     None
  * @retval    None
  */
void InitLed(void)
{
    P1DIR |= 0x01;  //P1_0定义为输出
    LED1 = 1;       //LED1灯熄灭     
}

/**
  * @brief     按键初始化
  * @param     None
  * @retval    None
  */
void InitKey()
{
  P0SEL &= ~0X02;    //设置P01为普通IO口  
  P0DIR &= ~0X02;   //按键在P01 口,设置为输入模式
  P0INP &= ~0x02;   //打开P01上拉电阻,不影响
}

/**
  * @brief     按键检测函数
  * @param     None
  * @retval    uchar
  */
uchar KeyScan(void)
{
  if(KEY1==0)
  {
    Delayms(10);
    if(KEY1==0)
    {
      while(!KEY1);  //松手检测
      return 1;      //有按键按下
    }
  }
  return 0;          //无按键按下
}


使用特权

评论回复
7
gwsan|  楼主 | 2019-7-31 10:42 | 只看该作者
2.6实验现象
通过按键,改变LED的状态。

使用特权

评论回复
8
gwsan|  楼主 | 2019-7-31 10:42 | 只看该作者
2.7 实验总结
通过本实验,大家需要掌握以下 4 点:

        CC2530 通用 IO 使用需要配置相关寄存器;
        CC2530 通用 IO 寄存器的类型以及每个类型如何配置;
        除了两个高驱动输出口 P1.0 和 P1.1 各具备 20 mA 的输出驱动能力之外,所有的输出均具备 4 mA 的驱动能力;
        在任何时候,要改变一个端口引脚的方向,就使用寄存器 PxDIR 来设置每个端口引脚为输入或输出。因此只要设置 PxDIR 中的指定位为 1,其对应的引脚口就被设置为输出了。

使用特权

评论回复
9
conjunction| | 2019-7-31 14:09 | 只看该作者
感谢楼主分享!很不错的经验

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

69

主题

3434

帖子

1

粉丝