如何为一个PIC单片机编写中断服务程序

描述

问:我应该如何为一个PIC单片机编写中断服务程序?

答:仅仅是用一个'interrupt'关键词声明一个函数就好了。编译器会把它放到合适的位置,并且会注意所有的寄存器保护和恢复。

这里有一个中档PIC单片机使用中断的例子;

#include

/*

  • Interrupt demo for PIC; wait for button press on RB0/INT,
    
  • turn on a relay on another port bit for a period of time.
    
  • For simplicity here, literal constants are used, usually these
    
  • should be calculated with compile-time arithmetic.
    

*/

static bit RELAY @ (unsigned)&PORTB*8+7;// 使用这个位来驱动一个继电器

static unsigned int relay_timer; //继电器驱动器的定时值

void

main(void)

{

RELAY = 1; // 确保继电器在使能前是关闭的

TRISB = 0x3F; // Port B的第7、6位是输出

T0CS = 0; // 定时器是以指令周期累加

T0IE = 1; // 使能TMR0溢出中断

INTEDG = 0; // INT中断是下降沿触发

INTE = 1; // 使能INT中断

GIE = 1; // 全局中断使能

for(;;)

CLRWDT(); // 闲时喂一下狗

}

static void interrupt

isr(void) // 这里是中断服务函数

// isr是函数名,并不重要,可任意命名

{

if(T0IF) { //如果是定时器0中断

TMR0 -= 250; //重载定时器,每250uS中断一次

T0IF = 0; //清中断标志位

if(relay_timer != 0) //继电器定时到了吗?

relay_timer--; //定时值减一

if(relay_timer == 0) //如果定时时间到了

RELAY = 1; //关闭继电器

PORTB ^= 0x40;//翻转一个端口来指示程序还是在正常工作的

}

if(INTF) { //有没有一个按键按下?

RELAY = 0; //打开继电器

relay_timer = 4000;//启动定时器-4000个时间片=约1秒钟

INTF = 0; //清中断标志位

}

}

(译者注:建议在if条件中,同时检查中断标志位和中断使能位,如:if(T0IF && T0IE)。)

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分