|
#include
#include "LCD_Display.h"
unsigned int TA_OverflowCnt; // TA溢出次数存放变量
unsigned long int Period; // 脉宽测量结果存放变量
unsigned int RiseCapVal; // 上升沿时刻捕获值存放变量
unsigned char Edge=0; // 当前触发沿
#define RISE 0
#define FALL 1
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
FLL_CTL0 |= XCAP18PF; // 配置晶振负载电容
P1DIR &=~(BIT2); // P1.2(TA1)设为输入(可省略)
P1SEL |= BIT2; // P1.2设为第二功能(TA1)
TACTL = TASSEL_2 + MC_2 + TAIE + TACLR; // TA连续计数,开始计时,SMCLK,开中断
TACCTL1 = CAP + CM_1 + CCIS_1 + SCS + CCIE;
//捕获模块1启动,选择TA1(P1.2)引脚作为捕获源,上升沿捕获,同步模式,开启捕获中断
BTCTL=0;
LCD_Init();
_EINT(); // 总中断允许
LPM0; // 进入低功耗模式3休眠,全部程序在中断内执行
}
#pragma vector=TIMERA1_VECTOR
__interrupt void TA_ISR(void) //Timer_A中断
{
switch( TAIV )
{
case 2: // 比较/捕获模块1中断
if(Edge==RISE) //如果是上升沿的捕获中断
{
RiseCapVal=TACCR1; //保存上升沿时刻捕获值
TACCTL1 = CAP +CM_2 +CCIS_1 +SCS +CCIE;//改为下降沿触发
Edge=FALL; //触发沿状态标志
}
else //如果是下降沿的捕获中断
{
Period=TA_OverflowCnt*65536 + TACCR1 - RiseCapVal;//计算周期
TA_OverflowCnt=0; //溢出次数清零
TACCTL1 = CAP +CM_2 +CCIS_1 +SCS +CCIE;//改为上升沿触发
Edge=FALL; //触发沿状态标志
LCD_DisplayLongNumber(Period); //显示
}
break;
case 4: break;
case 10: TA_OverflowCnt++; //TA每次溢出,溢出次数变量+1
break;
}
}
|
|