问:我应该如何为一个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)。)
全部0条评论
快来发表一下你的评论吧 !