zigbee通用IO口小作业

独立新建工程并编写、编译代码,实现按键控制流水灯运行,完成以下任务要求:
【1】程序开始运行时,D4、D3、D6、D5灯全亮一会,然后全灭一会,开始进入流水灯。
【2】流水灯的运行过程为:D4灯亮,其余熄灭,过一会,D3灯亮,其余熄灭,过一会,D6灯亮,其余熄灭,过一会,D5灯亮,其余熄灭,过一会…如此反复运行流水灯。
【3】按下SW1按键松开后,流水灯暂停保留当前状态;再一次SW1按键松开后,从当前状态保留处继续运行流水灯,在按下SW1按键时,不能打断流水灯的运行

解题思路:

首先需要确定所用的引脚,延时函数的编写和端口IO的初始化。

第一步骤可以写在主函数中加上延时函数实现,之后需要写一个标志位判断是否开启流水灯的运行。

第二步骤需要定义一个时间片,通过时间片的计时实现流水灯的闪烁。用一个简单的if……else if……else 完成流水灯的操作。最后记得要把计数的标志位清零。

 

第三步骤为按键扫描函数。首先需要延时去抖。当有按键的信号时候,通过判断流水灯是否在运行,当在运行时,按下则暂停流水灯;当暂停的时候,按下则开启流水灯。最终要一点就是在按键按下的时候,不打断流水灯的运行。

Tip:

while(1)其中1代表一个常量表达式,它永远不会等于0。循环会一直执行下去。除非你设置break等类似的跳出循环语句循环才会中止。

  1 #include "ioCC2530.h"
  2 
  3 #define D3  P1_0
  4 #define D4  P1_1
  5 #define D5  P1_3
  6 #define D6  P1_4
  7 #define SW1 P1_2
  8 
  9 unsigned char F_LED = 0;    //流水灯运行标志
 10 unsigned int count = 0;     //时间片计数
 11 
 12 
 13 /*=======================简单的延时函数========================*/
 14 void Delay(unsigned int t)
 15 {
 16   while(t--);
 17 }
 18 /*=======================端口初始化函数========================*/
 19 void Init_Port()
 20 {
 21   P1SEL &= ~0x1b;         //将P1_0,P1_1,P1_3,P1_4设置为通用I/O端口  0001 1011->1110 0100 普通IO  
 22   P1DIR |= 0x1b;          //将P1_0,P1_1,P1_3,P1_4设置为输出方向    0001 1011  输出
 23   P1 &= ~0x1b;            //关闭4个LED灯   1110 0100  四个端口为低电平
 24   
 25   P1SEL &= ~0x04;         //将P1_2设置为通用I/O端口  0000 0100->1111 1011 普通IO
 26   P1DIR &= ~0x04;         //将P1_2设置为输入方向   1111 1011  0位输入
 27   P1INP &= ~0x04;         //将P1_2设置为上拉/下拉   1111 1011  P1_2   0位上下拉
 28   P2INP &= ~0x40;         //将P1_2设置为上拉    0100 0000—>1011 1111  第七位为端口1的选择
 29 }
 30 
 31 
 32 
 33 /*=======================流水灯控制函数========================*/
 34 void LED_Running()
 35 {
 36   Delay(100);             //定义时间片
 37   if(F_LED == 1)          //如果处于运行状态,则累加时间片
 38   {
 39     count++;
 40   }
 41   if(count < 1000)        //根据时间进行流水变换
 42   {
 43     D4 = 1;          D3 = 0;          D6 = 0;           D5 = 0;
 44   }
 45   else if(count < 2000)
 46   {
 47     D4 = 0;          D3 = 1;          D6 = 0;           D5 = 0;
 48   }
 49   else if(count < 3000)
 50   {
 51     D4 = 0;          D3 = 0;          D6 = 1;           D5 = 0;
 52   }
 53   else if(count < 4000)
 54   {
 55     D4 = 0;          D3 = 0;          D6 = 0;           D5 = 1;
 56   }
 57   else
 58   {
 59     count = 0;              //流水周期结束,时间片计数清零
 60   }
 61 }
 62 
 63 
 64 /*=======================按键扫描函数=========================*/
 65 void Scan_Keys()
 66 {
 67   if(SW1 == 0)            //发现有SW1按键信号
 68   {
 69     Delay(100);           //延时片刻,去抖动处理
 70     if(SW1 == 0)          //确认为SW1按键信号
 71     {
 72       while(SW1 == 0)
 73       {
 74         LED_Running();    //在按键按下时,不打断流水灯运行
 75       }
 76       if(F_LED == 0)
 77       {
 78         F_LED = 1;        //流水灯运行标志
 79       }
 80        else if(F_LED == 1)
 81       {
 82         F_LED = 0;        //流水灯暂停标志
 83       }
 84     }
 85   }       
 86 }
 87 
 88 
 89 /*==========================主函数============================*/
 90 void main()
 91 {
 92   Init_Port();            //端口初始化
 93   D4 = 1;                 //全亮
 94   D3 = 1;          
 95   D6 = 1;           
 96   D5 = 1;
 97   Delay(60000); 
 98   D4 = 0;                 //全灭
 99   D3 = 0;          
100   D6 = 0;           
101   D5 = 0; 
102   Delay(60000); 
103   F_LED = 1;              //开启流水灯运行
104   while(1)
105   {
106     Scan_Keys();          //按键扫描
107     LED_Running();        //流水灯运行
108   }
109 }
View Code
原文地址:https://www.cnblogs.com/yuling520/p/12669680.html