直接上代码,代码有详解
/*
本程序为定时器3倒计数模式中断方式
关于定时器总结:
模式为自由模式时,只需要常规设置寄存器即可;
模式为模模模式时,正/倒计数模式时,只需要添加设置T3CCTL0寄存器为比较模式即可
模式为倒计数模式时,由于倒计数到0x00时,硬件会关闭定时器,如果想要连续使用,
一定在中断或则溢出标记中重新打开定时器!
*/
#include
#define LED1 P1_0
int count = 0;
void init_led()
{
P1SEL &= ~(1 << 0);//set p1_0 as generic io
P1DIR |= (1 << 0); //set P1_0 as output
LED1 = 0x0; //set led1 off
}
void init_clock32MHZ()
{
CLKCONCMD &= ~(1 << 6);//set source system clcok 32MHZ
while(CLKCONSTA & 0x40);//wait source system clcok stable
CLKCONCMD &= ~((1 << 6) | (1 << 2 ) | (1 << 1) | (1 << 0));//设置主时钟为32MHZ
while(CLKCONSTA & 0x1);//wait main clcok stable
CLKCONCMD |= (6 << 3);//set TICKSPD = 500KHZ
//TICKSPD default = 16MHZ
}
void init_timer3()
{
//使用模模式,倒计数,正倒计数时,必须设置这个寄存器为比较模式
T3CCTL0 |= (1 << 2);
T3CTL |= (7 << 5) | (1 << 3) | 1;//TICKSPD/128,enable inter, XXmode
T3CC0 = 125; //
IEN1 |= (1 << 3); //enable T3IE
T3CTL |= (1 << 4); //start Timer3
IEN0 |= (1 << 7);//enable EA
}
#pragma vector=T3_VECTOR
__interrupt void t3_isr()
{
IRCON &= ~(1 << 3);//clear inter flag
//T3CTL |= (1 << 4); //start Timer3,如果使用倒计数模式
count++;
if(count > 64){//2s
LED1 = 0x1;
count = 0;
}
if(count > 32){//1s
LED1 = 0x0;
}
}
void main()
{
init_led();
init_clock32MHZ();
init_timer3();
while(1);
}