无线传感网——zigbee基础实验-定时器实现长按与短按

#include "ioCC2530.h"
#define D3  P1_0
#define D4  P1_1
#define D5  P1_3
#define D6  P1_4
#define SW1 P1_2
unsigned char count_t = 0;    //长定时累计变量
unsigned char K_Press = 0;    //按键按下标志
/*=======================简单的延时函数========================*/
void Delay(unsigned int t)
{
  while(t--);
}
/*======================端口初始化函数========================*/
void Init_Port()
{
  //初始化LED灯的I/O端口
  P1SEL &= ~0x1b;   //P1_0、P1_1、P1_3和P1_4作为通用I/O端口
  P1DIR |= 0x1b;    //P1_0、P1_1、P1_3和P1_4端口输出
  //关闭所有的LED灯
  P1 &= ~0x1b;
  //初始化按键
  P1SEL &= ~0x04;     //P1_2作为通用I/O端口
  P1DIR &= ~0x04;     //P1_2端口输入
  P1INP &= ~0x04;     //P1_2设置为上拉/下拉模式
  P2INP &= ~0x40;     //P1_2设置为上拉
}
/*=====================定时器1初始化函数======================*/
void Init_Timer1()
{
  T1CC0L = 0xd4;    //16MHz时钟128分频定时100ms
  T1CC0H = 0x30;    //设先填低8位,再填高8位
  T1CCTL0 |= 0x04;  //开启通道0的输出比较模式
  T1IE = 1;         //使能定时器1中断
  T1OVFIM = 1;      //使能定时器1溢出中断
  EA = 1;           //使能总中断
  T1CTL = 0x0e;     //分频系数是128,模模式
}
/*====================定时器1中断服务函数=====================*/
#pragma vector = T1_VECTOR
__interrupt void Timer1_Sevice()
{
  T1STAT &= ~0x01;      //清除定时器1通道0中断标志
  if(K_Press != 0)      //按键按下
  {
    count_t++;          //计算按下按下的时间值
  }
}
/*====================按键扫描处理函数========================*/
void Scan_Keys()
{
  if(SW1 == 0)
  {
    Delay(100);         //去抖动处理
    if(SW1 == 0)
    {
      K_Press = 1;      //标志按键正在按下
      while(SW1 == 0);  //等待按键松开
      K_Press = 0;      //标志按键已经松开
     
      if(count_t > 10)  //按键长按
      {
        D6 = ~D6;
      }
      else              //按键短按
      {
        D4 = ~D4;
      }
      count_t = 0;      //按键计数值清零
    }
  }
}
/*==========================主函数============================*/
void main()
{
  Init_Port();          //端口初始化
  Init_Timer1();        //初始化定时器1
  while(1)
  {
    Scan_Keys();        //扫描按键
  }
}
posted @ 2020-05-01 07:18  小豪、精神。  阅读(650)  评论(0编辑  收藏  举报