发新帖我要提问
12
返回列表
打印
[Zigbee]

3、ZigBee基础实验——GPIO输出控制实验-控制Led亮灭

[复制链接]
楼主: alternate
手机看帖
扫描二维码
随时随地手机跟帖
21
alternate|  楼主 | 2020-1-5 17:39 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
上面的例子是控制1个引脚,下面的流水灯例子展示了同时控制3个引脚,其实大同小异:

流水灯例子
/****************************************************************************
* 文 件 名: main.c
* 作    者: Andy
* 修    订: 2013-01-08
* 版    本: 1.0
* 描    述: 操作IO口控制3盏LED灯的全亮和全灭、闪烁、流水灯
****************************************************************************/
#include <ioCC2530.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

#define LED1 P1_0       //定义P1.0口为LED1控制端
#define LED2 P1_1       //定义P1.1口为LED2控制端
#define LED3 P1_4       //定义P1.4口为LED3控制端


/****************************************************************************
* 名    称: DelayMS()
* 功    能: 以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint msec)
{
    uint i,j;
   
    for (i=0; i<msec; i++)
        for (j=0; j<535; j++);
}

/****************************************************************************
* 名    称: LedOnOrOff()
* 功    能: 点亮或熄灭所有LED灯   
* 入口参数: mode为0时LED灯亮  mode为1时LED灯灭
* 出口参数: 无
****************************************************************************/
void LedOnOrOff(uchar mode)
{
    LED1 = mode;
    LED2 = mode;
    LED3 = mode; //由于P1.4与仿真器共用,必须拔掉仿真器的插头才能看到LED3的变化
}

/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
    P1DIR |= 0x13;      //P1.0、P1.1、P1.4定义为输出
    LedOnOrOff(1);      //使所有LED灯默认为熄灭状态
}

/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
    uchar i;
   
    InitLed();               //设置LED灯相关IO口
   
    while(1)                 //死循环
    {  
        LED1 = !LED1;         //流水灯,初始化时LED为熄灭执行后则点亮
        DelayMS(200);         
        LED2 = !LED2;         
        DelayMS(200);            
        LED3 = !LED3;        
        DelayMS(200);     
        
        for (i=0; i<2; i++)  //所有灯闪烁2次
        {
           LedOnOrOff(1);    //关闭所有LED灯
           DelayMS(200);
           LedOnOrOff(0);    //打开所有LED灯
           DelayMS(200);
        }
        
        LedOnOrOff(1);       //使所有LED灯熄灭状态
        DelayMS(500);
    }
}

使用特权

评论回复
22
alternate|  楼主 | 2020-1-5 17:39 | 只看该作者
9、按键控制LED亮灭(外部信号输入读取)

  外设电路图如下,P10低电平时LED亮,按键没有按下P01为高电平,按下为低电平:

使用特权

评论回复
23
alternate|  楼主 | 2020-1-5 17:40 | 只看该作者
这里重点讲P01按键信号读取的设置:P0SEL将P01设置为通用IO:


  P0DIR将P01设置为输入模式:


  P0INP打开P01上的上拉电阻:

使用特权

评论回复
24
alternate|  楼主 | 2020-1-5 17:41 | 只看该作者
这里读取一个引脚的状态,和读取51单片机一个引脚状态一样,比较简单~

/****************************************************************************
* 文 件 名: main.c
* 作    者: Andy
* 修    订: 2013-01-08
* 版    本: 1.0
* 描    述: 按下按键S1控制LED1灯亮和灭
****************************************************************************/
#include <ioCC2530.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

#define LED1 P1_0       // P1.0口控制LED1
#define KEY1 P0_1       // P0.1口控制S1

/****************************************************************************
* 名    称: DelayMS()
* 功    能: 以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint msec)
{
    uint i,j;
   
    for (i=0; i<msec; i++)
        for (j=0; j<535; j++);
}

/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
    P1DIR |= 0x01;      // P1.0定义为输出
    LED1 = 1;           // LED1灯熄灭     
}

/****************************************************************************
* 名    称: InitKey()
* 功    能: 设置按键相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitKey(void)
{
    P0SEL &= ~0x02;     //设置P0.1为普通IO口  
    P0DIR &= ~0x02;     //按键接在P0.1口上,设P0.1为输入模式
    P0INP &= ~0x02;     //打开P0.1上拉电阻
}

/****************************************************************************
* 名    称: KeyScan()
* 功    能: 读取按键状态
* 入口参数: 无
* 出口参数: 0为抬起   1为按键按下
****************************************************************************/
uchar KeyScan(void)
{
    if (KEY1 == 0)
    {
        DelayMS(10);
        if (KEY1 == 0)
        {
            while(!KEY1); //松手检测
            return 1;     //有按键按下
        }
    }
   
    return 0;             //无按键按下
}

/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
    InitLed();              //设置LED1相应的IO口
    InitKey();            //设置S1相应的IO口
   
    while(1)
    {
        if (KeyScan())    //按键按下则改变LED状态
            LED1 = ~LED1;      
    }
}

使用特权

评论回复
25
alternate|  楼主 | 2020-1-5 17:41 | 只看该作者
小结

  本篇几乎把和IO相关的寄存器全部介绍完了,最后又介绍了简单的IO输入输出的控制,一个是流水灯,一个是按键读取,接下来会介绍IO的更多功能~

使用特权

评论回复
26
alternate|  楼主 | 2020-1-5 17:42 | 只看该作者
系列:

[ZigBee] 1、 ZigBee简介   https://bbs.21ic.com/icview-2894000-1-1.html

[ZigBee] 2、 ZigBee开发环境搭建   https://bbs.21ic.com/icview-2894002-1-1.html

使用特权

评论回复
27
gwsan| | 2020-2-1 09:21 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
28
kxsi| | 2020-2-1 09:34 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
29
nawu| | 2020-2-1 09:38 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
30
qcliu| | 2020-2-1 10:30 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
31
tfqi| | 2020-2-1 10:35 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
32
wiba| | 2020-2-1 10:39 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
33
zljiu| | 2020-2-1 10:44 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
34
coshi| | 2020-2-1 10:48 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
35
aoyi| | 2020-2-1 10:57 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
36
drer| | 2020-2-1 11:01 | 只看该作者
非常感谢楼主分享

使用特权

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

本版积分规则