zoukankan      html  css  js  c++  java
  • CC2530定时器的应用

    【例1】利用定时器计数实现5中彩灯的变化形式,基于模模式的。两个标志位,一个是定时器计数,一个是彩灯的状态。

      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 
      8 unsigned char count = 0;      //长定时累计变量
      9 unsigned char led_stat = 0;   //彩灯状态标志
     10 
     11 /*=======================简单的延时函数========================*/
     12 void Delay(unsigned int t)
     13 {
     14   while(t--);
     15 }
     16 
     17 /*======================端口初始化函数========================*/
     18 void Init_Port()
     19 {
     20   P1SEL &= ~0x1b;    //P1_0、P1_1、P1_3和P1_4作为通用I/O端口
     21   P1DIR |= 0x1b;      //P1_0、P1_1、P1_3和P1_4端口输出
     22   
     23   D3 = 0;          
     24   D4 = 0;          
     25   D5 = 0;           
     26   D6 = 0;  //P1 &= ~0x1b   0001 1011->1110 0100 或者P1 &= 0xe4
     27 }
     28 
     29 /*=====================定时器1初始化函数======================*/
     30 void Init_Timer1()
     31 {
     32   T1CC0L = 0xd4;    //16MHz时钟128分频定时100ms
     33   T1CC0H = 0x30;    //设先填低8位,再填高8位
     34   T1CCTL0 |= 0x04;  //开启通道0的输出比较模式
     35   T1IE = 1;         //使能定时器1中断
     36   T1OVFIM = 1;      //使能定时器1溢出中断
     37   EA = 1;           //使能总中断
     38   T1CTL = 0x0e;     //分频系数是128,模模式
     39 }
     40 
     41 /*====================定时器1中断服务函数=====================*/
     42 #pragma vector = T1_VECTOR
     43 __interrupt void Timer1_Sevice()
     44 {
     45   T1STAT &= ~0x01;      //清除定时器1通道0中断标志
     46   count++;              //累加定时周期  定时器计数
     47   
     48   if(count == 50)       //定时5秒时间到
     49   {
     50     count = 0;
     51     led_stat++;
     52     if(led_stat == 5)    //设置了5种(0-4)彩灯变化方式
     53     {
     54       led_stat = 0;
     55     }
     56   }
     57 }
     58 
     59 /*=====================彩灯变换控制函数=======================*/
     60 void LED_Control()
     61 {
     62   switch(led_stat)
     63   {
     64     case 0:             //彩灯花式1   LED3闪烁
     65       D3 = ~D3;
     66       Delay(60000);
     67     break;
     68     case 1:             //彩灯花式2  1010—>0101
     69       D3 = 1;
     70       D4 = 0;
     71       D5 = 1;
     72       D6 = 0;
     73       Delay(60000);
     74       D3 = 0;
     75       D4 = 1;
     76       D5 = 0;
     77       D6 = 1;
     78       Delay(60000);
     79     break;
     80     case 2:             //彩灯花式3   依次点亮依次熄灭
     81       D3 = 1;
     82       Delay(60000);
     83       D4 = 1;
     84       Delay(60000);
     85       D5 = 1;
     86       Delay(60000);
     87       D6 = 1;
     88       Delay(60000);
     89       D3 = 0;
     90       Delay(60000);
     91       D4 = 0;
     92       Delay(60000);
     93       D5 = 0;
     94       Delay(60000);
     95       D6 = 0;
     96       Delay(60000);
     97     break;
     98     case 3:               //彩灯花式4 LED6闪烁
     99       D6 = ~D6;
    100       Delay(60000);
    101     break;
    102     case 4:               //彩灯花式5 依次点亮反向熄灭
    103       D3 = 1;
    104       Delay(60000);
    105       D4 = 1;
    106       Delay(60000);
    107       D5 = 1;
    108       Delay(60000);
    109       D6 = 1;
    110       Delay(60000);
    111       D6 = 0;
    112       Delay(60000);
    113       D5 = 0;
    114       Delay(60000);
    115       D4 = 0;
    116       Delay(60000);
    117       D3 = 0;
    118       Delay(60000);
    119     break;
    120   }
    121 }
    122 
    123 /*==========================主函数============================*/
    124 void main()
    125 {
    126   Init_Port();        //端口初始化
    127   Init_Timer1();       //初始化定时器1
    128   while(1)
    129   {
    130     LED_Control();
    131   }
    132 }
    View Code

    【例2】利用定时器实现按键的长按与短按,分别显示不同的效果。同样需要两个标志位。一个是按键按下的标志,一个是记录按下的时间的变量。

     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 count_t = 0;    //长定时累计变量
    10 unsigned char K_Press = 0;    //按键按下标志
    11 /*=======================简单的延时函数========================*/
    12 void Delay(unsigned int t)
    13 {
    14   while(t--);
    15 }
    16 /*======================端口初始化函数========================*/
    17 void Init_Port()
    18 {
    19   //初始化LED灯的I/O端口
    20   P1SEL &= ~0x1b;   //P1_0、P1_1、P1_3和P1_4作为通用I/O端口
    21   P1DIR |= 0x1b;    //P1_0、P1_1、P1_3和P1_4端口输出
    22   //关闭所有的LED灯
    23   P1 &= ~0x1b;
    24   //初始化按键
    25   P1SEL &= ~0x04;     //P1_2作为通用I/O端口
    26   P1DIR &= ~0x04;     //P1_2端口输入
    27   P1INP &= ~0x04;     //P1_2设置为上拉/下拉模式
    28   P2INP &= ~0x40;     //P1_2设置为上拉
    29 }
    30 
    31 /*=====================定时器1初始化函数======================*/
    32 void Init_Timer1()
    33 {
    34   T1CC0L = 0xd4;    //16MHz时钟128分频定时100ms
    35   T1CC0H = 0x30;    //设先填低8位,再填高8位
    36   T1CCTL0 |= 0x04;  //开启通道0的输出比较模式
    37   T1IE = 1;         //使能定时器1中断
    38   T1OVFIM = 1;      //使能定时器1溢出中断
    39   EA = 1;           //使能总中断
    40   T1CTL = 0x0e;     //分频系数是128,模模式
    41 }
    42 
    43 /*====================定时器1中断服务函数=====================*/
    44 #pragma vector = T1_VECTOR
    45 __interrupt void Timer1_Sevice()
    46 {
    47   T1STAT &= ~0x01;      //清除定时器1通道0中断标志
    48   if(K_Press != 0)      //按键按下
    49   {
    50     count_t++;          //计算按下按下的时间值
    51   }
    52 }
    53 
    54 /*====================按键扫描处理函数========================*/
    55 
    56 void Scan_Keys()
    57 
    58 {
    59   if(SW1 == 0)
    60   {
    61     Delay(100);         //去抖动处理
    62     if(SW1 == 0)
    63     {
    64       K_Press = 1;      //标志按键正在按下
    65       while(SW1 == 0);  //等待按键松开
    66       K_Press = 0;      //标志按键已经松开
    67       
    68       if(count_t > 10)  //按键长按
    69       {
    70         D6 = ~D6;
    71       }
    72       else              //按键短按
    73       {
    74         D4 = ~D4;
    75       }
    76       count_t = 0;      //按键计数值清零
    77     }
    78   }
    79 }
    80 
    81 /*==========================主函数============================*/
    82 void main()
    83 {
    84   Init_Port();          //端口初始化
    85   Init_Timer1();        //初始化定时器1
    86   while(1)
    87   {
    88     Scan_Keys();        //扫描按键
    89   }
    90 }
    View Code
  • 相关阅读:
    Win10/UWP开发-Ink墨迹书写
    Win10/UWP 让你的App使用上扫描仪
    Win10/UWP新特性—Drag&Drop 拖出元素到其他App
    UWP/Win10新特性系列—Drag&Drop 拖动打开文件
    1、WIN2D学习记录(win2d实现JS雨天效果)
    Windows 通用应用尝试开发 “51单片机汇编”总结
    D2.Reactjs 操作事件、状态改变、路由
    D1.1.利用npm(webpack)构建基本reactJS项目
    UWP 动画系列之模仿网易云音乐动画
    字符设备驱动之Led驱动学习记录
  • 原文地址:https://www.cnblogs.com/yuling520/p/12694256.html
Copyright © 2011-2022 走看看