//清除 TMR0 中断标志
if (TMR1IE && TMR1IF) //判 TMR1 中断
{
TMR1IF0;
//在此加入 TMR1 中断服务
}
}
//清除 TMR1 中断标志
//中断结束并返回
例 11-5 C 语言中断函数举例
PICC 会自动加入代码实现中断现场的保护,并在中断结束时自动恢复现场,所以编程
员无需象编写汇编程序那样加入中断现场保护和恢复的额外指令语句。但如果在中断服务程
序中需要修改某些全局变量时,是否需要保护这些变量的初值将由编程员自己决定和实施。
用 C 语言编写中断服务程序必须遵循高效的原则:
&O1540; 代码尽量简短,中断服务强调的是一个“快”字。
&O1540; 避免在中断内使用函数调用。虽然 PICC 允许在中断里调用其它函数,但为了解决
递归调用的问题,此函数必须为中断服务独家专用。既如此,不妨把原本要写在其
它函数内的代码直接写在中断服务程序中。
&O1540; 避免在中断内进行数学运算。数学运算将很有可能用到库函数和许多中间变量,就
算不出现递归调用的问题,光在中断入口和出口处为了保护和恢复这些中间临时变
量就需要大量的开销,严重影响中断服务的效率。
中档系列 PIC 单片机的中断入口只有一个,因此整个程序中只能有一个中断服务函数。
11.6.5 标准库函数
PICC 提供了较完整的 C 标准库函数支持,其中包括数学运算函数和字符串操作函数。
在程序中使用这些现成的库函数时需要注意的是入口参数必须在 bank0 中。
如果需要用到数学函数,则应在程序前 “#include ” 包含头文件;如果要使
用字符串操作函数,就需要包含“#include ”头文件。在这些头文件中提供了函数
类型的声明。通过直接查看这些头文件就可以知道 PICC 提供了哪些标准库函数。
C 语言中常用的格式化打印函数“printf/sprintf”用在单片机的程序中时要特别谨慎。
printf/sprintf 是一个非常大的函数,一旦使用,你的程序代码长度就会增加很多。除非是在
编写试验性质的代码,可以考虑使用格式化打印函数以简化测试程序;一般的最终产品设计
都是自己编写最精简的代码实现特定格式的数据显示和输出。本来,在单片机应用中输出的
数据格式都相对简单而且固定,实现起来应该很容易。
对于标准 C 语言的控制台输入(scanf)/输出(printf)函数,PICC 需要用户自己编写
其底层函数 getch()和 putch()。在单片机系统中实现 scanf/printf 本来就没什么太多意义,如
果一定要实现,只要编写好特定的 getch()和 putch()函数,你就可以通过任何接口输入或输
出格式化的数据。
11.7
PICC 定义特殊区域值
PICC 提供了相关的预处理指令以实现在原程序中定义单片机的配置字和标记单元。
11.7.1 定义工作配置字
在原程序中定义 PIC 单片机工作配置字的重要性在前面章节中已经阐述。在用 PICC 写
程序时同样可以在 C 原程序中定义,具体方式如下:
__CONFIG (HS & UNPROTECT & PWRTEN & BORDIS & WDTEN);
上面的关键词“__CONFIG”(注意前面有两个下划线符)专门用于是芯片配置字的设
定,后面括号中的各项配置位符号在特定型号单片机的头文件中已经定义(注意不是 pic.h
头文件),相互之间用逻辑“与”操作符组合在一起。这样定义的配置字信息最后将和程序
代码一起放入同一个 HEX 文件。
在这里列出了适用于 16F7x 系列单片机配置位符号预定义,其它型号或系列的单片机
配置字定义方式类似,使用前查阅一下对应的头文件即可。
/*振荡器配置*/
#define RC
#define HS
0x3FFF // RC 振荡
0x3FFE // HS 模式
#define XT
#define LP
/*看门狗配置*/