zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    go标准库的学习-net/http
    go标准库的学习-sync互斥
    sqlplus命令大全
    Oracle 11g安装步骤详谈
    安装64位版Oracle11gR2后无法启动SQLDeveloper的解决方案(原创) (2016-10-29 下午01:56)
    Dos命令查看端口占用及关闭进程
    access denied ("java.net.SocketPermission" "localhost:1527" "listen,resolve")
    Hibernate的集合映射与sort、order-by属性
    Hibernate总结2 API和配置文件
    MyEclipse8.5启动无法选择工作空间的问题
  • 原文地址:https://www.cnblogs.com/yuling520/p/12669680.html
Copyright © 2011-2022 走看看