微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > PIC 单片机 C 语言编程简介(3)

PIC 单片机 C 语言编程简介(3)

时间:11-22 来源:互联网 点击:
例 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


0x3FFD // XT 模式

0x3FFC // LP 模式


#define WDTEN 0x3FFF // 看门狗打开


#define WDTDIS

#define PWRTEN


0x3FFB // 看门狗关闭

0x3FF7 // 上电延时定时器打开


#define PWRTDIS 0x3FFF // 上电延时定时器关闭

#define BOREN 0x3FFF // 低电压复位允许


#define BORDIS


0x3FBF // 低电压复位禁止


#define UNPROTECT 0x3FFF // 没有代码保护

#define PROTECT 0x3FEF // 程序代码保护

例 11-6 头文件预定义的配置信息符号

11.7.2 定义芯片标记单元

PIC 单片机中的标记单元定义可以用下面的__IDLOC(注意前面有两个下划线符)预处

理指令实现,方法如下:

__IDLOC (1234);

其特殊之处是括号内的值全部为 16 进制数,不需要用“0x”引导。这样上面的定义就设定

了标记单元内容为 01020304。

11.8


MPLAB-IDE 中实现 PICC 的编译选项设置

在 11.3 节中已经介绍了如何实现 PICC 和 MPLAB-IDE 开发平台的挂接。一旦项目建立


成功、程序编写完成后即可以通过 MPLAB 环境下的项目管理工具实现程序的编译、连接和

调试。它们的含义分别

是:

-项目维护(Make):MPLAB 检查项目中的原程序文件,只编译那些在上次编

译后又被修改过的原程序,最

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top