我们经常在51单片机中使用中断服务函数,其一般的形式是:
定义中断服务函数:
函数类型 函数名 (形式参数) interrupt m [using n]
/* Timer0 interrupt routine */
void tm0_isr() interrupt 1 using 1
{
code;
}
一般的情况下是没有using[n]这一句的,但是为什么没有这一句呢?那我们就来学习一下using
这其实是C51编译器扩展的关键字。用来选择80C51单片机中不同的寄存器组,单片机内部 RAM 的00H~1FH地址单元,共32B,分成4组工作寄存器组,每组8个工作寄存单元。那么using 后面的数字也就是0-3范围里的一个数了。各组都以R0 ~ R7作为工作寄存单元编号。由于它们的功能及使用不作预先规定,因此称之为通用寄存器。4组通用寄存器在任一时刻,CPU 只能使用其中的一组工作寄存器,并且把正在使用的那组寄存器称为当前寄存器组。到底是哪一组,由程序状态字(PSW)寄存器中RS1、RSO位的状态组合来决定。如果不需要using的话,编译器会自动选择一组寄存器作为绝对寄存器访问。
并且using对代码具有一定影响。
如果定义 void tm0_isr() interrupt 1 using 1
假设,我们又在中断里调用了一个delay();这个delay是起延时作用。那么,我们就需要确保我们使用的寄存器组是同一组。否则,就会出现混乱。所以我们在写中断服务函数时大多数情况下并没有写using