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

[复制链接]
1947|35
 楼主| alternate 发表于 2020-1-5 17:39 | 显示全部楼层
上面的例子是控制1个引脚,下面的流水灯例子展示了同时控制3个引脚,其实大同小异:

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

  9. typedef unsigned char uchar;
  10. typedef unsigned int  uint;

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


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

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

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

  50. /****************************************************************************
  51. * 程序入口函数
  52. ****************************************************************************/
  53. void main(void)
  54. {
  55.     uchar i;
  56.    
  57.     InitLed();               //设置LED灯相关IO口
  58.    
  59.     while(1)                 //死循环
  60.     {  
  61.         LED1 = !LED1;         //流水灯,初始化时LED为熄灭执行后则点亮
  62.         DelayMS(200);         
  63.         LED2 = !LED2;         
  64.         DelayMS(200);            
  65.         LED3 = !LED3;        
  66.         DelayMS(200);     
  67.         
  68.         for (i=0; i<2; i++)  //所有灯闪烁2次
  69.         {
  70.            LedOnOrOff(1);    //关闭所有LED灯
  71.            DelayMS(200);
  72.            LedOnOrOff(0);    //打开所有LED灯
  73.            DelayMS(200);
  74.         }
  75.         
  76.         LedOnOrOff(1);       //使所有LED灯熄灭状态
  77.         DelayMS(500);
  78.     }
  79. }
 楼主| alternate 发表于 2020-1-5 17:39 | 显示全部楼层
9、按键控制LED亮灭(外部信号输入读取)

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

762425e11aed4a7b64.png
 楼主| alternate 发表于 2020-1-5 17:40 | 显示全部楼层
这里重点讲P01按键信号读取的设置:P0SEL将P01设置为通用IO:
847725e11af01d5d4a.png

  P0DIR将P01设置为输入模式:
766415e11af0d43e46.png

  P0INP打开P01上的上拉电阻:
398935e11af1a1fd50.png
 楼主| alternate 发表于 2020-1-5 17:41 | 显示全部楼层
这里读取一个引脚的状态,和读取51单片机一个引脚状态一样,比较简单~

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

  9. typedef unsigned char uchar;
  10. typedef unsigned int  uint;

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

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

  26. /****************************************************************************
  27. * 名    称: InitLed()
  28. * 功    能: 设置LED相应的IO口
  29. * 入口参数: 无
  30. * 出口参数: 无
  31. ****************************************************************************/
  32. void InitLed(void)
  33. {
  34.     P1DIR |= 0x01;      // P1.0定义为输出
  35.     LED1 = 1;           // LED1灯熄灭     
  36. }

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

  49. /****************************************************************************
  50. * 名    称: KeyScan()
  51. * 功    能: 读取按键状态
  52. * 入口参数: 无
  53. * 出口参数: 0为抬起   1为按键按下
  54. ****************************************************************************/
  55. uchar KeyScan(void)
  56. {
  57.     if (KEY1 == 0)
  58.     {
  59.         DelayMS(10);
  60.         if (KEY1 == 0)
  61.         {
  62.             while(!KEY1); //松手检测
  63.             return 1;     //有按键按下
  64.         }
  65.     }
  66.    
  67.     return 0;             //无按键按下
  68. }

  69. /****************************************************************************
  70. * 程序入口函数
  71. ****************************************************************************/
  72. void main(void)
  73. {
  74.     InitLed();              //设置LED1相应的IO口
  75.     InitKey();            //设置S1相应的IO口
  76.    
  77.     while(1)
  78.     {
  79.         if (KeyScan())    //按键按下则改变LED状态
  80.             LED1 = ~LED1;      
  81.     }
  82. }
 楼主| alternate 发表于 2020-1-5 17:41 | 显示全部楼层
小结

  本篇几乎把和IO相关的寄存器全部介绍完了,最后又介绍了简单的IO输入输出的控制,一个是流水灯,一个是按键读取,接下来会介绍IO的更多功能~
 楼主| 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
gwsan 发表于 2020-2-1 09:21 | 显示全部楼层
非常感谢楼主分享
kxsi 发表于 2020-2-1 09:34 | 显示全部楼层
非常感谢楼主分享
nawu 发表于 2020-2-1 09:38 | 显示全部楼层
非常感谢楼主分享
qcliu 发表于 2020-2-1 10:30 | 显示全部楼层
非常感谢楼主分享
tfqi 发表于 2020-2-1 10:35 | 显示全部楼层
非常感谢楼主分享
wiba 发表于 2020-2-1 10:39 | 显示全部楼层
非常感谢楼主分享
zljiu 发表于 2020-2-1 10:44 | 显示全部楼层
非常感谢楼主分享
coshi 发表于 2020-2-1 10:48 | 显示全部楼层
非常感谢楼主分享
aoyi 发表于 2020-2-1 10:57 | 显示全部楼层
非常感谢楼主分享
drer 发表于 2020-2-1 11:01 | 显示全部楼层
非常感谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部