外部程序中断的写法主要涉及硬件和软件的配置。以下是一个基于常见微控制器(如AVR)的外部中断示例,使用C语言编写:
关闭看门狗
```c
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
```
配置端口方向
```c
P5DIR |= 0x0F; // 设置P1端口方向为输入
```
启用外部中断
```c
P1IE = 0xf0; // 启用P1端口的所有中断
P1IES = 0xf0; // 设置P1端口的中断边缘触发
```
进入最低功耗模式并打开总中断
```c
_BIS_SR(LPM3_bits + GIE); // 进入最低功耗睡眠模式,同时打开总中断开关
```
中断服务函数
```c
pragma vector=PORT1_VECTOR
__interrupt void p1int(void) {
if ((P1IN & BIT5) == BIT5) P5OUT &= ~BIT1; else P5OUT |= BIT1;
if ((P1IN & BIT6) == BIT6) P5OUT &= ~BIT2; else P5OUT |= BIT2;
if ((P1IN & BIT7) == BIT7) P5OUT &= ~BIT3; else P5OUT |= BIT3;
P1IFG = 0; // 清除中断标志
}
```
详细步骤说明:
关闭看门狗
`WDTCTL = WDTPW + WDTHOLD;`:这行代码关闭了看门狗定时器,防止系统在意外中断时死机。
配置端口方向
`P5DIR |= 0x0F;`:将P1端口的所有位设置为输入模式,以便检测外部事件。
启用外部中断
`P1IE = 0xf0;`:启用P1端口的所有中断。
`P1IES = 0xf0;`:设置P1端口的中断为边缘触发模式(上升沿或下降沿)。
进入最低功耗模式并打开总中断
`_BIS_SR(LPM3_bits + GIE);`:这行代码将系统置于最低功耗模式(LPM3),同时打开总中断开关(GIE),以便在检测到外部中断时能够及时响应。
中断服务函数
`pragma vector=PORT1_VECTOR`:指定中断服务函数`p1int`对应于P1端口的中断向量。
`__interrupt void p1int(void)`:定义中断服务函数,当P1端口检测到中断时,该函数会被调用。
在中断服务函数中,通过检测P1端口的输入状态(`P1IN`),控制P5端口的输出状态(`P5OUT`),并清除中断标志(`P1IFG`)。
注意事项:
避免在中断服务程序中做浮点运算:中断服务程序应尽量简短且高效,避免执行复杂的计算。
中断服务程序不能有返回值:所有中断服务程序的返回类型应为`void`。
中断服务程序不能传递参数:中断服务程序不应有参数列表。
通过以上步骤和示例代码,你可以编写一个基本的外部程序中断程序。根据具体的微控制器和需求,可能还需要进行其他配置和调整。