PIC16F877编写中断ISR报expected ';'编译错误求解
PIC16F877中断服务函数
expected ';' after top level declarator编译错误解决方案 报错定位在if (RCIF == 1)行不代表问题出在这行,这个错误是编译器没有正确识别上方的中断函数定义,把函数内部代码当成了顶层全局声明,才提示缺分号。
常见触发原因和修复方法
- 漏加对应编译器的芯片头文件
不管用哪种PIC C编译器,写代码开头必须包含对应头文件,否则编译器识别不了中断相关关键字:- 用Microchip XC8编译器:开头加
#include <xc.h> - 用旧版HI-TECH PICC编译器:开头加
#include <pic.h>
- 用Microchip XC8编译器:开头加
- 中断函数声明语法不匹配当前编译器
不同编译器对PIC16系列中断函数的写法要求不一样,写错关键字就会导致函数识别失败:- 新版XC8编译器正确写法:
#include <xc.h> unsigned char UART_Buffer; // 提前声明代码里用到的全局变量 void __interrupt() ISR(void) // 注意__interrupt是双下划线开头 { if (RCIF == 1) { UART_Buffer = RCREG; // 读取接收数据寄存器 PORTB = UART_Buffer; // 将接收数据输出到PORTB连接的LED RCIF = 0; // 清除接收中断标志位 } }- 旧版HI-TECH PICC编译器正确写法:
#include <pic.h> unsigned char UART_Buffer; void interrupt ISR(void) { if (RCIF == 1) { UART_Buffer = RCREG; PORTB = UART_Buffer; RCIF = 0; } } - 函数作用域写错
中断服务函数属于全局函数,不能写在main()或者其他自定义函数的内部,必须放在全局作用域下。
验证方法
修正头文件引用和中断函数声明后重新编译,原本定位在if行的分号错误会直接消失。如果后续出现其他报错,再检查是否有寄存器、变量未定义的问题即可。
内容的提问来源于stack exchange,提问作者Bhoja raja g
相关产品推荐
相关产品推荐

