#include "public.h" __near_func __interrupt void t3_irq(void); __near_func __interrupt void t4_irq(void); __near_func __interrupt void P1INT_Exti_ISR(void); //32MHZ us延时函数; #pragma optimize=none void system_delay_us(unsigned int n) { n>>=1; while(n--) { asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); } } /**************************************************************************** * 名 称: InitTimer3() * 功 能: 定时器初始化,系统不配置工作时钟时默认是2分频,即16MHz * 入口参数: 无 * 出口参数: 无 ****************************************************************************/ void InitTimer3(void) { T3IE = 1; //开总中断和T3中断 //T3CTL (0xCB)–定时器 3 控制 bit7:5 -->111: 标记频率/128 T3CTL |= 0xE0; //128分频,F=16M/128=125000HZ T=1/F=8us 计数一次8us 计满溢出 T3CTL |= 0x08 ; //开溢出中断 bit3 溢出中断屏蔽 0:中断禁止 1:中断使能 // T3CTL &= ~0x03; // 自动重装 00->0xff bit1:0--->00: 自由运行,从0x00到0xFF反复计数 T3CTL &= ~0x01; // //设置为 模模式 从0x00到T3CC0重复计数 bit1:0 -->10 T3CC0 = 250; //设置最大计数值 这里设置250 2ms触发一次中断 T3CCTL0 = 0x04;// bit2 选择定时器3通道0捕获或者比较模式 比较模式 T3CTL |= 0x10; // bit4 启动定时器。正常运行时设置,暂停时清除 //T3CTL bit2 清除计数器。写1到CLR复位计数器到0x00,并初始化相关通道所有的输出引脚。总是读作0。 EA = 1; //开总中断 //T3CNT (0xEA) – 定时器 3 计数器 定时器计数字节。包括8位计数器当前值。 P1DIR=0xff; } /****************************/ //定时器3中断函数 /****************************/ #pragma vector=T3_VECTOR __near_func __interrupt void t3_irq(void) { //T3STAT &= ~0x01; IRCON &= ~0x04; //T3IF clear //清除定时器3通道0中断标志 } /**************************************************************************** * 名 称: InitTimer4() * 功 能: 定时器初始化,系统不配置工作时钟时默认是2分频,即16MHz * 入口参数: 无 * 出口参数: 无 ****************************************************************************/ void InitTimer4(void) { T4IE = 1; //开总中断和T4中断 //T3CTL (0xCB)–定时器 3 控制 bit7:5 -->111: 标记频率/128 T4CTL |= 0xE0; //128分频,F=16M/128=125000HZ T=1/F=8us 计数一次8us 计满溢出 T4CTL |= 0x08 ; //开溢出中断 bit3 溢出中断屏蔽 0:中断禁止 1:中断使能 // T3CTL &= ~0x03; // 自动重装 00->0xff bit1:0--->00: 自由运行,从0x00到0xFF反复计数 T4CTL &= ~0x01; // //设置为 模模式 从0x00到T4CC0重复计数 bit1:0 -->10 T4CC0 = 250; //设置最大计数值 这里设置250 2ms触发一次中断 T4CCTL0 = 0x04;// bit2 选择定时器3通道0捕获或者比较模式 比较模式 T4CTL |= 0x10; // bit4 启动定时器。正常运行时设置,暂停时清除 //T3CTL bit2 清除计数器。写1到CLR复位计数器到0x00,并初始化相关通道所有的输出引脚。总是读作0。 EA = 1; //开总中断 //T3CNT (0xEA) – 定时器 3 计数器 定时器计数字节。包括8位计数器当前值。 } /****************************/ //定时器4中断函数 /****************************/ #pragma vector=T4_VECTOR __near_func __interrupt void t4_irq(void) { //T3STAT &= ~0x01; IRCON &= ~0x08; //T4IF clear //清除定时器4通道0中断标志 static int cnt=0; if(++cnt>500) { cnt=0; P1^=0xff; } } /*===============P1端口外部中断初始化函数==================*/ void Init_P1Prot_Exti(void) { IEN2 |= 0x10; //端口1中断使能 P1IEN |= 0x04; //端口P1_2外部中断使能 端口P1.7到P1.0中断使能 PICTL |= 0x02; //端口P1_0到P1_3下降沿触发 3到0输入模式下的中断配置。该位为所有端口1的输入选择中断请求条件0: 输入的上升沿引起中断1: 输入的下降沿引起中断 EA = 1; //使能总中断 } /*================外部中断1服务函数====================*/ #pragma vector = P1INT_VECTOR //外部中断1的向量入口 __near_func __interrupt void P1INT_Exti_ISR(void) { /*先清除引脚标志位,再清除端口标志位,否则会不断进入中断*/ P1IFG &= ~ 0x04; //软件清除P1_2引脚的标志位 P1IF = 0; //软件清除P1端口组的标志位 }