用中断定时器模式进行灯的亮灭(TIME1(mode))

原理图

 选择T1STAT[4:0]

  

代码:

#include<ioCC2530.h>

void LED_Init(void);
void TIME1_Init(void);

int main()
{
  LED_Init(); //初始化灯
  TIME1_Init();	//初始化定时器

  while(1);
}

void LED_Init(void)
{
   /*LED初始化*/
  P1SEL &= ~0x03;
  P1DIR |= 0x03;
}

void TIME1_Init(void)
{
  /*定时器初始化*/

  //初始化中断寄存器
  IEN1 |= 0x02; //xxxx xx1x 初始定时器1的中断
  EA = 1;
  TIMIF |= 0x40; //x1xx xxxx 清除定时器1的中断标志位
  T1CCTL0 |= 0x04; //xxxx x1xx 设置定时器1的通道为比较模式

  //(16M * cnt) / 2= 0.5 => 62500
  /*比较值有十六位,比较值分别用高值和低值写入*/
  T1CC0L = 0x24; //xx1x x1xx 设置低位比较值
  T1CC0H = 0xF4; //1111 x1xx 设置高位比较值
  /*必须先设置低位再设置高位*/

  /*T1CTL:定时器1控制方式,这里是从0计数到T1CC0,128分频*/
  /*IRGEN:作用是当设置定时器3通道1和定时器1的计数输入必须将其设置为0*/
  T1CTL = 0x0E; //xxxx xxxx -> xxxx 1110 IRGEN第零位为0

  T1STAT = 0; //开启定时器1的中断标记位
}

/*编写中断服务函数*/
#pragma vector = T1_VECTOR	//#pragma vector来提供中断函数P0口的入口地址
__interrupt void T1_ISR(void)	
{
  if(T1STAT & 0x01)//判断0位是否为1 xxxx xxx1 是否定时器1进入了中断
  {
    P1_0 = !P1_0;
    P1_1 = !P1_1;
  }

  T1STAT &= ~0x01; //0000 0001 -> 1111 1110 清除中断标记位
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值