原链接 http://blog.163.com/a_hui8/blog/static/2058303072012628105311873/
模模式需要开启通道0的输出比较模式,否则计数器只有到了0XFF时才会产生溢出中断(相应的产生溢出标志),也就是如果没有设置通道0的输出比较模式,计数器的值到达T1CC0后,不会产生溢出中断(相应的溢出标志不会置1),这点需要特别注意。
记得把TICCTL0的IM位打开!!!! 否者中断请求被屏蔽
#include
#define LED1 P1_0 //定义LED1为P1.0
#define S1 P0_1 //定义S1为P0.1
void INIT_LED(void)
{
P1SEL &= ~0x01; //设P1.0为普通I/O功能
P1DIR |= 0x01; //设P1.0为输出方向
LED1 = 0; //将LED1点亮
}
void INIT_IO(void)
{
P0SEL &= ~0x02; //设P0.1(S1)为普通I/O功能
P0DIR &= ~0x02; //设P0.1(S1)为输入
P0IFG &= ~0x02; //设P0.1(S1)状态标志寄存器清零
P0IEN |= 0x02; //设P0.1(S1)中断使能
IEN1 |= 0x20; //开P0中断
EA = 1; //总中断EA为中断使能
}
void INIT_Timer1()
{
T1CTL = 0x00; //1分频、停止运行
T1CCTL0 |= 0x04; //设定timer1通道0输出比较模式
T1CC0L = 0x24;
T1CC0H = 0xF4;
IRCON &= ~0x02;
}
//P0.1(S1)中断处理函数
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
if((P0IFG&0x02) == 0x02) //P0.1(S1)状态标志寄存器触发 (P0IFG的值为0XFF,不解)
{
for(int i =0 ;i<8000 ;i++);
P0IFG &= ~0x02; //P0.1(S1)状态标志寄存器清零
if(T1CTL == 0x0e)
T1CTL = 0x00; //1分频 暂停运行
else
T1CTL = 0x0e; //128分频 模模式
}
}
void main( void )
{
INIT_IO();
INIT_LED();
INIT_Timer1();
LED1 = 1 ;
int count = 0;
while(1)
{
if(IRCON &= 0x02)
{
count++;
if(count%2==0)
{
LED1 = !LED1;
IRCON &= ~0x02 ;
count = 0;
}
}
}
}
上面为模模式的查询法,下面为模模式的中断法
#include
#define LED1 P1_0 //定义LED1为P1.0
#define S1 P0_1 //定义S1为P0.1
int count = 0;
void INIT_LED(void)
{
P1SEL &= ~0x01; //设P1.0为普通I/O功能
P1DIR |= 0x01; //设P1.0为输出方向
LED1 = 0; //将LED1点亮
}
void INIT_IO(void)
{
P0SEL &= ~0x02; //设P0.1(S1)为普通I/O功能
P0DIR &= ~0x02; //设P0.1(S1)为输入
P0IFG &= ~0x02; //设P0.1(S1)状态标志寄存器清零
IRCON &= ~(0x20); //设P0状态标志位清零
P0IEN |= 0x02; //设P0.1(S1)中断使能
IEN1 |= 0x20; //开P0中断
}
void INIT_Timer1()
{
T1CTL = 0x00; //1分频、停止运行
T1CCTL0 |= 0x04; //设定timer1通道0输出比较模式
T1CC0L = 0x24;
T1CC0H = 0xF4;
TIMIF |= 0X40; //设定timer1中断开启
IEN1 |= 0x02; //设定timer1中断开启
//清除中断标志
IRCON &= ~0x02;
T1STAT &= ~0x01; //第5位计数溢出标志呢
}
#pragma vector = T1_VECTOR
__interrupt void TIMER1_ISR(void)
{
count++;
if(count%2 == 0)
{
LED1 = !LED1;
count = 0;
}
//清除中断标志
IRCON &= ~0x02;
T1STAT &= ~0x01;
//产生的中断是定时器1通道0中断,而不是定时器1的溢出中断,故只需要清除T1STAT的第1位,不需要清除第5位
}
//P0.1(S1)中断处理函数
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
if((P0IFG&0x02) == 0x02) //P0.1(S1)状态标志寄存器触发
{
for(int i =0 ;i<8000 ;i++);
P0IFG &= ~0x02; //P0.1(S1)状态标志寄存器清零
if(T1CTL == 0x0e)
T1CTL = 0x00; //1分频 暂停运行
else
T1CTL = 0x0e; //128分频 模模式
}
IRCON &= ~(0x20);
}
void main( void )
{
INIT_LED();
INIT_IO();
INIT_Timer1();
EA = 1; //开总中断
while(1);
}