当前位置:首页 >> 信息与通信 >>

PIC C18编译器lib


MPLAB? C18 C 编译器 函数库

? 2005 Microchip Technology Inc.

DS51297F_CN

请注意以下有关 Microchip 器件代码保护功能的要点: ? ? ? Microchip 的产品均达到 Microchip 数据手册中所述的技术指标。 Microchip 确信:

在正常使用的情况下, Microchip 系列产品是当今市场上同类产品中最安全的产品之一。 目前,仍存在着恶意、甚至是非法破坏代码保护功能的行为。就我们所知,所有这些行为都不是以 Microchip 数据手册中规定的 操作规范来使用 Microchip 产品的。这样做的人极可能侵犯了知识产权。 Microchip 愿与那些注重代码完整性的客户合作。 Microchip 或任何其他半导体厂商均无法保证其代码的安全性。代码保护并不意味着我们保证产品是 “牢不可破”的。

? ?

代码保护功能处于持续发展中。 Microchip 承诺将不断改进产品的代码保护功能。任何试图破坏 Microchip 代码保护功能的行为均可视 为违反了 《数字器件千年版权法案 (Digital Millennium Copyright Act)》。如果这种行为导致他人在未经授权的情况下,能访问您的 软件或其他受版权保护的成果,您有权依据该法案提起诉讼,从而制止这种行为。

提 供 本 文 档 的 中 文 版 本 仅 为 了 便 于 理 解。 Microchip Technology Inc. 及其分公司和相关公司、各级主管与员工及 事务代理机构对译文中可能存在的任何差错不承担任何责任。 建议参考 Microchip Technology Inc. 的英文原版文档。 本出版物中所述的器件应用信息及其他类似内容仅为您提供便 利,它们可能由更新之信息所替代。确保应用符合技术规范, 是您自身应负的责任。Microchip 对这些信息不作任何明示或 暗示、书面或口头、法定或其他形式的声明或担保,包括但不 限于针对其使用情况、质量、性能、适销性或特定用途的适用 性的声明或担保。 Microchip 对因这些信息及使用这些信息而 引起的后果不承担任何责任。未经 Microchip 书面批准,不得 将 Microchip 的 产 品 用 作 生 命 维 持 系 统 中 的 关 键 组 件。在 Microchip 知识产权保护下,不得暗中或以其他方式转让任何 许可证。

商标 Microchip 的名称和徽标组合、 Microchip 徽标、 Accuron、 dsPIC、 KEELOQ、 microID、 MPLAB、 PIC、 PICmicro、 PICSTART、 PRO MATE、 PowerSmart、 rfPIC 和 SmartShunt 均为 Microchip Technology Inc. 在美国和其他国 家或地区的注册商标。 AmpLab、 FilterLab、 Migratable Memory、 MXDEV、 MXLAB、 PICMASTER、 SEEVAL、 SmartSensor 和 The Embedded Control Solutions Company 均为 Microchip Technology Inc. 在美国的注册商标。 Analog-for-the-Digital Age、 Application Maestro、 dsPICDEM、 dsPICDEM.net、 dsPICworks、 ECAN、 ECONOMONITOR、 FanSense、 FlexROM、 fuzzyLAB、 In-Circuit Serial Programming、 ICSP、 ICEPIC、 Linear Active Thermistor、 MPASM、 MPLIB、 MPLINK、 MPSIM、 PICkit、 PICDEM、 PICDEM.net、 PICLAB、 PICtail、 PowerCal、 PowerInfo、 PowerMate、 PowerTool、 Real ICE、 rfLAB、 rfPICDEM、 Select Mode、 Smart Serial、 SmartTel、 Total Endurance、 UNI/O、 WiperLock 和 Zena 均为 Microchip Technology Inc. 在美国和其他国家或地区的 商标。 SQTP 是 Microchip Technology Inc. 在美国的服务标记。 在此提及的所有其他商标均为各持有公司所有。 ? 2005, Microchip Technology Inc. 版权所有。

Microchip 位于美国亚利桑那州 Chandler 和 Tempe 及位于加利福尼亚 州 Mountain View 的全球总部、设计中心和晶圆生产厂均于 2003 年 10 月通过了 ISO/TS-16949:2002 质量体系认证。公司在 PICmicro? 8 位单片机、 KEELOQ? 跳码器件、串行 EEPROM、单片机外设、非易失 性存储器和模拟产品方面的质量体系流程均符合 ISO/TS16949:2002。此外, Microchip 在开发系统的设计和生产方面的质量体 系也已通过了 ISO 9001:2000 认证。

DS51297F_CN 第 ii 页

? 2005 Microchip Technology Inc.

MPLAB? C18 C 编译器 函数库 目录
前言 .................................................................................................................................. 1 第 1 章 概述
1.1 1.2 1.3 1.4 1.5 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 3.1 3.2 3.3 3.4 3.5 3.6 4.1 4.2 4.3 4.4 4.5 4.6 4.7 5.1 5.2 5.3 简介.............................................................................................................. 5 MPLAB C18 函数库概述 .............................................................................. 5 启动代码....................................................................................................... 5 处理器内核函数库 ........................................................................................ 6 特定处理器的函数库..................................................................................... 7 简介.............................................................................................................. 9 A/D 转换器函数 ............................................................................................ 9 输入捕捉函数 ............................................................................................. 17 I?C? 函数 .................................................................................................. 21 I/O 口函数 .................................................................................................. 34 Microwire 函数 ........................................................................................... 37 脉宽调制函数 ............................................................................................. 44 SPI 函数 ..................................................................................................... 48 定时器函数 ................................................................................................. 57 USART 函数............................................................................................... 66 简介............................................................................................................ 75 外部 LCD 函数............................................................................................ 75 外部 CAN2510 函数 ................................................................................... 82 软件 I?C 函数 ............................................................................................ 105 软件 SPI 函数 ........................................................................................... 111 软件 UART 函数 ....................................................................................... 114 简介.......................................................................................................... 117 字符分类函数 ........................................................................................... 117 数据转换函数 ........................................................................................... 122 存储器和字符串操作函数 ......................................................................... 126 延时函数................................................................................................... 142 复位函数................................................................................................... 144 字符输出函数 ........................................................................................... 147 简介.......................................................................................................... 157 32 位浮点数数学函数库............................................................................ 157 C 标准数学库函数 .................................................................................... 160

第 2 章 硬件外设函数

第 3 章 软件外设函数库

第 4 章 通用软件函数库

第 5 章 数学函数库

? 2005 Microchip Technology Inc.

DS51297F_CN 第 iii 页

MPLAB? C18 C 编译器函数库
术语表...........................................................................................................................167 索引 ..............................................................................................................................173 全球销售及服务网点 .....................................................................................................180

DS51297F_CN 第 iv 页

? 2005 Microchip Technology Inc.

MPLAB? C18 C 编译器 函数库 前言
客户须知
所有文档均会过时,本文档也不例外。 Microchip 的工具和文档将不断演变以满足客户的需求,因此 实际使用中有些对话框和 / 或工具说明可能与本文档所述之内容有所不同。请访问我们的网站 (www.microchip.com)获取最新文档。 文档均标记有 “DS”编号。该编号出现在每页底部的页码之前。 DS 编号的命名约定为 “DSXXXXXA” ,其中 “XXXXX”为文档编号, “A”为文档版本。 欲了解开发工具的最新信息,请参考 MPLAB? IDE 在线帮助。从 Help (帮助)菜单选择 Topics (主题) ,打开现有在线帮助文件列表。

简介
本文档旨在提供可供 Microchip MPLAB? C18 C 编译器使用的函数库和预编译目标文 件的详细信息。

文档内容编排
文档内容编排如下: ? ? ? ? ? ? ? 第 1 章:概述 — 描述提供的函数库和预编译目标文件。 第 2 章:硬件外设函数库 — 描述每个硬件外设库函数。 第 3 章: 软件外设函数库 — 描述每个软件外设库函数。 第 4 章: 通用软件函数库 — 描述每个通用软件库函数。 第 5 章:数学函数库 — 讲述数学库函数。 术语表 — 包括本指南使用的术语。 索引 — 本文档中的术语、特性以及各个章节的交叉引用列表。

? 2005 Microchip Technology Inc.

DS51297F_CN 第 1 页

MPLAB? C18 C 编译器函数库
本文档使用的约定
本文档使用如下文档约定: 文档约定
说明 Arial 字体: 斜体字 Courier 字体: 常规 Courier 涵义 参考书目 需强调的文字 源代码示例 文件名 文件路径 关键字 命令行选项 位值 常数 可变参数 示例 MPLAB? IDE User's Guide ... 仅有的编译器 ... #define START autoexec.bat c:\mcc18\h _asm, _endasm, static -Opa+, -Opa0, 1 0xFF, ‘A’

斜体 Courier 0xnnnn 方括号 [ ] 花括号和竖线:{ | } 省略号 ...

file.o,其中 file 可以是任 一有效文件名 十六进制数, n 是一个十六进 0xFFFF,0x007A 制数字 mcc18 [options] file 可选参数 [options] errorlevel {0|1} 选择互斥参数; “或”选择 var_name [, 代替重复文字 var_name...] void main (void) 表示由用户提供的代码 { ... }

推荐读物
要了解更多关于编译器的函数库和预编译目标文件、 MPLAB IDE 及其他工具使用方面 的信息,请阅读以下推荐读物。 readme.c18 关于使用 MPLAB C18 C 编译器的最新信息,请阅读本软件自带的 readme.c18 文件 (ASCII 文本) 。此 readme 文件包含了本文档可能未提供的更新信息。 readme.xxx 需要其他 Microchip 工具的最新信息 (MPLAB IDE 和 MPLINK? 链接器等) ,请阅读 软件自带的相关 readme 文件 (ASCII 文本文件) 。 MPLAB? C18 C 编译器入门 (DS51295E_CN) 讲述如何安装 MPLAB C18 编译器,如何编写简单的程序以及如何在 MPLAB IDE 中使 用编译器。 MPLAB? C18 C 编译器用户指南 (DS51288J_CN) 一个综合指南,讲述了针对 PIC18 器件设计的 Microchip MPLAB C18 C 编译器的使用 及特征。 MPLAB? IDE V6.XX 快速入门指南 (DS51281C_CN) 介绍如何安装 MPLAB IDE 软件及如何使用 IDE 创建项目并烧写器件。

DS51297F_CN 第 2 页

? 2005 Microchip Technology Inc.

前言
MPASM? 汇编器、 MPLINK? 目标链接器和 MPLIB? 目标库管理器用户指南 (DS33014J_CN) 这个用户指南描述了如何使用 Microchip 的 PICmicro? 单片机 (MCU)汇编器 (MPASM ) 、链接器 (MPLINK)和库管理器 (MPLIB) 。 ? PICmicro 18C 单片机系列参考手册 (DS39500A_CN) 重点介绍增强型单片机系列。说明了增强型单片机系列架构和外设模块的工作原理, 但没有涉及到每个器件的具体细节。 PIC18 器件数据手册和应用笔记 讲述 PIC18 器件工作和电气特性的数据手册。应用笔记介绍了如何使用 PIC18 器件。 要获得上述任何文档,请访问 Microchip 的网站 (www.microchip.com) ,获得 Adobe Acrobat (.pdf)格式的文档。

MICROCHIP 网站
Microchip 网站 (www.microchip.com)为客户提供在线支持。客户可通过该网站方便 地获取文件和信息。只要使用常用的因特网浏览器即可访问。网站提供以下信息: ? 产品支持——数据手册和勘误表、应用笔记和样本程序、设计资源、用户指南以及 硬件支持文档、最新的软件版本以及存档软件 ? 一般技术支持——常见问题 (FAQ) 、技术支持请求、在线讨论组以及 Microchip 顾问计划成员名单 ? Microchip 业务——产品选型和订购指南、 最新 Microchip 新闻稿、 研讨会和活动安 排表、 Microchip 销售办事处、代理商以及工厂代表列表

? 2005 Microchip Technology Inc.

DS51297F_CN 第 3 页

MPLAB? C18 C 编译器函数库
开发系统变更通知客户服务
Microchip 启动了客户通知服务,来帮助客户轻松获得关于 Microchip 产品的最新信 息。 订阅此项服务后,每当您指定的产品系列或感兴趣的开发工具有更改、更新、改 进或有勘误时,您都会收到电子邮件通知。 登录 Microchip 网站 (http://www.microchip.com) ,点击 “客户变更通知” 。按照指 示注册。 开发系统产品组分类如下: ? 编译器 — 关于 Microchip C 编译器和其他语言工具的最新信息。这些工具包括 MPLAB? C17、 MPLAB C18 和 MPLAB C30 C 编译器; MPASM? 和 MPLAB ASM30 汇编器; MPLINK? 和 MPLAB LINK30 目标链接器; MPLIB? 和 MPLAB LIB30 目标库管理器。 ? 仿真器 — 关于Microchip在线仿真器的最新信息。 包括MPLAB ICE 2000和MPLAB ICE 4000。 ? 在线调试器 — 关于 Microchip 在线调试器的最新信息,包括 MPLAB ICD 2。 ? MPLAB IDE — 关于 Microchip MPLAB? IDE 的最新信息,它是开发系统工具的 Windows? 集成开发环境。重点介绍 MPLAB IDE、 MPLAB SIM 软件仿真器、 MPLAB IDE 项目管理器以及一般的编辑和调试功能。 ? 编程器 — 关于 Microchip 器件编程器的最新信息。编程器包括 MPLAB PM3 和 PRO MATE? II 器件编程器,以及 PICSTART? Plus 开发编程器。

客户支持
Microchip 产品的用户可通过以下渠道获得帮助: ? ? ? ? ? 代理商或代表 当地销售办事处 应用工程师 (FAE) 技术支持 开发系统信息热线

客户应联系其代理商、代表或应用工程师 (FAE)寻求支持。当地销售办事处也可为 客户提供帮助。本文档后附有销售办事处的联系方式。 也可通过 http://support.microchip.com 获得网上技术支持。

DS51297F_CN 第 4 页

? 2005 Microchip Technology Inc.

MPLAB? C18 C 编译器 函数库 第 1 章 概述
1.1 简介
本章概括了可在应用程序中包含的 MPLAB C18 库文件和预编译目标文件。

1.2

MPLAB C18 函数库概述
函数库是为便于引用和链接而分类形成的函数集合。可参阅 《MPASM? 汇编器、 MPLINK? 目标链接器和 MPLIB? 目标库管理器用户指南》 (DS33014J_CN) ,获得 更多关于创建和维护函数库的信息。 MPLAB C18 函数库在安装目录下的 lib 子目录中。 这些函数库可通过 MPLINK 链接器 直接链接到应用程序中。 这些文件在 c:\mcc18\src 目录下进行预编译。目录 src\traditional 包含非扩 展模式的文件,目录 src\extended 包含扩展模式的文件。假如你选择不把编译器和 相关文件安装到 c:\mcc18 目录下,那么链接器列表文件中不会显示函数库的源代 码,使用 MPLAB IDE 时也不能单步执行函数库的源代码。 为了在 .lst 文件中包含库函数代码和能够单步执行库函数,可以按照第 1.3.3 节、第 1.4.3 节和第 1.5.3 节中的说明,使用 src、 src\traditional 和 src\extended 目录下的批处理文件 (.bat)重建函数库。

1.3

启动代码
1.3.1 概述
MPLAB C18 提供了三个版本的启动代码,其初始化级别不同。c018*.o 目标文件用于 工作在非扩展模式的编译器。 c018*_e.o 目标文件用于工作在扩展模式的编译器。按 照复杂程度递增的顺序排列为: c018.o/c018_e.o 初始化 C 软件堆栈,然后跳转到应用函数 main() 的开头。 c018i.o/c018i_e.o 执行所有与 c018.o/c018_e.o 相同的任务,且在调用用户的 应用程序之前,为需要初始化的数据赋值。 如果全局变量或静态变量在定义时已赋值, 也需要进行初始化。这是包含在随 MPLAB C18 提供的链接描述文件中的启动代码。 c018iz.o/c018iz_e.o 执行所有与 c018.o/c018_e.o 相同的任务, 并按照严格符 合 ANSI 的要求,将所有未初始化的变量赋值为 0。

? 2005 Microchip Technology Inc.

DS51297F_CN 第 5 页

MPLAB? C18 C 编译器函数库
1.3.2 源代码
启动子程序的源代码保存在编译器安装目录的 src\traditional\ startup 和 src\extended\startup 子目录中。

1.3.3

重建

批处理文件 makestartup.bat 可用来创建启动代码,并把生成的目标文件复制到 lib 目录中。 使用 makestartup.bat 重建代码之前,检查 MPLAB C18 (mcc18.exe)是否在正 确的路径中。

1.4

处理器内核函数库
1.4.1 概述
标准 C 函数库(clib.lib 或 clib_e.lib)提供了 PIC18 内核架构支持的函数,本系 列中所有处理器都支持这些函数。将在以下章节中描述这些函数: ? 第 4 章 “通用软件函数库” ? 第 5 章 “数学函数库”

1.4.2
? ? ? ? ? ?

源代码

可以在编译器安装目录的下列子目录中找到标准 C 函数库中函数的源代码: src\traditional\math src\extended\math src\traditional\delays src\extended\delays src\traditional\stdclib src\extended\stdclib

1.4.3

重建

可以使用批处理文件 makeclib.bat 重建处理器内核函数库。在调用这个批处理文件 之前,确认下列工具在相应路径中: ? MPLAB C18 (mcc18.exe) ? MPASM 汇编器 (mpasm.exe) ? MPLIB 库管理器 (mplib.exe) 在重建标准 C 函数库之前,确保环境变量 MCC_INCLUDE 已经设置为 MPLAB C18 头文 件的路径 (如 c:\mcc18\h) 。

DS51297F_CN 第 6 页

? 2005 Microchip Technology Inc.

概述
1.5 特定处理器的函数库
1.5.1 概述
特定处理器的库文件包含 PIC18 系列各成员的定义,对于不同的处理器,这些定义可 能有所不同。其中包括所有外设子程序和特殊功能寄存器 (Special Function Register, SFR)定义。所提供的外设子程序包括为使用硬件外设设计的子程序以及使 用通用 I/O 口实现外设接口的子程序。以下章节描述特定处理器函数库中的函数: ? 第 2 章 “硬件外设函数” ? 第 3 章 “软件外设函数库” 特定处理器的函数库命名为: p processor.lib — 非扩展模式特定处理器函数库 p processor_e.lib — 扩展模式特定处理器函数库 例如,对于 PIC18F4620 库的非扩展版本,其库文件命名为 p18f4620.lib ;对于库 的扩展版本,其库文件命名为 p18f4620_e.lib。

1.5.2
? ? ? ?

源代码

特定处理器函数库的源代码可在编译器安装目录的以下子目录中找到: src\traditional\pmc src\extended\pmc src\traditional\proc src\extended\proc

1.5.3

重建

可以使用批处理文件 makeplib.bat 重建特定处理器的函数库。在调用此批处理文件 之前,要确保下列工具在相应路径中: ? MPLAB C18 (mcc18.exe) ? MPASM 汇编器 (mpasm.exe) ? MPLIB 库管理器 (mplib.exe) 在调用 makeplib.bat 之前,确保环境变量 MCC_INCLUDE 已经设置为 MPLAB C18 头 文件的路径 (如 c:\mcc18\h) 。

? 2005 Microchip Technology Inc.

DS51297F_CN 第 7 页

MPLAB? C18 C 编译器函数库
注:

DS51297F_CN 第 8 页

? 2005 Microchip Technology Inc.

MPLAB? C18 C 编译器 函数库 第 2 章 硬件外设函数
2.1 简介
本章描述特定处理器函数库中的硬件外设函数,所有这些函数的源代码都包含在 MPLAB C18 编译器安装目录的 src\pmc 和 src\extended\pmc 子目录下。 更多有关使用 MPLIB 函数库管理器管理函数库的信息,可参阅 《MPASM? 汇编器、 MPLINK? 目标链接器和 MPLIB? 目标库管理器用户指南》 (DS33014J_CN) 。 MPLAB C18 库函数支持下列外设: ? ? ? ? ? ? ? ? ? A/D 转换器 (第 2.2 节 “A/D 转换器函数” ) 输入捕捉 (第 2.3 节 “输入捕捉函数” ) I2C? (第 2.4 节 “I?C? 函数” ) I/O 口 (第 2.5 节 “I/O 口函数” ) Microwire (第 2.6 节 “Microwire 函数” ) 脉宽调制 (Pulse-Width Modulation, PWM) (第 2.7 节 “脉宽调制函数” ) SPI (第 2.8 节 “SPI 函数” ) 定时器 (第 2.9 节 “定时器函数” ) USART (第 2.10 节 “USART 函数” )

2.2

A/D 转换器函数
下列函数支持 A/D 外设: 表 2-1:
函数 BusyADC CloseADC ConvertADC OpenADC ReadADC SetChanADC 禁止 A/D 转换器。 启动 A/D 转换。 配置 A/D 转换器。 读取 A/D 转换的结果。 选择要使用的 A/D 通道。

A/D 转换器函数
描述 A/D 转换器是否正在进行转换?

? 2005 Microchip Technology Inc.

DS51297F_CN 第 9 页

MPLAB? C18 C 编译器函数库
2.2.1 函数描述

BusyADC
功能: 头文件: 函数原型: 说明: 返回值: 文件名: A/D 转换器是否正在进行转换? adc.h char BusyADC( void ); 该函数表明 A/D 外设是否正在进行转换。 如果 A/D 外设正在进行转换,为 1 ; 如果 A/D 外设不在进行转换,为 0。 adcbusy.c

CloseADC
功能: 头文件: 函数原型: 说明: 文件名: 禁止 A/D 转换器。 adc.h void CloseADC( void ); 该函数禁止 A/D 转换器和 A/D 中断机制。 adcclose.c

ConvertADC
功能: 头文件: 函数原型: 说明: 文件名: 启动 A/D 转换过程。 adc.h void ConvertADC( void ); 该函数启动 A/D 转换。可用函数 BusyADC() 来检测转换是否完成。 adcconv.c

OpenADC PIC18CXX2, PIC18FXX2, PIC18FXX8, PIC18FXX39
功能: 头文件: 函数原型: 参数: 配置 A/D 转换器。 adc.h void OpenADC( unsigned char config, unsigned char config2 ); config 从下面所列出各类型中分别取一个值并相与 (‘&’)所得的值。这些值在 文件 adc.h 中定义。 A/D 时钟源: ADC_FOSC_2 ADC_FOSC_4 ADC_FOSC_8 ADC_FOSC_16 ADC_FOSC_32 ADC_FOSC_64 ADC_FOSC_RC A/D 结果对齐: ADC_RIGHT_JUST ADC_LEFT_JUST FOSC / 2 FOSC / 4 FOSC / 8 FOSC / 16 FOSC / 32 FOSC / 64 内部 RC 振荡器 结果向最低有效位对齐 (右对齐) 结果向最高有效位对齐 (左对齐)

DS51297F_CN 第 10 页

? 2005 Microchip Technology Inc.

硬件外设函数
OpenADC PIC18CXX2, PIC18FXX2, PIC18FXX8, PIC18FXX39 (续)
A/D 参考电压源: ADC_8ANA_0REF ADC_7ANA_1REF ADC_6ANA_2REF ADC_6ANA_0REF ADC_5ANA_1REF ADC_5ANA_0REF ADC_4ANA_2REF ADC_4ANA_1REF ADC_3ANA_2REF ADC_3ANA_0REF ADC_2ANA_2REF ADC_2ANA_1REF ADC_1ANA_2REF ADC_1ANA_0REF ADC_0ANA_0REF VREF+=VDD, VREF-=VSS, 所有通道都是模拟通道 AN3=VREF+,除 AN3 外都是模拟通道 AN3=VREF+, AN2=VREF VREF+=VDD, VREF-=VSS AN3=VREF+, VREF-=VSS VREF+=VDD, VREF-=VSS AN3=VREF+, AN2=VREFAN3=VREF+ AN3=VREF+, AN2=VREFVREF+=VDD, VREF-=VSS AN3=VREF+, AN2=VREFAN3=VREF+ AN3=VREF+, AN2=VREF-, AN0=A AN0 为模拟输入 所有通道都是数字 I/O

config2 从下面所列出各类型中分别取一个值并相与 (‘&’)所得的值。这些值在 文件 adc.h 定义。 通道: ADC_CH0 ADC_CH1 ADC_CH2 ADC_CH3 ADC_CH4 ADC_CH5 ADC_CH6 ADC_CH7 A/D 中断: ADC_INT_ON ADC_INT_OFF 说明: 文件名: 代码示例: 通道 0 通道 1 通道 2 通道 3 通道 4 通道 5 通道 6 通道 7 允许中断 禁止中断

该函数把 A/D 外设复位到上电复位 (POR)状态,且根据指定的选择, 配置与 A/D 相关的特殊功能寄存器 (SFR) 。 adcopen.c OpenADC( ADC_FOSC_32 ADC_RIGHT_JUST ADC_1ANA_0REF, ADC_CH0 ADC_INT_OFF & & & );

? 2005 Microchip Technology Inc.

DS51297F_CN 第 11 页

MPLAB? C18 C 编译器函数库
OpenADC PIC18C658/858, PIC18C601/801, PIC18F6X20, PIC18F8X20
功能: 头文件: 函数原型: 参数: 配置 A/D 转换器。 adc.h void OpenADC( unsigned char config, unsigned char config2 ); config 从下面所列出各类型中分别取一个值并相与 (‘&’)所得的值。这些值在 文件 adc.h 定义。 A/D 时钟源: ADC_FOSC_2 ADC_FOSC_4 ADC_FOSC_8 ADC_FOSC_16 ADC_FOSC_32 ADC_FOSC_64 ADC_FOSC_RC A/D 结果对齐: ADC_RIGHT_JUST ADC_LEFT_JUST A/D 端口配置: ADC_0ANA ADC_1ANA ADC_2ANA ADC_3ANA ADC_4ANA ADC_5ANA ADC_6ANA ADC_7ANA ADC_8ANA ADC_9ANA ADC_10ANA ADC_11ANA ADC_12ANA ADC_13ANA ADC_14ANA ADC_15ANA FOSC / 2 FOSC / 4 FOSC / 8 FOSC / 16 FOSC / 32 FOSC / 64 内部 RC 振荡器 结果向最低有效位对齐 (右对齐) 结果向最高有效位对齐 (左对齐)

所有端口都是数字端口 模拟端口:AN0 模拟端口:AN0-AN1 模拟端口:AN0-AN2 模拟端口:AN0-AN3 模拟端口:AN0-AN4 模拟端口:AN0-AN5 模拟端口:AN0-AN6 模拟端口:AN0-AN7 模拟端口:AN0-AN8 模拟端口:AN0-AN9 模拟端口:AN0-AN10 模拟端口:AN0-AN11 模拟端口:AN0-AN12 模拟端口:AN0-AN13 所有端口都是模拟端口

数字端口:AN1-AN15 数字端口:AN2-AN15 数字端口:AN3-AN15 数字端口:AN4-AN15 数字端口:AN5-AN15 数字端口:AN6-AN15 数字端口:AN7-AN15 数字端口:AN8-AN15 数字端口:AN9-AN15 数字端口:AN10-AN15 数字端口:AN11-AN15 数字端口:AN12-AN15 数字端口:AN13-AN15 数字端口:AN14-AN15

config2 从下面所列出各类型中分别取一个值并相与 (‘&’)所得的值。这些值在 文件 adc.h 定义。

DS51297F_CN 第 12 页

? 2005 Microchip Technology Inc.

硬件外设函数
OpenADC PIC18C658/858, PIC18C601/801, PIC18F6X20, PIC18F8X20 (续)
通道: ADC_CH0 ADC_CH1 ADC_CH2 ADC_CH3 ADC_CH4 ADC_CH5 ADC_CH6 ADC_CH7 ADC_CH8 ADC_CH9 ADC_CH10 ADC_CH11 ADC_CH12 ADC_CH13 ADC_CH14 ADC_CH15 A/D 中断: ADC_INT_ON ADC_INT_OFF 通道 0 通道 1 通道 2 通道 3 通道 4 通道 5 通道 6 通道 7 通道 8 通道 9 通道 10 通道 11 通道 12 通道 13 通道 14 通道 15 允许中断 禁止中断 VREF+ = AVDD VREF+ = 外接

A/D VREF+ 配置: ADC_VREFPLUS_VDD ADC_VREFPLUS_EXT A/D VREF- 配置: ADC_VREFMINUS_VSS ADC_VREFMINUS_EXT 说明: 文件名: 代码示例:

VREF- = AVSS VREF- = 外接

该函数把与 A/D 相关的寄存器复位到 POR 状态,然后配置时钟、结果 格式、参考电压、端口和通道。 adcopen.c OpenADC( ADC_FOSC_32 ADC_RIGHT_JUST ADC_14ANA, ADC_CH0 ADC_INT_OFF & & & );

? 2005 Microchip Technology Inc.

DS51297F_CN 第 13 页

MPLAB? C18 C 编译器函数库
OpenADC 所有其他处理器
功能: 头文件: 函数原型: 配置 A/D 转换器。 adc.h void OpenADC(unsigned char config, unsigned char config2 , unsigned char portconfig); config 从下面所列出各类型中分别取一个值并相与 (‘&’)所得的值。这些值在 文件 adc.h 定义。 A/D 时钟源: ADC_FOSC_2 ADC_FOSC_4 ADC_FOSC_8 ADC_FOSC_16 ADC_FOSC_32 ADC_FOSC_64 ADC_FOSC_RC A/D 结果对齐: ADC_RIGHT_JUST ADC_LEFT_JUST A/D 采集时间选择: ADC_0_TAD ADC_2_TAD ADC_4_TAD ADC_6_TAD ADC_8_TAD ADC_12_TAD ADC_16_TAD ADC_20_TAD FOSC / 2 FOSC / 4 FOSC / 8 FOSC / 16 FOSC / 32 FOSC / 64 内部 RC 振荡器 结果向最低有效位对齐 (右对齐) 结果向最高有效位对齐 (左对齐) 0 Tad 2 Tad 4 Tad 6 Tad 8 Tad 12 Tad 16 Tad 20 Tad

参数:

config2 从下面所列出各类型中分别取一个值并相与 (‘&’)所得的值。这些值在 文件 adc.h 定义。 通道: ADC_CH0 ADC_CH1 ADC_CH2 ADC_CH3 ADC_CH4 ADC_CH5 ADC_CH6 ADC_CH7 ADC_CH8 ADC_CH9 ADC_CH10 ADC_CH11 ADC_CH12 ADC_CH13 ADC_CH14 ADC_CH15 通道 0 通道 1 通道 2 通道 3 通道 4 通道 5 通道 6 通道 7 通道 8 通道 9 通道 10 通道 11 通道 12 通道 13 通道 14 通道 15

DS51297F_CN 第 14 页

? 2005 Microchip Technology Inc.

硬件外设函数
OpenADC 所有其他处理器 (续)
A/D 中断: ADC_INT_ON ADC_INT_OFF 允许中断 禁止中断 VREF+ = AVDD VREF+ = 外接 VREF- = AVDD VREF- = 外接

A/D 电压配置: ADC_VREFPLUS_VDD ADC_VREFPLUS_EXT ADC_VREFMINUS_VDD ADC_VREFMINUS_EXT

portconfig 对于 PIC18F1220/1320, portconfig 的取值范围是 0 到 127 之间 (包括 0 和 127);对于所有其他处理器, portconfig 的取值范围是 0 到 15 之间 (包括 0 和 15) 。这是 ADCON1 寄存器的端口配置位 bit 0 至 bit 6 或 bit 0 至 bit 3 的值。 说明: 文件名: 代码示例: 该函数把与 A/D 相关的寄存器复位到 POR 状态,然后配置时钟、结果 格式、参考电压、端口和通道。 adcopen.c OpenADC( ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_12_TAD, ADC_CH0 & ADC_INT_OFF, 15 );

ReadADC
功能: 头文件: 函数原型: 说明: 返回值: 读取 A/D 转换的结果。 adc.h int ReadADC( void ); 该函数读取 A/D 转换的 16 位结果。 该函数返回 A/D 转换的 16 位有符号结果。根据 A/D 转换器的配置 ( 例 如,使用函数 OpenADC()),结果会包含在 16 位结果的低有效位或高 有效位中。 adcread.c

文件名:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 15 页

MPLAB? C18 C 编译器函数库
SetChanADC
功能: 头文件: 函数原型: 参数: 选择用作 A/D 转换器输入的通道。 adc.h void SetChanADC( unsigned char channel ); channel 下列值之一 (在 adc.h 中定义) : ADC_CH0 通道 0 ADC_CH1 通道 1 ADC_CH2 通道 2 ADC_CH3 通道 3 ADC_CH4 通道 4 ADC_CH5 通道 5 ADC_CH6 通道 6 ADC_CH7 通道 7 ADC_CH8 通道 8 ADC_CH9 通道 9 ADC_CH10 通道 10 ADC_CH11 通道 11 选择用作 A/D 转换器输入的引脚。 adcsetch.c SetChanADC( ADC_CH0 );

说明: 文件名: 代码示例:

2.2.2
#include #include #include #include

使用 A/D 转换器函数的例子
<p18C452.h> <adc.h> <stdlib.h> <delays.h>

int result; void main( void ) { // configure A/D convertor OpenADC( ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_8ANA_0REF, ADC_CH0 & ADC_INT_OFF ); Delay10TCYx( 5 ); ConvertADC(); while( BusyADC() ); result = ReadADC(); CloseADC(); } // // // // // Delay for 50TCY Start conversion Wait for completion Read result Disable A/D converter

DS51297F_CN 第 16 页

? 2005 Microchip Technology Inc.

硬件外设函数
2.3 输入捕捉函数
下列函数支持捕捉外设。 表 2-2: 输入捕捉函数
函数 CloseCapturex OpenCapturex ReadCapturex CloseECapturex(1) OpenECapturex(1) ReadECapturex(1) 注 禁止捕捉外设 x。 配置捕捉外设 x。 从捕捉外设 x 读取值。 禁止增强型捕捉外设 x。 配置增强型捕捉外设 x。 从增强型捕捉外设 x 读取值。 描述

1: 仅带有 ECCPxCONT 寄存器的器件具有增强捕捉功能。

2.3.1

函数描述

CloseCapture1 CloseCapture2 CloseCapture3 CloseCapture4 CloseCapture5 CloseECapture1
功能: 头文件: 函数原型: 禁止输入捕捉 x。 capture.h void void void void void void CloseCapture1( void ); CloseCapture2( void ); CloseCapture3( void ); CloseCapture4( void ); CloseCapture5( void ); CloseECapture1( void );

说明: 文件名:

该函数禁止与指定输入捕捉相对应的中断。 cp1close.c cp2close.c cp3close.c cp4close.c cp5close.c ep1close.c

? 2005 Microchip Technology Inc.

DS51297F_CN 第 17 页

MPLAB? C18 C 编译器函数库
OpenCapture1 OpenCapture2 OpenCapture3 OpenCapture4 OpenCapture5 OpenECapture1
功能: 头文件: 函数原型: 配置并使能输入捕捉 x。 capture.h void void void void void void OpenCapture1( unsigned char config ); OpenCapture2( unsigned char config ); OpenCapture3( unsigned char config ); OpenCapture4( unsigned char config ); OpenCapture5( unsigned char config ); OpenECapture1( unsigned char config );

参数:

config 从下面所列出各类型中分别取一个值并相与 (‘&’)所得的值。这些值在 capture.h 文件中定义。 使能 CCP 中断: CAPTURE_INT_ON CAPTURE_INT_OFF 使能中断 禁止中断

中断触发 (用 CCP 模块号代替 x ) : Cx_EVERY_FALL_EDGE 每个下降沿产生中断 Cx_EVERY_RISE_EDGE 每个上升沿产生中断 Cx_EVERY_4_RISE_EDGE 每 4 个上升沿产生 1 个中断 Cx_EVERY_16_RISE_EDGE 每 16 个上升沿产生 1 个中断 EC1_EVERY_FALL_EDGE 每个下降沿产生中断 (增强型) EC1_EVERY_RISE_EDGE 每个上升沿产生中断 (增强型) EC1_EVERY_4_RISE_EDGE 每 4 个上升沿产生 1 个中断(增强 型) EC1_EVERY_16_RISE_EDGE 每 16 个上升沿产生 1 个中断(增 强型) 说明: 该函数首先把捕捉模块复位到 POR 状态,然后将输入捕捉配置为指定 的边沿检测。 捕捉函数使用在 capture.h 中定义的一个结构,来指示每个捕捉模块 的溢出状态。此结构名为 CapStatus,包含如下位域: Cap1OVF Cap2OVF Cap3OVF Cap4OVF Cap5OVF ECap1OVF 进行任何捕捉操作之前,不仅要配置和使能捕捉模块,还要使能相应的 定时器模块。关于 CCP 和定时器连接配置的信息,请参见相应的数据 手册;关于函数 OpenTimer3 中使用的参数的信息,请参见第 2.9 节 “定时器函数” 。

DS51297F_CN 第 18 页

? 2005 Microchip Technology Inc.

硬件外设函数
OpenCapture1 OpenCapture2 OpenCapture3 OpenCapture4 OpenCapture5 OpenECapture1 (续)
文件名: cp1open.c cp2open.c cp3open.c cp4open.c cp5open.c ep1open.c OpenCapture1( CAPTURE_INT_ON & C1_EVERY_4_RISE_EDGE );

代码示例:

ReadCapture1 ReadCapture2 ReadCapture3 ReadCapture4 ReadCapture5 ReadECapture1
功能: 头文件: 函数原型: 从指定的输入捕捉中读取捕捉事件的结果。 capture.h unsigned unsigned unsigned unsigned unsigned unsigned int int int int int int ReadCapture1( void ); ReadCapture2( void ); ReadCapture3( void ); ReadCapture4( void ); ReadCapture5( void ); ReadECapture1( void );

说明: 返回值: 文件名:

该函数读取各个输入捕捉特殊功能寄存器的值。 该函数返回捕捉事件的结果。 cp1read.c cp2read.c cp3read.c cp4read.c cp5read.c ep1read.c

? 2005 Microchip Technology Inc.

DS51297F_CN 第 19 页

MPLAB? C18 C 编译器函数库
2.3.2
#include #include #include #include #include

使用输入捕捉函数的例子
<p18C452.h> <capture.h> <timers.h> <usart.h> <stdlib.h>

该示例说明在 “查询” (非中断驱动)环境下如何使用捕捉库函数。

void main(void) { unsigned int result; char str[7]; // Configure Capture1 OpenCapture1( C1_EVERY_4_RISE_EDGE & CAPTURE_INT_OFF ); // Configure Timer3 OpenTimer3( TIMER_INT_OFF & T3_SOURCE_INT ); // Configure USART OpenUSART( USART_TX_INT_OFF USART_RX_INT_OFF USART_ASYNCH_MODE USART_EIGHT_BIT USART_CONT_RX, 25 );

& & & &

while(!PIR1bits.CCP1IF); // Wait for event result = ReadCapture1(); // read result ultoa(result,str); // convert to string // Write the string out to the USART if // an overflow condition has not occurred. if(!CapStatus.Cap1OVF) { putsUSART(str); } // Clean up CloseCapture1(); CloseTimer3(); CloseUSART(); }

DS51297F_CN 第 20 页

? 2005 Microchip Technology Inc.

硬件外设函数
2.4 I?C? 函数
为具有一个 I2C 外设的器件提供了下列函数: 表 2-3:
函数 AckI2C CloseI2C DataRdyI2C getcI2C getsI2C IdleI2C NotAckI2C OpenI2C putcI2C putsI2C ReadI2C RestartI2C StartI2C StopI2C WriteI2C 产生 I C? 总线应答条件。 禁止 SSP 模块。 I2C 缓冲区中是否有数据? 从 I2C 总线读取一个字节。 从工作在主 I2C 模式的 I2C 总线读取一个数据串。 循环直到 I2C 总线空闲。 产生 I2C 总线不应答条件。 配置 SSP 模块。 写一个字节到 I2C 总线。 写一个数据串到工作在主模式或从模式的 I2C 总线。 从 I2C 总线上读取一个字节。 产生 I2C 总线重复启动条件。 产生 I2C 总线启动条件。 产生 I2C 总线停止条件。 写一个字节到 I2C 总线。
2

单个 I2C? 外设函数
描述

为具有多个 I2C 外设的器件提供了下列函数: 表 2-4:
函数 AckI2Cx CloseI2Cx DataRdyI2Cx getcI2Cx getsI2Cx IdleI2Cx NotAckI2Cx OpenI2Cx putcI2Cx putsI2Cx ReadI2Cx RestartI2Cx StartI2Cx StopI2Cx WriteI2Cx 产生 I2Cx 总线应答条件。 禁止 SSPx 模块。 I2Cx 缓冲区中是否有数据? 从 I2Cx 总线读取一个字节。 从工作在主 I2C 模式的 I2Cx 总线读取一个数据串。 循环直到 I2Cx 总线空闲。 产生 I2Cx 总线不应答条件。 配置 SSPx 模块。 写一个字节到 I2Cx 总线。 写一个数据串到工作在主模式或从模式的 I2Cx 总线。 从 I2Cx 总线上读取一个字节。 产生 I2Cx 总线重复启动条件。 产生 I2Cx 总线启动条件。 产生 I2Cx 总线停止条件。 写一个字节到 I2Cx 总线。

多个 I2C? 外设函数
描述

? 2005 Microchip Technology Inc.

DS51297F_CN 第 21 页

MPLAB? C18 C 编译器函数库
还提供了下列函数,用于与采用 I2C 接口的电可擦除 (EE)存储器 (如 Microchip 的 24LC01B)接口: 表 2-5:
函数 EEAckPollingx EEByteWritex EECurrentAddReadx EEPageWritexx EERandomReadx EESequentialReadx 产生应答查询序列。 写入一个字节。 从下一个地址读取一个字节。 写入一个数据串。 从任意地址读取一个字节。 读取一个数据串。

电可擦除存储器接口函数
描述

2.4.1

函数描述

AckI2C AckI2C1 AckI2C2
功能: 头文件: 函数原型: 产生 I2C 总线应答条件。 i2c.h void AckI2C( void ); void AckI2C1( void ); void AckI2C2( void ); 该函数产生 I2Cx 总线应答条件。 i2c_ack.c i2c1ack.c i2c2ack.c

说明: 文件名:

CloseI2C CloseI2C1 CloseI2C2
功能: 头文件: 函数原型: 禁止 SSPx 模块。 i2c.h void CloseI2C( void ); void CloseI2C1( void ); void CloseI2C2( void ); 该函数禁止 SSPx 模块。 i2c_close.c i2c1close.c i2c2close.c

说明: 文件名:

DS51297F_CN 第 22 页

? 2005 Microchip Technology Inc.

硬件外设函数
DataRdyI2C DataRdyI2C1 DataRdyI2C2
功能: 头文件: 函数原型: I2Cx 缓冲区中是否有数据? i2c.h unsigned char DataRdyI2C( void ); unsigned char DataRdyI2C1( void ); unsigned char DataRdyI2C2( void ); 确定 SSPx 缓冲区中是否有数据可读。 如果 SSPx 缓冲区中有数据,为 1 ; 如果 SSPx 缓冲区中没有数据,则为 0。 i2c_dtrd.c i2c1dtrd.c i2c2dtrd.c if (DataRdyI2C()) { var = getcI2C(); }

说明: 返回值: 文件名:

代码示例:

getcI2C getcI2C1 getcI2C2
getcI2Cx 定义为 ReadI2Cx。参见 ReadI2Cx。

getsI2C getsI2C1 getsI2C2
功能: 头文件: 函数原型: 从工作在主 I2C 模式的 I2Cx 总线上读取一个固定长度的数据串。 i2c.h unsigned char getsI2C( unsigned char unsigned char unsigned char getsI2C1( unsigned char unsigned char unsigned char getsI2C2( unsigned char unsigned char * rdptr, length ); * rdptr, length ); * rdptr, length );

参数:

rdptr 指向用于存储从 I2Cx 器件所读取数据的 PICmicro RAM 的字符型指针。 length 从 I2Cx 器件读取的字节数。 该函数从 I2Cx 总线上读取一个预定义长度的数据串。

说明:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 23 页

MPLAB? C18 C 编译器函数库
getsI2C getsI2C1 getsI2C2 (续)
返回值: 文件名: 如果所有字节都发送完毕,为 0 ; 如果发生总线冲突,则为 -1 。 i2c_gets.c i2c1gets.c i2c2gets.c unsigned char string[15]; getsI2C(string, 15);

代码示例:

IdleI2C IdleI2C1 IdleI2C2
功能: 头文件: 函数原型: 说明: 循环直到 I2Cx 总线空闲。 i2c.h void IdleI2C( void ); 该函数检查 I2C 外设的状态并且等待总线变为空闲。由于硬件 I2C 外设 不允许队列缓冲总线序列,所以需要函数 IdleI2C。在开始 I2C 操作 或者产生写冲突之前, I2C 外设必须处于空闲状态。 idlei2c.c

文件名:

NotAckI2C
功能: 头文件: 函数原型: 产生 I2Cx 总线不应答条件。 i2c.h void NotAckI2C( void ); void NotAckI2C1( void ); void NotAckI2C2( void ); 该函数产生 I2Cx 总线不应答条件。 i2c_nack.c i2c1nack.c i2c2nack.c

说明: 文件名:

DS51297F_CN 第 24 页

? 2005 Microchip Technology Inc.

硬件外设函数
OpenI2C OpenI2C1 OpenI2C2
功能: 头文件: 函数原型: 配置 SSPx 模块。 i2c.h void OpenI2C( unsigned char sync_mode, unsigned char slew ); void OpenI2C1( unsigned char sync_mode, unsigned char slew ); void OpenI2C2( unsigned char sync_mode, unsigned char slew ); sync_mode 在 i2c.h 中定义的下列值之一: SLAVE_7 I2C 从模式, 7 位地址 SLAVE_10 I2C 从模式, 10 位地址 MASTER I2C 主模式 slew 在 i2c.h 中定义的下列值之一: SLEW_OFF 在 100 kHz 模式下禁止压摆率。 SLEW_ON 在 400 kHz 模式下使能压摆率。 说明: 文件名: OpenI2Cx函数把SSPx模块复位到POR状态, 然后将模块配置为主/从 模式及选择的压摆率。 i2c_open.c i2c1open.c i2c2open.c OpenI2C(MASTER, SLEW_ON);

参数:

代码示例:

putcI2C putcI2C1 putcI2C2
putcI2Cx 定义为 WriteI2Cx。参见 WriteI2Cx。

? 2005 Microchip Technology Inc.

DS51297F_CN 第 25 页

MPLAB? C18 C 编译器函数库
putsI2C putsI2C1 putsI2C2
功能: 头文件: 函数原型: 向工作在主模式或从模式的 I2Cx 总线写一个数据串。 i2c.h unsigned char putsI2C( unsigned char *wrptr ); unsigned char putsI2C1( unsigned char *wrptr ); unsigned char putsI2C2( unsigned char *wrptr ); wrptr 指向要写到 I2Cx 总线的数据的指针。 该函数向 I2Cx 总线写一个数据串,直到出现空字符为止。不传送空字 符本身。该函数可以工作在主模式或从模式。 主 I2C 模式: 如果在数据串中遇到空字符,为 0 ; 如果从 I2Cx 器件响应一个不应答 Not Ack 信号,为 -2 ; 如果发生写冲突,则为 -3 。 从 I2C 模式: 如果在数据串中遇到空字符,为 0 ; 如果主 I2Cx 器件响应一个终止数据传送的不应答 Not Ack 信号,为 -2 。 i2c_puts.c i2c1puts.c i2c2puts.c unsigned char string[] = “data to send”; putsI2C(string);

参数: 说明: 返回值:

文件名:

代码示例:

ReadI2C ReadI2C1 ReadI2C2 getcI2C getcI2C1 getcI2C2
功能: 头文件: 函数原型: 从 I2Cx 总线读取一个字节。 i2c.h unsigned unsigned unsigned unsigned unsigned unsigned char char char char char char ReadI2C ( void ); ReadI2C1 ( void ); ReadI2C2 ( void ); getcI2C ( void ); getcI2C1 ( void ); getcI2C2 ( void );

说明: 返回值:

该函数从 I2Cx 总线上读入一个字节。 getcI2Cx 在 i2c.h 中定义为 ReadI2Cx。 从 I2Cx 总线上读取的数据字节。

DS51297F_CN 第 26 页

? 2005 Microchip Technology Inc.

硬件外设函数
ReadI2C ReadI2C1 ReadI2C2 getcI2C getcI2C1 getcI2C2 (续)
文件名: i2c_read.c i2c1read.c i2c2read.c # define in i2c.h # define in i2c.h # define in i2c.h unsigned char value; value = ReadI2C();

代码示例:

RestartI2C RestartI2C1 RestartI2C2
功能: 头文件: 函数原型: 产生 I2Cx 总线重复启动条件。 i2c.h void RestartI2C( void ); void RestartI2C1( void ); void RestartI2C2( void ); 该函数产生 I2Cx 总线重复启动条件。 i2c_start.c i2c1start.c i2c2start.c

说明: 文件名:

StartI2C StartI2C1 StartI2C2
功能: 头文件: 函数原型: 产生 I2Cx 总线启动条件。 i2c.h void StartI2C( void ); void StartI2C1( void ); void StartI2C2( void ); 该函数产生 I2Cx 总线启动条件。 i2c_start.c i2c1start.c i2c2start.c

说明: 文件名:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 27 页

MPLAB? C18 C 编译器函数库
StopI2C StopI2C1 StopI2C2
功能: 头文件: 函数原型: 产生 I2Cx 总线停止条件。 i2c.h void StopI2C( void ); void StopI2C1( void ); void StopI2C2( void ); 该函数产生 I2Cx 总线停止条件。 i2c_stop.c i2c1stop.c i2c2stop.c

说明: 文件名:

WriteI2C putcI2C WriteI2C1 WriteI2C2 putcI2C putcI2C1 putcI2C2
功能: 头文件: 函数原型: 向 I2Cx 总线器件写一个字节。 i2c.h unsigned char WriteI2C( unsigned char data_out unsigned char WriteI2C1( unsigned char data_out unsigned char WriteI2C2( unsigned char data_out unsigned char putcI2C( unsigned char data_out unsigned char putcI2C1( unsigned char data_out unsigned char putcI2C2( unsigned char data_out ); ); ); ); ); );

参数:

data_out 要写到 I2Cx 总线器件的一字节数据。 putcI2Cx 在 i2c.h 中定义为 iWriteI2Cx。 该函数向 I2Cx 总线器件写一字节数据。 如果写入成功,为 0 ; 如果发生写冲突,则为 -1。 i2c_write.c i2c1write.c i2c2write.c #define in i2c.h #define in i2c.h #define in i2c.h WriteI2C(‘a’);

说明: 返回值: 文件名:

代码示例:

DS51297F_CN 第 28 页

? 2005 Microchip Technology Inc.

硬件外设函数
2.4.2 电可擦除存储器件接口函数描述

EEAckPolling EEAckPolling1 EEAckPolling2
功能: 头文件: 函数原型: 为 Microchip 的电可擦除 I2C 存储器件产生应答查询序列。 i2c.h unsigned char unsigned unsigned char unsigned unsigned char unsigned EEAckPolling( char control ); EEAckPolling1( char control ); EEAckPolling2( char control );

参数: 说明: 返回值:

control EEPROM 控制 / 总线器件的地址选择字节。 该函数为利用应答查询的电可擦除 I2C 存储器件产生应答查询序列。 如果没有发生错误,为 0 ; 如果发生总线冲突错误,为 -1 ; 如果发生写冲突错误,则为 -3。 i2c_ecap.c i2c1ecap.c i2c2ecap.c temp = EEAckPolling(0xA0);

文件名:

代码示例:

EEByteWrite EEByteWrite1 EEByteWrite2
功能: 头文件: 函数原型: 向 I2Cx 总线写一个字节。 i2c.h unsigned char unsigned unsigned unsigned unsigned char unsigned unsigned unsigned unsigned char unsigned unsigned unsigned EEByteWrite( char control, char address, char data ); EEByteWrite1( char control, char address, char data ); EEByteWrite2( char control, char address, char data );

参数:

control EEPROM 控制 / 总线器件的地址选择字节。 address EEPROM 的内部地址单元。 data 要写到 EEPROM 中函数地址参数所指定地址的数据。 该函数把一字节数据写到 I2Cx 总线,也适用于仅需单字节地址信息的 任何 Microchip I2C 电可擦除存储器件。

说明:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 29 页

MPLAB? C18 C 编译器函数库
EEByteWrite EEByteWrite1 EEByteWrite2 (续)
返回值: 如果没有发生任何错误,为 0 ; 如果发生总线冲突错误,为 -1 ; 如果发生不应答错误,为 -2 ; 如果发生写冲突错误,则为 -3 。 i2c_ecbw.c i2c1ecbw.c i2c2ecbw.c temp = EEByteWrite(0xA0, 0x30, 0xA5);

文件名:

代码示例:

EECurrentAddRead EECurrentAddRead1 EECurrentAddRead2
功能: 头文件: 函数原型: 从 I2Cx 总线上读取一个字节。 i2c.h unsigned int EECurrentAddRead( unsigned char control ); unsigned int EECurrentAddRead1( unsigned char control ); unsigned int EECurrentAddRead2( unsigned char control ); control EEPROM 控制 / 总线器件的地址选择字节。 该函数从 I2Cx 总线上读取一个字节。要读取的数据位于 I2C 电可擦除 存储器件中当前指针所指向的地址。存储器件包含一个地址计数器,它 保持最后访问的字的地址,并且以 1 为幅度递增。 如果发生总线冲突错误,为 -1 ; 如果发生不应答错误,为 -2 ; 如果发生写冲突错误,则为 -3。 另外,该函数返回的结果为无符号的 16 位数据。因为缓冲区本身只有 8 位宽,这就意味着最高有效字节为 0,最低有效字节将包含读缓冲区 的内容。 i2c_eecr.c i2c1eecr.c i2c2eecr.c temp = EECurrentAddRead(0xA1);

参数: 说明:

返回值:

文件名:

代码示例:

DS51297F_CN 第 30 页

? 2005 Microchip Technology Inc.

硬件外设函数
EEPageWrite EEPageWrite1 EEPageWrite2
功能: 头文件: 函数原型: 从 I2Cx 总线写一个数据串到电可擦除存储器件中。 i2c.h unsigned char unsigned unsigned unsigned unsigned char unsigned unsigned unsigned unsigned char unsigned unsigned unsigned EEPageWrite( char control, char address, char * wrptr ); EEPageWrite1( char control, char address, char * wrptr ); EEPageWrite2( char control, char address, char * wrptr );

参数:

control EEPROM 控制 / 总线器件的地址选择字节。 address EEPROM 的内部地址单元。 wrptr PICmicro 单片机 RAM 的字符类型指针。wrptr 指向的数据对象将会被 写到电可擦除存储器件。 该函数把一个以空字符终止的数据串写到 I2C 电可擦除存储器件,而空 字符本身不会被传送。 如果没有发生错误,为 0 ; 如果发生总线冲突错误,为 -1 ; 如果发生不应答错误,为 -2 ; 如果发生写冲突错误,则为 -3 。 i2c_eepw.c i2c1eepw.c i2c2eepw.c temp = EEPageWrite(0xA0, 0x70, wrptr);

说明: 返回值;

文件名:

代码示例:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 31 页

MPLAB? C18 C 编译器函数库
EERandomRead EERandomRead1 EERandomRead2
功能: 头文件: 函数原型: 从 I2Cx 总线读取一个字节。 i2c.h unsigned int EERandomRead( unsigned char control, unsigned char address ); unsigned int EERandomRead1( unsigned char control, unsigned char address ); unsigned int EERandomRead2( unsigned char control, unsigned char address ); control EEPROM 控制 / 总线器件的地址选择字节。 address EEPROM 的内部地址单元。 该函数从 I2Cx 总线上读取一个字节,也适用于仅需单字节地址信息的 Microchip I2C 电可擦除存储器件。 返回值由两部分构成:一部分为在最低有效字节中读的值,另一部分为 最高有效字节中的错误条件。错误条件为: 如果发生总线冲突错误,为 -1 ; 如果发生不应答错误,为 -2 ; 如果发生写冲突错误,则为 -3。 i2c_eerr.c i2c1eerr.c i2c2eerr.c unsigned int temp; temp = EERandomRead(0xA0,0x30);

参数:

说明: 返回值:

文件名:

代码示例:

DS51297F_CN 第 32 页

? 2005 Microchip Technology Inc.

硬件外设函数
EESequentialRead EESequentialRead1 EESequentialRead2
功能: 头文件: 函数原型: 从 I2Cx 总线上读取一个数据串。 i2c.h unsigned char unsigned unsigned unsigned unsigned unsigned char unsigned unsigned unsigned unsigned unsigned char unsigned unsigned unsigned unsigned EESequentialRead( char control, char address, char * rdptr, char length ); EESequentialRead1( char control, char address, char * rdptr, char length ); EESequentialRead2( char control, char address, char * rdptr, char length );

参数:

control EEPROM 控制 / 总线器件的地址选择字节。 address EEPROM 的内部地址单元。 rdptr 指向存放从 EEPROM 器件中所读出数据的 PICmicro 单片机 RAM 区的 字符型指针。 length 从 EEPROM 器件中读出的字节数。 该函数从 I2Cx 总线上读取一个预定义长度的数据串,也适用于仅需单 字节地址信息的 Microchip I2C 电可擦除存储器件。 如果没有发生错误,为 0 ; 如果发生总线冲突错误,为 -1 ; 如果发生不应答错误,为 -2 ; 如果发生写冲突错误,则为 -3。 i2c_eesr.c i2c1eesr.c i2c2eesr.c unsigned char err; err = EESequentialRead(0xA0, 0x70, rdptr, 15);

说明: 返回值:

文件名:

代码示例:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 33 页

MPLAB? C18 C 编译器函数库
2.4.3 使用示例
下面是一个简单的代码示例,该程序举例说明了配置为 I2C 主通讯的 SSP 模块 , 及其 和 Microchip 24LC01B I2C 电可擦除存储器之间的 I2C 通讯。
#include "p18cxx.h" #include "i2c.h" unsigned char arraywr[] = {1,2,3,4,5,6,7,8,0}; unsigned char arrayrd[20]; //*************************************************** void main(void) { OpenI2C(MASTER, SLEW_ON);// Initialize I2C module SSPADD = 9; //400kHz Baud clock(9) @16MHz //100kHz Baud clock(39) @16MHz while(1) { EEByteWrite(0xA0, 0x30, 0xA5); EEAckPolling(0xA0); EECurrentAddRead(0xA0); EEPageWrite(0xA0, 0x70, arraywr); EEAckPolling(0xA0); EESequentialRead(0xA0, 0x70, arrayrd, 20); EERandomRead(0xA0,0x30); } }

2.5

I/O 口函数
下列函数支持 PORTB。 表 2-6:
函数 ClosePORTB CloseRBxINT DisablePullups EnablePullups OpenPORTB OpenRBxINT

I/O 口函数
描述 禁止 PORTB 的中断和内部上拉电阻。 禁止 PORTB 引脚 x 的中断。 禁止 PORTB 的内部上拉电阻。 使能 PORTB 的内部上拉电阻。 配置 PORTB 的中断和内部上拉电阻。 使能 PORTB 引脚 x 的中断。

DS51297F_CN 第 34 页

? 2005 Microchip Technology Inc.

硬件外设函数
2.5.1 函数描述

ClosePORTB
函数: 头文件: 函数原型: 说明: 文件名: 禁止 PORTB 的中断和内部上拉电阻。 portb.h void ClosePORTB( void ); 该函数禁止 PORTB 的电平变化中断和内部上拉电阻。 pbclose.c

CloseRB0INT CloseRB1INT CloseRB2INT
功能: 头文件: 函数原型: 禁止 PORTB 指定引脚的中断。 portb.h void CloseRB0INT( void ); void CloseRB1INT( void ); void CloseRB2INT( void ); 该函数禁止 PORTB 指定引脚的电平变化中断。 rb0close.c rb1close.c rb2close.c

说明: 文件名:

DisablePullups
功能: 头文件: 函数原型: 说明: 文件名: 禁止 PORTB 的内部上拉电阻。 portb.h void DisablePullups( void ); 该函数禁止 PORTB 的内部上拉电阻。 pulldis.c

EnablePullups
功能: 头文件: 函数原型: 说明: 使能 PORTB 的内部上拉电阻。 portb.h void EnablePullups( void ); 该函数使能 PORTB 的内部上拉电阻。

文件名:

pullen.c

? 2005 Microchip Technology Inc.

DS51297F_CN 第 35 页

MPLAB? C18 C 编译器函数库
OpenPORTB
功能: 头文件: 函数原型: 参数: 配置 PORTB 的中断和内部上拉电阻。 portb.h void OpenPORTB( unsigned char config); config 从下面所列出各类型中分别取一个值并相与 (‘&’)所得的值。这些值在 文件 portb.h 中定义。 电平变化中断: PORTB_CHANGE_INT_ON 允许中断 PORTB_CHANGE_INT_OFF 禁止中断 使能上拉电阻: PORTB_PULLUPS_ON 使能上拉电阻 PORTB_PULLUPS_OFF 禁止上拉电阻 此函数配置 PORTB 的中断和内部上拉电阻。 pbopen.c OpenPORTB( PORTB_CHANGE_INT_ON & PORTB_PULLUPS_ON);

说明: 文件名: 代码示例:

OpenRB0INT OpenRB1INT OpenRB2INT
功能: 头文件: 函数原型: 允许指定 PORTB 引脚的中断。 portb.h void OpenRB0INT( unsigned char config ); void OpenRB1INT( unsigned char config ); void OpenRB2INT( unsigned char config ); config 从下面所列出各类型中分别取一个值并相与 (‘&’)所得的值。这些值在 portb.h 中定义。 电平变化中断: PORTB_CHANGE_INT_ON 允许中断 PORTB_CHANGE_INT_OFF 禁止中断 边沿触发中断: RISING_EDGE_INT 上升沿触发中断 FALLING_EDGE_INT 下降沿触发中断 使能上拉电阻: PORTB_PULLUPS_ON 使能上拉电阻 PORTB_PULLUPS_OFF 禁止上拉电阻 此函数配置 PORTB 的中断和内部上拉电阻。 rb0open.c rb1open.c rb2open.c OOpenRB0INT( PORTB_CHANGE_INT_ON & RISING_EDGE_INT & PORTB_PULLUPS_ON);

参数:

说明: 文件名:

代码示例:

DS51297F_CN 第 36 页

? 2005 Microchip Technology Inc.

硬件外设函数
2.6 MICROWIRE 函数
为具有一个 Microwire 外设的器件提供了下列函数: 表 2-7:
函数 CloseMwire DataRdyMwire getcMwire getsMwire OpenMwire putcMwire ReadMwire WriteMwire

单个 MICROWIRE 外设函数
描述 禁止用于 Microwire 通讯的 SSP 模块。 表明是否完成内部写循环。 从 Microwire 器件读取一个字节。 从 Microwire 器件读取一个数据串。 配置 SSP 模块的 Microwire 通讯。 写一个字节到 Microwire 器件。 从 Microwire 器件读取一个字节。 写一个字节到 Microwire 器件。

为具有多个 Microwire 外设的器件提供了下列函数: 表 2-8:
函数 CloseMwirex DataRdyMwirex getcMwirex getsMwirex OpenMwirex putcMwirex ReadMwirex WriteMwirex

多个 MICROWIRE 外设函数
描述 禁止用于 Microwire 通讯的 SSPx 模块。 表明是否完成内部写循环。 从 Microwire 器件读取一个字节。 从 Microwire 器件读取一个数据串。 配置 SSPx 模块的 Microwire 通讯。 写一个字节到 Microwire 器件。 从 Microwire 器件读取一个字节。 写一个字节到 Microwire 器件。

2.6.1

函数描述

CloseMwire CloseMwire1 CloseMwire2
功能: 头文件: 函数原型: 禁止 SSPx 模块。 mwire.h void CloseMwire( void ); void CloseMwire1( void ); void CloseMwire2( void ); 相关引脚恢复为普通 I/O 口功能。由 TRISC 和 LATC 负责实现 I/O 控 制。 mw_close.c mw1close.c mw2close.c

说明: 文件名:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 37 页

MPLAB? C18 C 编译器函数库
DataRdyMwire DataRdyMwire1 DataRdyMwire2
功能: 头文件: 函数原型: 表明 Microwirex 器件是否已经完成内部写循环。 mwire.h unsigned char DataRdyMwire( void ); unsigned char DataRdyMwire1( void ); unsigned char DataRdyMwire2( void ); 确定 Microwirex 器件是否已准备就绪。 如果 Microwirex 器件已经就绪,为 1 ; 如果内部写循环尚未完成或者发生总线错误,则为 0。 mw_drdy.c mw1drdy.c mw2drdy.c while (!DataRdyMwire());

说明: 返回值: 文件名:

代码示例:

getcMwire getcMwire1 getcMwire2
getcMwirex 定义为 ReadMwirex。参见 ReadMwirex。

getsMwire getsMwire1 getsMwire2
功能: 头文件: 函数原型: 从 Microwirex 器件读取一个数据串。 mwire.h void getsMwire( unsigned char * rdptr, unsigned char length); void getsMwire1( unsigned char * rdptr, unsigned char length); void getsMwire2( unsigned char * rdptr, unsigned char length); rdptr 指向存放从 Microwirex 器件所读取数据的 PICmicro 单片机 RAM 的指 针。 length 从 Microwirex 器件读取的字节数。 该函数用于从 Microwirex 器件读取一个预定义长度的数据串。在使用此 函数前,必须向正确的地址发出一个 Readx 命令。 mw_gets.c mw1gets.c mw2gets.c unsigned char arryrd[LENGTH]; putcMwire(READ); putcMwire(address); getsMwire(arrayrd, LENGTH);

参数:

说明: 文件名:

代码示例:

DS51297F_CN 第 38 页

? 2005 Microchip Technology Inc.

硬件外设函数
OpenMwire
功能: 头文件: 函数原型: 参数: 配置 SSPx 模块。 mwire.h void OpenMwire( unsigned char sync_mode ); sync_mode 在 mwire.h 中定义的下列值之一: MWIRE_FOSC_4 MWIRE_FOSC_16 MWIRE_FOSC_64 MWIRE_FOSC_TMR2

clock = FOSC/4 clock = FOSC/16 clock = FOSC/64 clock = TMR2 output/2

说明: 文件名:

OpenMwirex 函数把 SSPx 模块复位到 POR 状态,然后配置该模块的 Microwirex 通讯。 mw_open.c mw1open.c mw2open.c OpenMwire(MWIRE_FOSC_16);

代码示例:

putcMwire putcMwire1 putcMwire2
putcMwirex 定义为 WriteMwirex。参见 WriteMwirex。

? 2005 Microchip Technology Inc.

DS51297F_CN 第 39 页

MPLAB? C18 C 编译器函数库
ReadMwire ReadMwire1 ReadMwire2 getcMwire getcMwire1 getcMwire2
功能: 头文件: 函数原型: 从 Microwirex 器件读取一个字节。 mwire.h unsigned char ReadMwire( unsigned char high_byte, unsigned char low_byte ); unsigned char ReadMwire1( unsigned char high_byte, unsigned char low_byte ); unsigned char ReadMwire2( unsigned char high_byte, unsigned char low_byte ); unsigned char getcMwire( unsigned char high_byte, unsigned char low_byte ); unsigned char getcMwire1( unsigned char high_byte, unsigned char low_byte ); unsigned char getcMwire2( unsigned char high_byte, unsigned char low_byte ); high_byte 16 位指令字的第一个字节。 low_byte 16 位指令字的第二个字节。 该函数从 Microwirex 器件读取一个字节。启动位、操作码和地址组成传 递给此函数的高字节和低字节。 getcMwirex 在 mwire.h 中定义为 ReadMwirex。 返回值是从 Microwirex 器件读取的单字节数据。 mw_read.c mw1read.c mw2read.c #define in mwire.h #define in mwire.h #define in mwire.h ReadMwire(0x03, 0x00);

参数:

说明:

返回值: 文件名:

代码示例:

DS51297F_CN 第 40 页

? 2005 Microchip Technology Inc.

硬件外设函数
WriteMwire WriteMwire1 WriteMwire2 putcMwire putcMwire1 putcMwire2
功能: 头文件: 函数原型: 该函数用于写一字节 (一个字符)数据到 Microwirex 器件。 mwire.h unsigned char WriteMwire( unsigned char data_out unsigned char WriteMwire1( unsigned char data_out unsigned char WriteMwire2( unsigned char data_out unsigned char putcMwire( unsigned char data_out unsigned char putcMwire1( unsigned char data_out unsigned char putcMwire2( unsigned char data_out data_out 要写到 Microwirex 器件的单字节数据。 该函数利用 SSPx 模块将一字节数据写到 Microwirex 器件。 putcMwirex 在 mwire.h 中定义为 WriteMwirex。 如果写入成功,为 0 ; 如果发生写冲突,则为 -1。 mw_write.c mw1write.c mw2write.c #define in mwire.h #define in mwire.h #define in mwire.h WriteMwire(0x55); ); ); ); ); ); );

参数: 说明: 返回值: 文件名:

代码示例:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 41 页

MPLAB? C18 C 编译器函数库
2.6.2 使用示例
下面是一个简单的代码示例,举例说明了 SSP 模块与 Microchip 93LC66 Microwire 电 可擦除存储器之间的通讯。
#include "p18cxxx.h" #include "mwire.h" // 93LC66 x 8 // FUNCTION Prototypes void main(void); void ew_enable(void); void erase_all(void); void busy_poll(void); void write_all(unsigned char data); void byte_read(unsigned char address); void read_mult(unsigned char address, unsigned char *rdptr, unsigned char length); void write_byte(unsigned char address, unsigned char data); // VARIABLE Definitions unsigned char arrayrd[20]; unsigned char var; // DEFINE 93LC66 MACROS -- see datasheet for details #define READ 0x0C #define WRITE 0x0A #define ERASE 0x0E #define EWEN1 0x09 #define EWEN2 0x80 #define ERAL1 0x09 #define ERAL2 0x00 #define WRAL1 0x08 #define WRAL2 0x80 #define EWDS1 0x08 #define EWDS2 0x00 #define W_CS LATCbits.LATC2 void main(void) { TRISCbits.TRISC2 = 0; W_CS = 0; //ensure CS is negated OpenMwire(MWIRE_FOSC_16); //enable SSP peripheral ew_enable(); //send erase/write enable write_byte(0x13, 0x34); //write byte (address, data) busy_poll(); Nop(); byte_read(0x13); //read single byte (address) read_mult(0x10, arrayrd, 10); //read multiple bytes erase_all(); //erase entire array CloseMwire(); //disable SSP peripheral }

DS51297F_CN 第 42 页

? 2005 Microchip Technology Inc.

硬件外设函数
void ew_enable(void) { W_CS = 1; //assert putcMwire(EWEN1); //enable putcMwire(EWEN2); //enable W_CS = 0; //negate } void busy_poll(void) { W_CS = 1; while(! DataRdyMwire() ); W_CS = 0; } chip select write command byte 1 write command byte 2 chip select

void write_byte(unsigned char address, unsigned char data) { W_CS = 1; putcMwire(WRITE); //write command putcMwire(address); //address putcMwire(data); //write single byte W_CS = 0; } void byte_read(unsigned char address) { W_CS = 1; getcMwire(READ,address); //read one byte W_CS = 0; } void read_mult(unsigned char address, unsigned char *rdptr, unsigned char length) { W_CS = 1; putcMwire(READ); //read command putcMwire(address); //address (A7 - A0) getsMwire(rdptr, length); //read multiple bytes W_CS = 0; } void erase_all(void) { W_CS = 1; putcMwire(ERAL1); //erase all command byte 1 putcMwire(ERAL2); //erase all command byte 2 W_CS = 0; }

? 2005 Microchip Technology Inc.

DS51297F_CN 第 43 页

MPLAB? C18 C 编译器函数库
2.7 脉宽调制函数
下列函数支持 PWM 外设: 表 2-9:
函数 ClosePWMx OpenPWMx SetDCPWMx SetOutputPWMx CloseEPWMx(1) OpenEPWMx(1) SetDCEPWMx(1) SetOutputEPWMx(1) 注 禁止 PWM 通道 x。 配置 PWM 通道 x。 向 PWM 通道 x 写入一个新的占空比值。 设置 ECCP x 的 PWM 输出配置位。 禁止增强型 PWM 通道 x。 配置增强型 PWM 通道 x。 写一个新的占空比值到增强型 PWM 通道 x。 设置 ECCP x 的增强型 PWM 输出配置位。

PWM 函数
描述

1: 增强型 PWM 函数仅可用于带有 ECCPxCON 寄存器的器件。

2.7.1

函数描述

ClosePWM1 ClosePWM2 ClosePWM3 ClosePWM4 ClosePWM5 CloseEPWM1
功能: 包含: 函数原型: 禁止 PWM 通道。 pwm.h void void void void void void ClosePWM1( void ); ClosePWM2( void ); ClosePWM3( void ); ClosePWM4( void ); ClosePWM5( void ); CloseEPWM1( void );

说明: 文件名:

该函数禁止指定的 PWM 通道。 pw1close.c pw2close.c pw3close.c pw4close.c pw5close.c ew1close.c

DS51297F_CN 第 44 页

? 2005 Microchip Technology Inc.

硬件外设函数
OpenPWM1 OpenPWM2 OpenPWM3 OpenPWM4 OpenPWM5 OpenEPWM1
功能: 包含: 函数原型: 配置 PWM 通道。 pwm.h void void void void void void OpenPWM1( char period ); OpenPWM2( char period ); OpenPWM3( char period ); OpenPWM4( char period ); OpenPWM5( char period ); OpenEPWM1( char period );

参数:

period 可以是 0x00 到 0xff 之间的任何值,通过使用下面的公式,这个值可确 定 PWM 频率: PWM 周期 =[(period ) + 1] x 4 x TOSC x TMR2 预分频比 该函数配置指定 PWM 通道的周期和时基。 PWM 只使用 Timer2。 在 PWM 工作之前,除了要配置 PWM 通道外,还要用 OpenTimer2(...) 语句配置 Timer2 。

说明:

文件名:

pw1open.c pw2open.c pw3open.c pw4open.c pw5open.c ew1open.c OpenPWM1(0xff);

代码示例:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 45 页

MPLAB? C18 C 编译器函数库
SetDCPWM1 SetDCPWM2 SetDCPWM3 SetDCPWM4 SetDCPWM5 SetDCEPWM1
功能: 头文件: 函数原型: 向指定 PWM 通道的占空比寄存器写入新的占空比值。 pwm.h void void void void void void SetDCPWM1( unsigned int dutycycle ); SetDCPWM2( unsigned int dutycycle ); SetDCPWM3( unsigned int dutycycle ); SetDCPWM4( unsigned int dutycycle ); SetDCPWM5( unsigned int dutycycle ); SetDCEPWM1( unsigned int dutycycle );

参数:

dutycycle dutycycle 的值可以是任何一个 10 位数。 只有 dutycycle 的低 10 位写入到 占空比寄存器。占空比,或者更具体地说是 PWM 波形的高电平时间, 可以通过下面的公式计算出来: PWM x 占空比 = (DCx<9:0>) x TOSC 其中, DCx<9:0> 是调用该函数时指定的 10 位值。 该函数向指定 PWM 通道的占空比寄存器写入新的占空比值。 PWM 波形的最大分辨率可以使用下面的公式、通过周期计算出来: 分辨率 (位)= log(FOSC/Fpwm) / log(2)

说明:

文件名:

pw1setdc.c pw2setdc.c pw3setdc.c pw4setdc.c pw5setdc.c ew1setdc.c SetDCPWM1(0);

代码示例:

DS51297F_CN 第 46 页

? 2005 Microchip Technology Inc.

硬件外设函数
SetOutputPWM1 SetOutputPWM2 SetOutputPWM3 SetOutputEPWM1
功能: 头文件: 函数原型: 设置 ECCP 的 PWM 输出配置位。 pwm.h void SetOutputPWM1 ( unsigned char unsigned char void SetOutputPWM2 ( unsigned char unsigned char void SetOutputPWM3 ( unsigned char unsigned char void SetOutputEPWM1 ( unsigned char unsigned char outputconfig, outputmode); outputconfig, outputmode); outputconfig, outputmode); outputconfig, outputmode);

参数:

outputconfig outputconfig 的值可以是下列值 (在 pwm.h 中定义)之一: SINGLE_OUT 单端输出 FULL_OUT_FWD 全桥正向输出 HALF_OUT 半桥输出 FULL_OUT_REV 全桥反向输出 outputmode outputmode 的值可以是下列值 (在 pwm.h 中定义)之一: PWM_MODE_1 P1A 和 P1C 高电平有效 P1B 和 P1D 高电平有效 PWM_MODE_2 P1A 和 P1C 高电平有效 P1B 和 P1D 低电平有效 PWM_MODE_3 P1A 和 P1C 低电平有效 P1B 和 P1D 高电平有效 PWM_MODE_4 P1A 和 P1C 低电平有效 P1B 和 P1D 低电平有效 仅适用于带扩展型或增强型 CCP (ECCP)的器件。 pw1setoc.c pw2setoc.c pw3setoc.c ew1setoc.c SetOutputPWM1 (SINGLE_OUT, PWM_MODE_1);

说明: 文件名:

代码示例:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 47 页

MPLAB? C18 C 编译器函数库
2.8 SPI 函数
为具有一个 SPI 外设的器件提供了下列函数: 表 2-10:
函数 CloseSPI DataRdySPI getcSPI getsSPI OpenSPI putcSPI putsSPI ReadSPI WriteSPI

单个 SPI 外设函数
描述 禁止用于 SPI 通讯的 SSP 模块。 确定 SPI 缓冲区中是否有新值。 从 SPI 总线上读取一个字节。 从 SPI 总线上读取一个数据串。 初始化用于 SPI 通讯的 SSP 模块。 向 SPI 总线写入一个字节。 向 SPI 总线写入一个数据串。 从 SPI 总线上读取一个字节。 向 SPI 总线写入一个字节。

另外为具有多个 SPI 外设的器件提供了下列函数: 表 2-11:
函数 CloseSPIx DataRdySPIx getcSPIx getsSPIx OpenSPIx putcSPIx putsSPIx ReadSPIx WriteSPIx

多个 SPI 外设函数
描述 禁止用于 SPI 通讯的 SSPx 模块。 确定 SPIx 缓冲区中是否有新值。 从 SPIx 总线上读取一个字节。 从 SPIx 总线上读取一个数据串。 初始化用于 SPI 通讯的 SSPx 模块。 向 SPIx 总线写入一个字节。 向 SPIx 总线写入一个数据串。 从 SPIx 总线上读取一个字节。 向 SPIx 总线写入一个字节。

DS51297F_CN 第 48 页

? 2005 Microchip Technology Inc.

硬件外设函数
2.8.1 函数描述

CloseSPI CloseSPI1 CloseSPI2
功能: 头文件: 函数原型: 禁止 SSPx 模块。 spi.h void CloseSPI( void ); void CloseSPI1( void ); void CloseSPI2( void ); 该函数禁止 SSPx 模块。相关引脚恢复为普通 I/O 口功能。由相应的 TRIS 和 LAT 寄存器控制 I/O 引脚。 spi_clos.c spi1clos.c spi2clos.c

说明: 文件名:

DataRdySPI DataRdySPI1 DataRdySPI2
功能: 头文件: 函数原型: 确定 SSPBUFx 中是否有数据。 spi.h unsigned char DataRdySPI( void ); unsigned char DataRdySPI1( void ); unsigned char DataRdySPI2( void ); 该函数确定 SSPBUFx 寄存器中是否有数据字节可读。 如果 SSPBUFx 寄存器中没有数据,为 0 ; 如果 SSPBUFx 寄存器中有数据,则为 1。 spi_dtrd.c spi1dtrd.c spi2dtrd.c while (!DataRdySPI());

说明: 返回值: 文件名:

代码示例:

getcSPI getcSPI1 getcSPI2
getcSPIx 定义为 ReadSPIx。参见 ReadSPIx。

? 2005 Microchip Technology Inc.

DS51297F_CN 第 49 页

MPLAB? C18 C 编译器函数库
getsSPI getsSPI1 getsSPI2
功能: 头文件: 函数原型: 从 SPIx 总线读取一个数据串。 spi.h void getsSPI( unsigned char *rdptr, unsigned char length ); void getsSPI1( unsigned char *rdptr, unsigned char length ); void getsSPI2( unsigned char *rdptr, unsigned char length ); rdptr 指向存放从 SPIx 器件中读取数据的地址的指针。 length 要从 SPIx 器件中读取数据的字节数。 该函数从 SPIx 总线读取一个预定义长度的数据串。 spi_gets.c spi1gets.c spi2gets.c unsigned char wrptr[10]; getsSPI(wrptr, 10);

参数:

说明: 文件名:

代码示例:

OpenSPI OpenSPI1 OpenSPI2
功能: 头文件: 函数原型: 初始化 SSPx 模块。 spi.h void OpenSPI( unsigned char sync_mode, unsigned char bus_mode, unsigned char smp_phase); void OpenSPI1( unsigned char sync_mode, unsigned char bus_mode, unsigned char smp_phase); void OpenSPI2( unsigned char sync_mode, unsigned char bus_mode, unsigned char smp_phase); sync_mode 取下列值之一,在 spi.h 中定义: SPI_FOSC_4 SPI 主模式,clock = FOSC/4 SPI_FOSC_16 SPI 主模式,clock = FOSC/16 SPI_FOSC_64 SPI 主模式, clock = FOSC/64 SPI_FOSC_TMR2 SPI 主模式,clock = TMR2 输出 /2 SLV_SSON SPI 从模式,使能 /SS 引脚控制 SLV_SSOFF SPI 从模式,禁止 /SS 引脚控制 bus_mode 取下列值之一,在 spi.h 中定义: MODE_00 设置 SPI 总线为模式 0,0 MODE_01 设置 SPI 总线为模式 0,1 MODE_10 设置 SPI 总线为模式 1,0 MODE_11 设置 SPI 总线为模式 1,1

参数:

DS51297F_CN 第 50 页

? 2005 Microchip Technology Inc.

硬件外设函数
OpenSPI OpenSPI1 OpenSPI2 (续)
smp_phase 取下列值之一,在 spi.h 中定义: SMPEND 在输出数据的末端进行输入数据采样 SMPMID 在输出数据的中间进行输入数据采样 说明: 文件名: 该函数设置供 SPIx 总线器件使用的 SSPx 模块。 spi_open.c spi1open.c spi2open.c OpenSPI(SPI_FOSC_16, MODE_00, SMPEND);

代码示例:

putcSPI putcSPI1 putcSPI2
putcSPIx 定义为 WriteSPIx。参见 WriteSPIx。

putsSPI putsSPI1 putsSPI2
功能: 头文件: 函数原型: 向 SPIx 总线写一个数据串。 spi.h void putsSPI( unsigned char *wrptr ); void putsSPI1( unsigned char *wrptr ); void putsSPI2( unsigned char *wrptr ); wrptr 指向要写到 SPIx 总线的值的指针。 该函数向 SPIx 总线器件写一个数据串。当在数据串中读到一个空字符 时函数终止 (空字符不会写到总线) 。 spi_puts.c spi1puts.c spi2puts.c unsigned char wrptr[] = “Hello!”; putsSPI(wrptr);

参数: 说明: 文件名:

代码示例:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 51 页

MPLAB? C18 C 编译器函数库
ReadSPI ReadSPI1 ReadSPI2 getcSPI getcSPI1 getcSPI2
功能: 头文件: 函数原型: 从 SPIx 总线上读取一个字节。 spi.h unsigned unsigned unsigned unsigned unsigned unsigned char char char char char char ReadSPI( void ); ReadSPI1( void ); ReadSPI2( void ); getcSPI( void ); getcSPI1( void ); getcSPI2( void );

说明: 返回值: 文件名:

该函数启动一个 SPIx 总线周期,来采集一字节数据。 getcSPIx 在 spi.h 中定义为 ReadSPIx。 该函数返回在 SPIx 读周期内读取的一字节数据。 spi_read.c spi1read.c spi2read.c #define in spi.h #define in spi.h #define in spi.h char x; x = ReadSPI();

代码示例:

DS51297F_CN 第 52 页

? 2005 Microchip Technology Inc.

硬件外设函数
WriteSPI WriteSPI1 WriteSPI2 putcSPI putcSPI1 putcSPI2
功能: 头文件: 函数原型: 向 SPIx 总线写一个字节。 spi.h unsigned char WriteSPI( unsigned char unsigned char WriteSPI1( unsigned char unsigned char WriteSPI2( unsigned char unsigned char putcSPI( unsigned char unsigned char putcSPI1( unsigned char unsigned char putcSPI2( unsigned char data_out 要写到 SPIx 总线的值。 该函数写一个字节的数据,然后检查是否有写冲突。 putcSPIx 在 spi.h 中定义为 WriteSPIx。 如果没有发生写冲突,为 0 ; 如果发生写冲突,则为 -1。 spi_writ.c spi1writ.c spi2writ.c #define in spi.h #define in spi.h #define in spi.h WriteSPI(‘a’); data_out ); data_out ); data_out ); data_out ); data_out ); data_out );

参数: 说明: 返回值: 文件名:

代码示例:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 53 页

MPLAB? C18 C 编译器函数库
2.8.2 使用示例
下面的例子说明了如何使用 SSP 模块与 Microchip 的 25C080 SPI 电可擦除存储器进 行通讯。
#include <p18cxxx.h> #include <spi.h> // FUNCTION Prototypes void main(void); void set_wren(void); void busy_polling(void); unsigned char status_read(void); void status_write(unsigned char data); void byte_write(unsigned char addhigh, unsigned char addlow, unsigned char data); void page_write(unsigned char addhigh, unsigned char addlow, unsigned char *wrptr); void array_read(unsigned char addhigh, unsigned char addlow, unsigned char *rdptr, unsigned char count); unsigned char byte_read(unsigned char addhigh, unsigned char addlow); // VARIABLE Definitions unsigned char arraywr[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,0}; //25C040/080/160 page write size unsigned char arrayrd[16]; unsigned char var; #define SPI_CS LATCbits.LATC2

//************************************************** void main(void) { TRISCbits.TRISC2 = 0; SPI_CS = 1; // ensure SPI memory device // Chip Select is reset OpenSPI(SPI_FOSC_16, MODE_00, SMPEND); set_wren(); status_write(0); busy_polling(); set_wren(); byte_write(0x00, 0x61, 'E'); busy_polling(); var = byte_read(0x00, 0x61); set_wren(); page_write(0x00, 0x30, arraywr); busy_polling(); array_read(0x00, 0x30, arrayrd, 16); var = status_read();

DS51297F_CN 第 54 页

? 2005 Microchip Technology Inc.

硬件外设函数
CloseSPI(); while(1); } void set_wren(void) { SPI_CS = 0; var = putcSPI(SPI_WREN); SPI_CS = 1; }

//assert chip select //send write enable command //negate chip select

void page_write (unsigned char addhigh, unsigned char addlow, unsigned char *wrptr) { SPI_CS = 0; //assert chip select var = putcSPI(SPI_WRITE); //send write command var = putcSPI(addhigh); //send high byte of address var = putcSPI(addlow); //send low byte of address putsSPI(wrptr); //send data byte SPI_CS = 1; //negate chip select } void array_read (unsigned char addhigh, unsigned char addlow, unsigned char *rdptr, unsigned char count) { SPI_CS = 0; //assert chip select var = putcSPI(SPI_READ); //send read command var = putcSPI(addhigh); //send high byte of address var = putcSPI(addlow); //send low byte of address getsSPI(rdptr, count); //read multiple bytes SPI_CS = 1; } void byte_write (unsigned char addhigh, unsigned char addlow, unsigned char data) { SPI_CS = 0; //assert chip select var = putcSPI(SPI_WRITE); //send write command var = putcSPI(addhigh); //send high byte of address var = putcSPI(addlow); //send low byte of address var = putcSPI(data); //send data byte SPI_CS = 1; //negate chip select } unsigned char byte_read (unsigned char addhigh, unsigned char addlow) { SPI_CS = 0; //assert chip select var = putcSPI(SPI_READ); //send read command var = putcSPI(addhigh); //send high byte of address var = putcSPI(addlow); //send low byte of address var = getcSPI(); //read single byte SPI_CS = 1; return (var); }

? 2005 Microchip Technology Inc.

DS51297F_CN 第 55 页

MPLAB? C18 C 编译器函数库
unsigned char status_read (void) { SPI_CS = 0; //assert chip select var = putcSPI(SPI_RDSR); //send read status command var = getcSPI(); //read data byte SPI_CS = 1; //negate chip select return (var); } void status_write (unsigned char data) { SPI_CS = 0; var = putcSPI(SPI_WRSR); //write status command var = putcSPI(data); //status byte to write SPI_CS = 1; //negate chip select } void busy_polling (void) { do { SPI_CS = 0; var = putcSPI(SPI_RDSR); var = getcSPI(); SPI_CS = 1; } while (var & 0x01); }

//assert chip select //send read status command //read data byte //negate chip select //stay in loop until !busy

DS51297F_CN 第 56 页

? 2005 Microchip Technology Inc.

硬件外设函数
2.9 定时器函数
下列函数支持定时器外设: 表 2-12:
CloseTimerx OpenTimerx ReadTimerx WriteTimerx

定时器函数
函数 禁止定时器 x。 配置并使能定时器 x。 读取定时器 x 的值。 向定时器 x 写入一个值。 描述

2.9.1

函数描述

CloseTimer0 CloseTimer1 CloseTimer2 CloseTimer3 CloseTimer4
功能: 头文件: 函数原型: 禁止指定的定时器。 timers.h void void void void void CloseTimer0( CloseTimer1( CloseTimer2( CloseTimer3( CloseTimer4( void void void void void ); ); ); ); );

说明: 文件名:

该函数禁止中断和指定的定时器。 t0close.c t1close.c t2close.c t3close.c t4close.c

? 2005 Microchip Technology Inc.

DS51297F_CN 第 57 页

MPLAB? C18 C 编译器函数库
OpenTimer0
功能: 头文件: 函数原型: 参数: 配置并使能 Timer0。 timers.h void OpenTimer0( unsigned char config ); config 从下面所列出各类型中分别取一个值并相与 (‘&’)所得的值。这些值在 文件 timers.h 中定义。 允许 Timer0 中断: TIMER_INT_ON 允许中断 TIMER_INT_OFF 禁止中断 定时器宽度: T0_8BIT 8 位模式 T0_16BIT 16 位模式 时钟源: T0_SOURCE_EXT 外部时钟源 (I/O 引脚) T0_SOURCE_INT 内部时钟源 (TOSC) 外部时钟触发 (T0_SOURCE_EXT) : T0_EDGE_FALL 外部时钟下降沿 T0_EDGE_RISE   外部时钟上升沿 预分频值: T0_PS_1_1 T0_PS_1_2 T0_PS_1_4 T0_PS_1_8 T0_PS_1_16 T0_PS_1_32 T0_PS_1_64 T0_PS_1_128 T0_PS_1_256 说明: 文件名: 代码示例: t0open.c OpenTimer0( TIMER_INT_OFF & T0_8BIT & T0_SOURCE_INT & T0_PS_1_32 ); 1:1 预分频 1:2 预分频 1:4 预分频 1:8 预分频 1:16 预分频 1:32 预分频 1:64 预分频 1:128 预分频 1:256 预分频

该函数按照指定的选项配置 Timer0,然后使能它。

DS51297F_CN 第 58 页

? 2005 Microchip Technology Inc.

硬件外设函数
OpenTimer1
功能: 头文件: 函数原型: 参数: 配置并使能 Timer1。 timers.h void OpenTimer1( unsigned char config ); config 从下面所列出各类型中分别取一个值并相与 (‘&’)所得的值。这些值在 文件 timers.h 中定义。 允许 Timer1 中断: TIMER_INT_ON TIMER_INT_OFF 允许中断 禁止中断

定时器宽度: T1_8BIT_RW 8 位模式 T1_16BIT_RW 16 位模式 时钟源: T1_SOURCE_EXT 外部时钟源 (I/O 引脚) T1_SOURCE_INT 内部时钟源 (TOSC) 预分频器: T1_PS_1_1 1:1 预分频 T1_PS_1_2 1:2 预分频 T1_PS_1_4 1:4 预分频 T1_PS_1_8 1:8 预分频 振荡器使用: T1_OSC1EN_ON 使能 Timer1 振荡器 T1_OSC1EN_OFF 禁止 Timer1 振荡器 同步时钟输入: T1_SYNC_EXT_ON 同步外部时钟输入 T1_SYNC_EXT_OFF 不同步外部时钟输入 用于 CCP: 对于具有 1 个或 2 个 CCP 的器件 T3_SOURCE_CCP Timer3 作为两个 CCP 的时钟源 T1_CCP1_T3_CCP2 Timer1 作为 CCP1 的时钟源, Timer3 作为 CCP2 的时钟源 T1_SOURCE_CCP Timer1 作为两个 CCP 的时钟源 对于具有多于 2 个 CCP 的器件 T34_SOURCE_CCP Timer3和Timer4作为所有CCP的时钟源 T12_CCP12_T34_CCP345 Timer1 和 Timer2 作为 CCP1 和 CCP2 的时钟源, Timer3 和 Timer4 作为 CCP3 到 CCP5 的时钟源 T12_CCP1_T34_CCP2345 Timer1 和 Timer2 作为 CCP1 的时钟源, Timer3 和 Timer4 作为 CCP2 到 CCP5 的时钟源 T12_SOURCE_CCP Timer1和Timer2作为所有CCP的时钟源 说明: 文件名: 代码示例: 该函数按照指定的选项配置 Timer1,然后使能它。 t1open.c OpenTimer1( TIMER_INT_ON T1_8BIT_RW T1_SOURCE_EXT T1_PS_1_1 T1_OSC1EN_OFF T1_SYNC_EXT_OFF & & & & & );

? 2005 Microchip Technology Inc.

DS51297F_CN 第 59 页

MPLAB? C18 C 编译器函数库
OpenTimer2
功能: 头文件: 函数原型: 参数: 配置并使能 Timer2。 timers.h void OpenTimer2( unsigned char config ); config 从下面所列出各类型中分别取一个值并相与 (‘&’)所得的值。这些值在 文件 timers.h 中定义。 允许 Timer2 中断: TIMER_INT_ON TIMER_INT_OFF 允许中断 禁止中断

预分频值: T2_PS_1_1 1:1 预分频 T2_PS_1_4 1:4 预分频 T2_PS_1_16 1:16 预分频 后分频值: T2_POST_1_1 1:1 后分频 T2_POST_1_2 1:2 后分频 : : T2_POST_1_15 1:15 后分频 T2_POST_1_16 1:16 后分频 用于 CCP: 对于具有 1 个或 2 个 CCP 的器件 T3_SOURCE_CCP Timer3 作为两个 CCP 的时钟源 T1_CCP1_T3_CCP2 Timer1 作为 CCP1 的时钟源, Timer3 作为 CCP2 的时钟源 T1_SOURCE_CCP Timer1 作为两个 CCP 的时钟源 对于具有多于 2 个 CCP 的器件 T34_SOURCE_CCP Timer3和Timer4作为所有CCP的时钟源 T12_CCP12_T34_CCP345 Timer1 和 Timer2 作为 CCP1 和 CCP2 的时钟源, Timer3 和 Timer4 作为 CCP3 到 CCP5 的时钟源 T12_CCP1_T34_CCP2345 Timer1 和 Timer2 作为 CCP1 的时钟源, Timer3 和 Timer4 作为 CCP2 到 CCP5 的时钟源 T12_SOURCE_CCP Timer1和Timer2作为所有CCP的时钟源 说明: 文件名: 代码示例: 该函数按照指定的选项配置 Timer2,然后使能它。 t2open.c OpenTimer2( TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_8 );

DS51297F_CN 第 60 页

? 2005 Microchip Technology Inc.

硬件外设函数
OpenTimer3
功能: 头文件: 函数原型: 参数: 配置并使能 Timer3。 timers.h void OpenTimer3( unsigned char config ); config 从下面所列出各类型中分别取一个值并相与 (‘&’)所得的值。这些值在 文件 timers.h 中定义。 允许 Timer3 中断: TIMER_INT_ON TIMER_INT_OFF 定时器宽度: T3_8BIT_RW T3_16BIT_RW 时钟源: T3_SOURCE_EXT T3_SOURCE_INT 预分频值: T3_PS_1_1 T3_PS_1_2 T3_PS_1_4 T3_PS_1_8 允许中断 禁止中断 8 位模式 16 位模式 外部时钟源 (I/O 引脚) 内部时钟源 (TOSC) 1:1 预分频 1:2 预分频 1:4 预分频 1:8 预分频

同步时钟输入: T3_SYNC_EXT_ON 同步外部时钟输入 T3_SYNC_EXT_OFF 不同步外部时钟输入 用于 CCP: 对于具有 1 个或 2 个 CCP 的器件 T3_SOURCE_CCP Timer3 作为两个 CCP 的时钟源 T1_CCP1_T3_CCP2 Timer1 作为 CCP1 的时钟源, Timer3 作为 CCP2 的时钟源 T1_SOURCE_CCP Timer1 作为两个 CCP 的时钟源 对于具有多于 2 个 CCP 的器件 T34_SOURCE_CCP Timer3和Timer4作为所有CCP的时钟源 T12_CCP12_T34_CCP345 Timer1 和 Timer2 作为 CCP1 和 CCP2 的时钟源, Timer3 和 Timer4 作为 CCP3 到 CCP5 的时钟源 T12_CCP1_T34_CCP2345 Timer1 和 Timer2 作为 CCP1 的时钟源, Timer3 和 Timer4 作为 CCP2 到 CCP5 的时钟源 T12_SOURCE_CCP Timer1和Timer2作为所有CCP的时钟源 说明: 文件名: 代码示例: 该函数按照指定的选项配置 Timer3,然后使能它。 t3open.c OpenTimer3( TIMER_INT_ON T3_8BIT_RW T3_SOURCE_EXT T3_PS_1_1 T3_OSC1EN_OFF T3_SYNC_EXT_OFF & & & & & );

? 2005 Microchip Technology Inc.

DS51297F_CN 第 61 页

MPLAB? C18 C 编译器函数库
OpenTimer4
功能: 头文件: 函数原型: 参数: 配置并使能 Timer4。 timers.h void OpenTimer4( unsigned char config ); config 从下面所列出各类型中分别取一个值并相与 (‘&’)所得的值。这些值在 文件 timers.h 中定义。 允许 Timer4 中断: TIMER_INT_ON TIMER_INT_OFF 预分频值: T4_PS_1_1 T4_PS_1_4 T4_PS_1_16 后分频值: T4_POST_1_1 T4_POST_1_2 : T4_POST_1_15 T4_POST_1_16 说明: 文件名: 代码示例: t4open.c OpenTimer4( TIMER_INT_OFF & T4_PS_1_1 & T4_POST_1_8 ); 允许中断 禁止中断 1:1 预分频 1:4 预分频 1:16 预分频 1:1 后分频 1:2 后分频 : 1:15 后分频 1:16 后分频

该函数按照指定的选项配置 Timer4,然后使能它。

DS51297F_CN 第 62 页

? 2005 Microchip Technology Inc.

硬件外设函数
ReadTimer0 ReadTimer1 ReadTimer2 ReadTimer3 ReadTimer4
功能: 头文件: 函数原型: 读取指定定时器的值。 timers.h unsigned unsigned unsigned unsigned unsigned int int char int char ReadTimer0( ReadTimer1( ReadTimer2( ReadTimer3( ReadTimer4( void void void void void ); ); ); ); );

说明:

这些函数读取各个定时器寄存器的值。 Timer0: TMR0L,TMR0H Timer1: TMR1L,TMR1H Timer2: TMR2 Timer3: TMR3L,TMR3H Timer4: TMR4 注:当使用可配置为 16 位模式、但工作在 8 位模式的定时器 (如 Timer0)时,高字节并不保证为 0。用户可能希望将结果强制转换为字 符型,以得到正确的结果。例如: // Example of reading a 16-bit result // from a 16-bit timer operating in // 8-bit mode: unsigned int result; result = (unsigned char) ReadTimer0();

返回值: 文件名:

定时器的当前值。 t0read.c t1read.c t2read.c t3read.c t4read.c

? 2005 Microchip Technology Inc.

DS51297F_CN 第 63 页

MPLAB? C18 C 编译器函数库
WriteTimer0 WriteTimer1 WriteTimer2 WriteTimer3 WriteTimer4
功能: 头文件: 函数原型: 向指定的定时器写入一个值。 timers.h void void void void void WriteTimer0( WriteTimer1( WriteTimer2( WriteTimer3( WriteTimer4( unsigned unsigned unsigned unsigned unsigned int int char int char timer timer timer timer timer ); ); ); ); );

参数: 说明:

timer 将装入指定定时器的值。 这些函数将值写入到相应的定时器寄存器: Timer0: TMR0L,TMR0H Timer1: TMR1L,TMR1H Timer2: TMR2 Timer3: TMR3L,TMR3H Timer4: TMR4 t0read.c t1read.c t2read.c t3read.c t4read.c WriteTimer0( 10000 );

文件名:

代码示例:

DS51297F_CN 第 64 页

? 2005 Microchip Technology Inc.

硬件外设函数
2.9.2
#include #include #include #include

使用示例
<p18C452.h> <timers.h> <usart.h> <stdlib.h>

void main( void ) { int result; char str[7]; // configure timer0 OpenTimer0( TIMER_INT_OFF & T0_SOURCE_INT & T0_PS_1_32 ); // configure USART OpenUSART( USART_TX_INT_OFF USART_RX_INT_OFF USART_ASYNCH_MODE USART_EIGHT_BIT USART_CONT_RX, 25

& & & & );

while( 1 ) { while( ! PORTBbits.RB3 ); // wait for RB3 high result = ReadTimer0(); // read timer if( result > 0xc000 ) break; WriteTimer0( 0 ); ultoa( result, str ); putsUSART( str ); } CloseTimer0(); CloseUSART(); } // close modules // exit loop if value // is out of range // restart timer // convert timer to string // print string

? 2005 Microchip Technology Inc.

DS51297F_CN 第 65 页

MPLAB? C18 C 编译器函数库
2.10 USART 函数
下列函数支持带有单个 USART 外设的器件: 表 2-13:
函数 BusyUSART CloseUSART DataRdyUSART getcUSART getsUSART OpenUSART putcUSART putsUSART putrsUSART ReadUSART WriteUSART baudUSART USART 是否正在发送? 禁止 USART。 USART 读缓冲区中是否有数据? 从 USART 读取一个字节。 从 USART 上读取一个数据串。 配置 USART。 向 USART 写入一个字节。 把数据存储器中的字符串写到 USART。 把程序存储器中的字符串写到 USART。 从 USART 上读取一个字节。 写一个字节到 USART。 设置增强型 USART 的波特率配置位。

单个 USART 外设函数
描述

下列函数支持带有多个 USART 外设的器件: 表 2-14:
函数 BusyxUSART ClosexUSART DataRdyxUSART getcxUSART getsxUSART OpenxUSART putcxUSART putsxUSART putrsxUSART ReadxUSART WritexUSART baudxUSART USART x 是否正在发送? 禁止 USART x。 USART x 读缓冲区中是否有数据? 从 USART x 读取一个字节。 从 USART x 读取一个字符串。 配置 USART x。 向 USART x 写入一个字节。 把数据存储器中的字符串写到 USART x。 把程序存储器中的字符串写到 USART x。 从 USART x 读取一个字节。 写一个字节到 USART x。 设置增强型 USART x 的波特率配置位。

多个 USART 外设函数
描述

DS51297F_CN 第 66 页

? 2005 Microchip Technology Inc.

硬件外设函数
2.10.1 函数描述

BusyUSART Busy1USART Busy2USART
功能: 头文件: 函数原型: USART 是否正在发送? usart.h char BusyUSART( void ); char Busy1USART( void ); char Busy2USART( void ); 返回值表明 USART 发送器现在是否正忙。应该在开始新的发送之前使 用该函数。 当器件仅有一个 USART 外设时使用 BusyUSART ,而当器件有多个 USART 外设时,使用 Busy1USART 和 Busy2USART。 如果 USART 发送器空闲,为 0 ; 如果 USART 发送器正在使用,则为 1。 ubusy.c u1busy.c u2busy.c while (BusyUSART());

说明:

返回值: 文件名:

代码示例:

CloseUSART Close1USART Close2USART
功能: 头文件: 函数原型: 禁止指定的 USART。 usart.h void CloseUSART( void ); void Close1USART( void ); void Close2USART( void ); 该函数禁止指定 USART 的中断、发送器和接收器。 当器件仅有一个 USART 外设时使用 CloseUSART ,而当器件有多个 USART 外设时,使用 Close1USART 和 Close2USART。 uclose.c u1close.c u2close.c

说明:

文件名:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 67 页

MPLAB? C18 C 编译器函数库
DataRdyUSART DataRdy1USART DataRdy2USART
功能: 头文件: 函数原型: 读缓冲区中是否有数据? usart.h char DataRdyUSART( void ); char DataRdy1USART( void ); char DataRdy2USART( void ); 该函数返回 PIR 寄存器中 RCI 标志位的状态。 当器件仅有一个 USART 外设时使用 DataRdyUSART ,而当器件有多 个 USART 外设时,使用 DataRdy1USART 和 DataRdy2USART。 如果有数据,为 1 ; 如果没有数据,则为 0 。 udrdy.c u1drdy.c u2drdy.c while (!DataRdyUSART());

说明:

返回值: 文件名:

代码示例:

getcUSART getc1USART getc2USART
getcxUSART 定义为 ReadxUSART。参见 ReadUSART。

getsUSART gets1USART gets2USART
功能: 头文件: 函数原型: 从指定的 USART 中读取一个固定长度的字符串。 usart.h void getsUSART ( char * buffer, unsigned char len ); void gets1USART ( char * buffer, unsigned char len ); void gets2USART ( char * buffer, unsigned char len ); buffer 指向存储读取字符的地址的指针。 len 要从 USART 读取的字符数。 该函数仅适用于 8 位发送 / 接收模式。该函数将等待到从指定 USART 中读出 len 个字符为止。当等待字符到达时,不会出现超时。 当器件仅有一个 USART 外设时使用 getsUSART,而当器件有多个 USART 外设时,使用 gets1USART 和 gets2USART。 ugets.c u1gets.c u2gets.c char inputstr[10]; getsUSART( inputstr, 5 );

参数:

说明:

文件名:

代码示例:

DS51297F_CN 第 68 页

? 2005 Microchip Technology Inc.

硬件外设函数
OpenUSART Open1USART Open2USART
功能: 头文件: 函数原型: 配置指定的 USART 模块。 usart.h void OpenUSART( unsigned char config, unsigned int spbrg); void Open1USART( unsigned char config, unsigned int spbrg); void Open2USART( unsigned char config, unsigned int spbrg); config 从下面所列出各类型中分别取一个值并相与 (‘&’)所得的值。这些值在 文件 usart.h 中定义。 发送中断: USART_TX_INT_ON 允许发送中断 USART_TX_INT_OFF 禁止发送中断 接收中断: USART_RX_INT_ON 允许接收中断 USART_RX_INT_OFF 禁止接收中断 USART 模式: USART_ASYNCH_MODE 异步模式 USART_SYNCH_MODE 同步模式 发送宽度: USART_EIGHT_BIT 8 位发送 / 接收 USART_NINE_BIT 9 位发送 / 接收 主 / 从模式选择 *: USART_SYNC_SLAVE 同步从模式 USART_SYNC_MASTER 同步主模式 接收模式: USART_SINGLE_RX 单字节接收 USART_CONT_RX 连续接收 波特率: USART_BRGH_HIGH 高波特率 USART_BRGH_LOW 低波特率 * 仅适用于同步模式 spbrg 这是写到波特率发生器寄存器中的值,它决定 USART 工作的波特率。 计算波特率的公式为: 异步模式,高速: FOSC / (16 * (spbrg + 1)) 异步模式,低速: FOSC / (64 * (spbrg + 1)) 同步模式: FOSC / (4 * (spbrg + 1)) 其中, FOSC 为振荡器频率。 说明: 该函数按照指定的配置选项配置 USART 模块。 当器件仅有一个 USART 外设时使用 OpenUSART ,而当器件有多个 USART 外设时,使用 Open1USART 和 Open2USART。 uopen.c u1open.c u2open.c

参数:

文件名:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 69 页

MPLAB? C18 C 编译器函数库
OpenUSART Open1USART Open2USART (续)
代码示例: OpenUSART1( USART_TX_INT_OFF USART_RX_INT_OFF USART_ASYNCH_MODE USART_EIGHT_BIT USART_CONT_RX USART_BRGH_HIGH, 25 & & & & & );

putcUSART putc1USART putc2USART
putcxUSART 定义为 WritexUSART。参见 WriteUSART。

putsUSART puts1USART puts2USART putrsUSART putrs1USART putrs2USART
功能: 头文件: 函数原型: 向 USART 写入一个包含空字符的字符串。 usart.h void void void void void void putsUSART( char *data puts1USART( char *data puts2USART( char *data putrsUSART( const rom putrs1USART( const rom putrs2USART( const rom ); ); ); char *data ); char *data ); char *data );

参数: 说明:

data 指向以空字符结尾的数据串的指针。 该函数仅适用于 8 位发送 / 接收模式。该函数向 USART 写入一个包含 空字符的字符串。 对于位于数据存储器中的字符串,应该使用这些函数的 “puts”形式。 对于位于程序存储器中的字符串,其中包括字符串常量,应该使用这些 函数的 “putrs”形式。 当器件仅有一个 USART 外设时使用 putsUSART 和 putrsUSART,而 当器件有多个 USART 外设时,使用其他函数。 uputs.c u1puts.c u2puts.c uputrs.c u1putrs.c u2putrs.c putrsUSART( “Hello World!” );

文件名:

代码示例:

DS51297F_CN 第 70 页

? 2005 Microchip Technology Inc.

硬件外设函数
ReadUSART Read1USART Read2USART getcUSART getc1USART getc2USART
函数: 头文件: 函数原型: 从 USART 接收缓冲区读取一个字节 (一个字符) ,包括第 9 位 (如果 使能了 9 位模式的话) 。 usart.h char char char char char char ReadUSART( Read1USART( Read2USART( getcUSART( getc1USART( getc2USART( void void void void void void ); ); ); ); ); );

说明:

此函数从 USART 接收缓冲区读取一个字节。状态位和第 9 个数据位保 存在定义如下的联合中: union USART { unsigned char val; struct { unsigned RX_NINE:1; unsigned TX_NINE:1; unsigned FRAME_ERROR:1; unsigned OVERRUN_ERROR:1; unsigned fill:4; }; }; 如果使能了 9 位模式,则第 9 位是只读的。状态位将始终被读取。 对于具有一个 USART 外设的器件,应该使用 getcUSART 和 ReadUSART 函数,且状态信息读入名为 USART_Status 的变量,此变 量类型为上述的 USART 联合。 对于具有多个 USART 外设的器件,应该使用 getcxUSART 和 ReadxUSART 函数,状态信息读入名为 USARTx_Status 的变量,此变 量类型为上述的 USART 联合。

返回值: 文件名:

此函数返回 USART 接收缓冲区中的下一个字符。 uread.c u1read.c u2read.c #define in usart.h #define in usart.h #define in usart.h int result; result = ReadUSART(); result |= (unsigned int) USART_Status.RX_NINE << 8;

代码示例:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 71 页

MPLAB? C18 C 编译器函数库
WriteUSART Write1USART Write2USART putcUSART putc1USART putc2USART
函数: 头文件: 函数原型: 写一个字节 (一个字符)到 USART 发送缓冲区,包括第 9 位 (如果 使能了 9 位模式的话) 。 usart.h void void void void void void WriteUSART( char data ); Write1USART( char data ); Write2USART( char data ); putcUSART( char data ); putc1USART( char data ); putc2USART( char data );

参数: 说明:

data 要写到 USART 的值。 此函数写一个字节到 USART 发送缓冲区。如果使能了 9 位模式,则第 9 位从字段 TX_NINE 写入, 此字段包含在类型为 USART 的一个变量中。 union USART { unsigned char val; struct { unsigned RX_NINE:1; unsigned TX_NINE:1; unsigned FRAME_ERROR:1; unsigned OVERRUN_ERROR:1; unsigned fill:4; }; }; 对于带有一个 USART 外设的器件,应该使用 putcUSART 和 WriteUSART 函数, Status 寄存器名为 USART_Status,其类型为上述的 USART 联合。 对于带有多个 USART 外设的器件,应该使用 putcxUSART 和 WritexUSART 函数,状态寄存器名为 USARTx_Status,其类型为上 述的 USART 联合。

文件名:

uwrite.c u1write.c u2write.c #define in usart.h #define in usart.h #define in usart.h unsigned int outval; USART1_Status.TX_NINE = (outval & 0x0100) >> 8; Write1USART( (char) outval );

代码示例:

DS51297F_CN 第 72 页

? 2005 Microchip Technology Inc.

硬件外设函数
baudUSART baud1USART baud2USART
函数: 头文件: 函数原型: 为增强型 USART 的运行设置波特率配置位。 usart.h void baudUSART( unsigned char baudconfig ); void baud1USART( unsigned char baudconfig ); void baud2USART( unsigned char baudconfig ); baudconfig 从下面所列出各类型中分别取一个值并相与 (‘&’)所得的值。这些值在 文件 usart.h 中定义: 时钟空闲状态: BAUD_IDLE_CLK_HIGH 时钟空闲状态为高电平 BAUD_IDLE_CLK_LOW 时钟空闲状态为低电平 波特率发生: BAUD_16_BIT_RATE 16 位波特率发生 BAUD_8_BIT_RATE 8 位波特率发生 RX 引脚监视: BAUD_WAKEUP_ON 监测 RX 引脚 BAUD_WAKEUP_OFF 不监测 RX 引脚 波特率测量: BAUD_AUTO_ON 使能自动波特率测量 BAUD_AUTO_OFF 禁止自动波特率测量 这些函数仅适用于带有增强型 USART 功能的处理器。 ubaud.c u1baud.c u2baud.c baudUSART (BAUD_IDLE_CLK_HIGH & BAUD_16_BIT_RATE & BAUD_WAKEUP_ON & BAUD_AUTO_ON);

参数:

说明: 文件名:

代码示例:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 73 页

MPLAB? C18 C 编译器函数库
2.10.2 使用示例
#include <p18C452.h> #include <usart.h> void main(void) { // configure USART OpenUSART( USART_TX_INT_OFF USART_RX_INT_OFF USART_ASYNCH_MODE USART_EIGHT_BIT USART_CONT_RX USART_BRGH_HIGH, 25 ); while(1) { while( ! PORTAbits.RA0 ); WriteUSART( PORTD ); if(PORTD == 0x80) break; } CloseUSART(); }

& & & & &

//wait for RA0 high //write value of PORTD // check for termination // value

DS51297F_CN 第 74 页

? 2005 Microchip Technology Inc.

MPLAB? C18 C 编译器 函数库 第 3 章 软件外设函数库
3.1 简介
本章讲述软件外设库函数。所有这些函数的源代码可以在 MPLAB C18 编译器安装目 录的 src\traditional\pmc 和 src\extended\pmc 子目录下找到。 请参阅 《MPASM? 汇编器、 MPLINK? 目标链接器和 MPLIB? 目标库管理器用户 指南》 (DS33014J_CN) ,获得更多有关创建函数库的信息。 MPLAB C18 库函数支持下列外设: ? ? ? ? ? 外部 LCD 函数 (第 3.2 节 “外部 LCD 函数” ) 外部 CAN2510 函数 (第 3.3 节 “外部 CAN2510 函数” ) 2 软件 I C? 函数 (第 3.4 节 “软件 I?C 函数” ) 软件 SPI 函数 (第 3.5 节 “软件 SPI 函数” ) 软件 UART 函数 (第 3.6 节 “软件 UART 函数” )

3.2

外部 LCD 函数
设计这些函数,旨在使用 PIC18 单片机的 I/O 引脚控制 Hitachi 的 HD44780 LCD 控制 器。所提供函数见下表: 表 3-1:
函数 BusyXLCD OpenXLCD putcXLCD putsXLCD putrsXLCD ReadAddrXLCD ReadDataXLCD SetCGRamAddr SetDDRamAddr WriteCmdXLCD WriteDataXLCD LCD 控制器是否正忙? 配置用于控制 LCD 的 I/O 线,并初始化 LCD 。 向 LCD 控制器写一个字节。 从数据存储器写一个字符串到 LCD 。 从程序存储器写一个字符串到 LCD 。 从 LCD 控制器中读出地址字节。 从 LCD 控制器中读取一字节数据。 设置字符发生器的地址。 设置显示数据地址。 写一个命令到 LCD 控制器。 写一字节数据到 LCD 控制器。

外部 LCD 函数
描述

可以改变引脚的分配, xlcd.h 文件在编译器安装目录的 h 子目录下。

这些函数的预编译形式使用默认的引脚分配。通过在文件 xlcd.h 中重新定义下列宏,

? 2005 Microchip Technology Inc.

DS51297F_CN 第 75 页

MPLAB? C18 C 编译器函数库
表 3-2:
LCD 控制器线 E 引脚 E_PIN TRIS_E RS 引脚 RS_PIN TRIS_RS RW 引脚 RW_PIN TRIS_RW 数据线 DATA_PORT

选择 LCD 引脚分配的宏
宏 默认值 PORTBbits.RB4 DDRBbits.RB4 PORTBbits.RB5 DDRBbits.RB5 PORTBbits.RB6 DDRBbits.RB6 PORTB 用途 用于 E 线的引脚。 控制与 E 线有关引脚的方向的位。 用于 RS 线的引脚。 控制与 RS 线有关引脚的方向的 位。 用于 RW 线的引脚。 控制与 RW 线有关引脚的方向的 位。 用于数据线的引脚。这些函数假设 所有引脚都在一个端口上。 和数据线有关的数据方向寄存器。

TRIS_DATA_PORT

DDRB

所提供的函数库可工作在 4 位模式或 8 位模式。工作在 8 位模式时,使用一个端口的 所有引脚。当工作在 4 位模式时,只使用一个端口的低 4 位或者高 4 位。下表列出了 用于选择 4 位或 8 位模式的宏,以及用于选择工作在 4 位模式时使用端口哪些位的 宏。 表 3-3:
宏 BIT8 UPPER 未定义 未定义

选择 4 位或 8 位模式的宏
默认值 用途 如果创建库函数时定义了此值,库函数将工作在 8 位传 输模式;否则,将工作在 4 位传输模式。 当未定义 BIT8 时,该值将决定使用 DATA_PORT 的哪一 个半字节来传输数据。 如果定义了 UPPER,使用 DATA_PORT 的高 4 位 (4:7) 。 如果没有定义 UPPER,则使用 DATA_PORT 的低 4 位 (0:3) 。

完成上述定义后,用户必须重新编译 XLCD 子程序,然后在项目中包含更新过的文 件。这可通过把 XLCD 源文件添加到项目中,或者使用提供的批处理文件重新编译库 文件来完成。

DS51297F_CN 第 76 页

? 2005 Microchip Technology Inc.

软件外设函数库
XLCD 函数库还需要用户定义下列函数,以提供适当的延时: 表 3-4: XLCD 延时函数
函数 DelayFor18TCY DelayPORXLCD DelayXLCD 延时 18 个周期。 延时 15 ms。 延时 5 ms。 功能

3.2.1

函数描述

BusyXLCD
功能: 头文件: 函数原型: 说明: 返回值: 文件名: 代码示例: LCD 控制器是否正忙? xlcd.h unsigned char BusyXLCD( void ); 该函数返回 Hitachi HD44780 LCD 控制器忙 (busy)标志的状态。 如果控制器忙,返回 1 ; 否则,返回 0。 busyxlcd.c while( BusyXLCD() );

OpenXLCD
功能: 头文件: 函数原型: 参数:
配置 PIC? 单片机的 I/O 引脚,并初始化 LCD 控制器。 xlcd.h void OpenXLCD( unsigned char lcdtype ); lcdtype 从下面所列出各类型中分别取一个值并相与 (‘&’)所得的值。这些值在 文件 xlcd.h 中定义。 数据接口: FOUR_BIT 4 位数据接口模式 EIGHT_BIT 8 位数据接口模式 LCD 配置: LINE_5X7 5x7 个字符,单行显示 LINE_5X10 5x10 个字符显示 LINES_5X7 5x7 个字符,多行显示 该函数配置用于控制 Hitachi HD44780 LCD 控制器的 PIC18 I/O 引脚, 并初始化 LCD 控制器。 openxlcd.c OpenXLCD( EIGHT_BIT & LINES_5X7 );

说明: 文件名: 代码示例:

putcXLCD
参见 WriteDataXLCD。

? 2005 Microchip Technology Inc.

DS51297F_CN 第 77 页

MPLAB? C18 C 编译器函数库
putsXLCD putrsXLCD
功能: 头文件: 函数原型: 参数: 说明: 向 Hitachi HD44780 LCD 控制器写入一个字符串。 xlcd.h void putsXLCD( char *buffer ); void putrsXLCD( const rom char *buffer ); buffer 指向要写入 LCD 控制器的字符的指针。 该函数把 buffer 中的字符串写到 Hitachi HD44780 LCD 控制器。当 遇到空字符时会停止传输,不传输空字符。 对于位于数据存储器中的字符串,应该使用这些函数的 “puts”形式。 对于位于程序存储器中的字符串,包括字符串常量,应该使用这些函数 的 “putrs”形式 。 putsxlcd.c putrxlcd.c char mybuff [20]; putrsXLCD( “Hello World” ); putsXLCD( mybuff );

文件名: 代码示例:

ReadAddrXLCD
功能: 头文件: 函数原型: 说明: 从 Hitachi HD44780 LCD 控制器中读出地址字节。 xlcd.h unsigned char ReadAddrXLCD( void ); 该函数从 Hitachi HD44780 LCD 控制器中读出地址字节。当执行此操作 时, LCD 控制器不能处于忙状态 — 这可通过 BusyXLCD 函数来检 查。 从控制器中读出的地址是字符发生器 RAM 的地址还是显示数据 RAM 的地址,取决于前面调用 的 Set??RamAddr 函数。 该函数返回一个 8 位的值。地址保存在低 7 位中, BUSY 状态标志保存 在最高有效位中。 readaddr.c char addr; while ( BusyXLCD() ); addr = ReadAddrXLCD();

返回值: 文件名: 代码示例:

DS51297F_CN 第 78 页

? 2005 Microchip Technology Inc.

软件外设函数库
ReadDataXLCD
功能: 头文件: 函数原型: 说明: 从 Hitachi HD44780 LCD 控制器中读出一字节数据。 xlcd.h char ReadDataXLCD( void ); 该函数从 Hitachi HD44780 LCD 控制器中读出一字节数据。当执行此操 作时, LCD 控制器不能处于忙状态 — 这可以通过使用 BusyXLCD 函 数来检查。 从控制器读出的数据是字符发生器 RAM 的数据还是显示数据 RAM 的 数据,取决于前面调用 的 Set??RamAddr 函数。 该函数返回一个 8 位的数据值。 readdata.c char data; while ( BusyXLCD() ); data = ReadAddrXLCD();

返回值: 文件名: 代码示例:

SetCGRamAddr
功能: 头文件: 函数原型: 参数: 说明: 设置字符发生器的地址。 xlcd.h void SetCGRamAddr( unsigned char addr ); addr 字符发生器的地址。 该函数设置 Hitachi HD44780 LCD 控制器字符发生器的地址。当执行此 操作时, LCD 控制器不能处于忙状态 -- 这可以通过使用 BusyXLCD 函 数来检查。 setcgram.c char cgaddr = 0x1F; while( BusyXLCD() ); SetCGRamAddr( cgaddr );

文件名: 代码示例:

SetDDRamAddr
功能: 头文件: 函数原型: 参数: 说明: 文件名: 代码示例: 设置显示数据的地址。 xlcd.h void SetDDRamAddr( unsigned char addr ); addr 显示数据的地址。 该函数设置 Hitachi HD44780 LCD 控制器中显示数据的地址。 LCD 控 制器不能处于忙状态 — 这可以通过使用 BusyXLCD 函数来检查。 setddram.c char ddaddr = 0x10; while( BusyXLCD() ); SetDDRamAddr( ddaddr );

? 2005 Microchip Technology Inc.

DS51297F_CN 第 79 页

MPLAB? C18 C 编译器函数库
WriteCmdXLCD
功能: 头文件: 函数原型: 参数: 写一个命令到 Hitachi HD44780 LCD 控制器。 xlcd.h void WriteCmdXLCD( unsigned char cmd ); cmd 指定要执行的命令。命令可以是 xlcd.h 中定义的下列值之一: DOFF CURSOR_OFF BLINK_ON BLINK_OFF SHIFT_CUR_LEFT SHIFT_CUR_RIGHT SHIFT_DISP_LEFT SHIFT_DISP_RIGHT 关闭显示 使能无光标显示 使能闪烁光标显示 使能不闪烁光标显示 光标左移 光标右移 显示左移 显示右移

或者,命令也可以是从下面所列出各类型中分别取一个值并相与 (‘&’) 所得的值。这些值在文件 xlcd.h 中定义。 数据传输模式: FOUR_BIT EIGHT_BIT 显示类型: LINE_5X7 LINE_5X10 LINES_5X7 说明: 4 位数据接口模式 8 位数据接口模式 5x7 个字符,单行显示 5x10 个字符显示 5x7 个字符,多行显示

文件名: 代码示例:

该函数把命令字节写入到 Hitachi HD44780 LCD 控制器。执行此操作时 LCD 控制器不能处于忙状态 — 这可以通过使用 BusyXLCD 函数来检 查。 wcmdxlcd.c while( BusyXLCD() ); WriteCmdXLCD( EIGHT_BIT & LINES_5X7 ); WriteCmdXLCD( BLINK_ON ); WriteCmdXLCD( SHIFT_DISP_LEFT );

putcXLCD WriteDataXLCD
功能 头文件: 函数原型: 参数: 把一字节数据写入到 Hitachi HD44780 LCD 控制器。 xlcd.h void WriteDataXLCD( char data ); data data 的值可以是任意 8 位值,但是应该和 HD44780 LCD 控制器的字符 RAM 表相对应。 该函数把一字节数据写入到 Hitachi HD44780 LCD 控制器。当执行此操 作时, LCD 控制器不能处于忙状态 — 这可通过 BusyXLCD 函数来检 查。 从控制器中读出的数据是字符发生器 RAM 的数据还是显示数据 RAM 的数据,取决于前面调用 的 Set??RamAddr 函数。 writdata.c

说明:

文件名:

DS51297F_CN 第 80 页

? 2005 Microchip Technology Inc.

软件外设函数库
3.2.2
#include #include #include #include

使用示例
<p18C452.h> <xlcd.h> <delays.h> <usart.h>

void DelayFor18TCY( void ) { Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); } void DelayPORXLCD (void) { Delay1KTCYx(60); // Delay of // Cycles = // Cycles = // Cycles = return; } void DelayXLCD (void) { Delay1KTCYx(20); // // // // return; } void main( void ) { char data;

15ms (TimeDelay * Fosc) / 4 (15ms * 16MHz) / 4 60,000

Delay of Cycles = Cycles = Cycles =

5ms (TimeDelay * Fosc) / 4 (5ms * 16MHz) / 4 20,000

// configure external LCD OpenXLCD( EIGHT_BIT & LINES_5X7 ); // configure USART OpenUSART( USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX, 25); while(1) { while(!DataRdyUSART()); data = ReadUSART(); WriteDataXLCD(data); if(data=='Q') break; } CloseUSART(); }
? 2005 Microchip Technology Inc. DS51297F_CN 第 81 页

//wait for data //read data //write to LCD

MPLAB? C18 C 编译器函数库
3.3 外部 CAN2510 函数
本节讲述 MCP2510 外部外设库函数。所提供函数见下表: 表 3-5: 外部 CAN2510 函数
函数 CAN2510BitModify CAN2510ByteRead CAN2510ByteWrite CAN2510DataRead CAN2510DataReady CAN2510Disable CAN2510Enable CAN2510ErrorState CAN2510Init CAN2510InterruptEnable CAN2510InterruptStatus CAN2510LoadBufferStd CAN2510LoadBufferXtd CAN2510LoadRTRStd CAN2510LoadRTRXtd CAN2510ReadMode CAN2510ReadStatus CAN2510Reset CAN2510SendBuffer CAN2510SequentialRead CAN2510SequentialWrite CAN2510SetBufferPriority CAN2510SetMode CAN2510SetMsgFilterStd 描述 将一个寄存器中的指定位修改为新值。 读取由地址指定的 MCP2510 寄存器。 写一个值到由地址指定的 MCP2510 寄存器。 从指定的接收缓冲区中读取报文。 确定指定的接收缓冲区中是否有数据可读。 将所选择的 PIC18CXXX I/O 引脚设置为高电平,禁止 MCP2510 的片选。 (1) 将所选择的 PIC18CXXX I/O 引脚驱动为低电平,片选 MCP2510。 (1) 读 CAN 总线的当前错误状态。 初始化 PIC18CXXX 的 SPI 口以与 MCP2510 进行通讯, 然后配置 MCP2510 寄存器以与 CAN 总线接口。 将 CAN2510 的中断允许位 (CANINTE 寄存器)修改为 新值。 指明 CAN2510 的中断源。 把标准数据帧装入指定的发送缓冲区。 把扩展数据帧装入指定的发送缓冲区。 把标准远程帧装入指定的发送缓冲区。 把扩展远程帧装入指定的发送缓冲区。 读取 MCP2510 的当前工作模式。 读取 MCP2510 发送缓冲区和接收缓冲区的状态。 复位 MCP2510。 请求发送指定发送缓冲区中的报文。 从 MCP2510 中,自指定地址开始连续读取指定的字节 数。这些值存储在 DataArray 中。 自指定地址开始,向 MCP2510 连续写入指定的字节数。 这些值来自于 DataArray。 为指定发送缓冲区装入指定的优先级。 配置 MCP2510 的工作模式。 为标准报文配置某个接收缓冲区的所有过滤器和屏蔽器。

DS51297F_CN 第 82 页

? 2005 Microchip Technology Inc.

软件外设函数库
表 3-5: 外部 CAN2510 函数 (续)
函数 CAN2510SetMsgFilterXtd 描述 为扩展报文配置某个接收缓冲区的所有过滤器和屏蔽器。

CAN2510SetSingleFilterStd 为标准 (Std)报文配置指定的接收过滤器。 CAN2510SetSingleFilterXtd 为扩展 (Xtd)报文配置指定的接收过滤器。 CAN2510SetSingleMaskStd CAN2510SetSingleMaskXtd CAN2510WriteBuffer CAN2510WriteStd CAN2510WriteXtd 注 为标准 (Std)格式报文配置指定接收缓冲区的屏蔽器。 为扩展 (Xtd)报文配置指定接收缓冲区的屏蔽器。 启动所选发送缓冲区的 CAN 报文发送。 使用第一个可用的发送缓冲区,将标准格式报文写到 CAN 总线。 使用第一个可用的发送缓冲区,将扩展格式报文写到 CAN 总线。

1: 在下列情况下,函数 CAN2510Enable 和 CAN2510Disable 需要重新编译:

- PICmicro? 单片机 CS 引脚的分配做了修改,不和 RC2 相连 - 需要修改器件的头文件

3.3.1

函数描述

CAN2510BitModify
功能: 头文件: 函数原型: 将一个寄存器中的指定位修改为新值。 can2510.h void CAN2510BitModify( unsigned char addr unsigned char mask unsigned char data ); addr addr 的值指定要修改的 MCP2510 寄存器的地址。 mask mask 的值指定将被修改的位。 data data 的值指定位的新状态。 说明: 该函数修改由地址指定的寄存器的内容, mask 指定要修改哪些位, data 指定要装入这些位的新值。只能对某些特定寄存器使用位修改命 令。 canbmod.c 所要求的 CAN 模式: 所有模式均可

参数:

文件名:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 83 页

MPLAB? C18 C 编译器函数库
CAN2510ByteRead
功能: 要求的 CAN 模式: 头文件: 函数原型: 参数: 说明: 返回值: 文件名: 读取由地址指定的 MCP2510 寄存器。 所有模式均可 can2510.h unsigned char CAN2510ByteRead( unsigned char address ); address 要从中读取数据的 MCP2510 寄存器的地址。 该函数按照从指定地址的 MCP2510 中读取一字节数据。 指定地址的内容。 readbyte.c

CAN2510ByteWrite
功能: 要求的 CAN 模式: 头文件: 函数原型: 写一个值到由地址指定的 MCP2510 寄存器。 所有模式均可 can2510.h void CAN2510ByteWrite( unsigned char address, unsigned char value ); address 要写入数据的 MCP2510 的地址。 value 要写入的值。 说明: 文件名: 该函数向由地址指定的 MCP2510 寄存器写入一字节数据。 wrtbyte.c

参数:

CAN2510DataRead
功能: 要求的 CAN 模式: 头文件: 函数原型: 从指定的接收缓冲区中读取报文。 除配置模式外的所有模式 can2510.h unsigned char CAN2510DataRead( unsigned char bufferNum, unsigned long *msgId, unsigned char *numBytes, unsigned char *data ); bufferNum 要从中读取报文的接收缓冲区,取下列值之一: CAN2510_RXB0 读取接收缓冲区 0 CAN2510_RXB1 读取接收缓冲区 1 msgId 指向将被函数修改、保存 CAN 标准报文标识符的地址。

参数:

DS51297F_CN 第 84 页

? 2005 Microchip Technology Inc.

软件外设函数库
CAN2510DataRead (续)
numBytes 指向将被函数修改、保存此报文中字节数的地址。 data 指向将被该函数修改、保存报文数据的数组。此数组应该至少 8 个字节 长,因为这是报文数据的最大长度。 说明: 该函数确定报文是标准报文还是扩展报文,将 ID 和报文长度解码,并用 适当的信息来填充用户提供的地址。应该使用 CAN2510DataReady 函 数来确定指定的缓冲区是否有数据可读。 函数返回下列值之一: CAN2510_XTDMSG 扩展格式报文 CAN2510_STDMSG 标准格式报文 CAN2510_XTDRTR 远程发送请求 (XTD 报文) CAN2510_STDRTR 远程发送请求 (STD 报文) canread.c

返回值:

文件名:

CAN2510DataReady
功能: 要求的 CAN 模式: 头文件: 函数原型: 参数: 确定指定的接收缓冲区中是否有数据可读。 除配置模式外的所有模式 can2510.h unsigned char CAN2510DataReady( unsigned char bufferNum ); bufferNum 要检查以确定其中是否有等待报文的接收缓冲区,其值为: CAN2510_RXB0 检查接收缓冲区 0 CAN2510_RXB1 检查接收缓冲区 1 CAN2510_RXBX 检查接收缓冲区 0 和接收缓冲区 1 该函数检测 CANINTF 寄存器中相应的 RXnIF 位。 如果没有检测到任何报文,返回 0 ;若检测到报文,则返回一个非 0 的 值。 1 = 缓冲区 0 2 = 缓冲区 1 3 = 缓冲区 0 和缓冲区 1 canready.c

说明: 返回值:

文件名:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 85 页

MPLAB? C18 C 编译器函数库
CAN2510Disable
功能: 要求的 CAN 模式: 头文件: 将所选择的 PIC18CXXX I/O 引脚设置为高电平, 禁止 MCP2510 的片选。 所有模式均可 canenabl.h 如果片选信号没有和 PICmicro 单片机的 RC2 引脚相连,则应修 改此头文件。 void CAN2510Disable( void ); 注: 无 该函数要求用户修改文件,指定用于和 MCP2510 CS 引脚相连的 PIC18CXXX I/O 引脚 (及端口) 。默认引脚是 RC2。 注: 包含此函数 (和 CAN2510Enable 函数)的源文件必须修改定 义,正确指定用于控制 MCP2510 CS 引脚的端口 (A, B, C, ...) 和引脚号 (1, 2, 3, ...) 。修改后,必须重建特定处理器的函数 库。重建函数库的信息可参见第 1.5.3 节 “ 重建 ” 。 canenabl.c

函数原型: 参数: 说明:

文件名:

CAN2510Enable
功能: 要求的 CAN 模式: 头文件: 将所选择的 PIC18CXXX I/O 引脚驱动为低电平,片选 MCP2510。 所有模式均可 canenabl.h 如果片选信号没有和 PICmicro 单片机的 RC2 引脚相连,则应修 改此头文件。 void CAN2510Enable( void ); 注: 该函数要求用户修改文件,指定用于和 MCP2510 CS 引脚相连的 PIC18CXXX I/O 引脚 (及端口) 。默认引脚是 RC2。 注: 包含此函数 (和 CAN2510Enable 函数)的源文件必须修改定 义,正确指定用于控制 MCP2510 CS 引脚的端口 (A, B, C, ...) 和引脚号 (1, 2, 3, ...) 。修改后,必须重建特定处理器的函数 库。重建函数库的信息可参见第 1.5.3 节 “重建”。 canenabl.c

函数原型: 说明:

文件名:

DS51297F_CN 第 86 页

? 2005 Microchip Technology Inc.

软件外设函数库
CAN2510ErrorState
功能: 要求的 CAN 模式: 头文件: 函数原型: 说明: 返回值: 读 CAN 总线的当前错误状态。 正常模式、环回测试模式和监听模式 (在配置模式中复位错误计数器) can2510.h unsigned char CAN2510ErrorState( void ); 该函数返回 CAN 总线的错误状态。错误状态取决于 TEC 寄存器和 REC 寄存器中的值。 函数返回下列值之一: CAN2510_BUS_OFF CAN2510_ERROR_PASSIVE_TX CAN2510_ERROR_PASSIVE_RX CAN2510_ERROR_ACTIVE_WITH_TXWARN CAN2510_ERROR_ACTIVE_WITH_RXWARN CAN2510_ERROR_ACTIVE canerrst.c TEC > 255 TEC > 127 REC > 127 TEC > 95 REC > 95 TEC ≤ 95 且 REC ≤ 95

文件名:

CAN2510Init
功能: 要求的 CAN 模式: 头文件: 函数原型: 初始化 PIC18CXXX 的 SPI 口以与 MCP2510 进行通讯,然后配置 MCP2510 寄存器以与 CAN 总线接口。 配置模式 can2510.h unsigned char CAN2510Init( unsigned short long BufferConfig, unsigned short long BitTimeConfig, unsigned char interruptEnables, unsigned char SPI_syncMode, unsigned char SPI_busMode, unsigned char SPI_smpPhase ); 下列参数的值在头文件 can2510.h 中定义。 BufferConfig BufferConfig 的值是下列选项的位与 (‘&’)操作得到的。每组功能中只 能选择一项,用粗体字标出的选项是默认值。

参数:

复位 MCP2510
指定是否要发送 MCP2510 复位命令。这并不和 MCP2510 寄存器中的 一位相对应。 CAN2510_NORESET 不复位 MCP2510 CAN2510_RESET 复位 MCP2510

缓冲区 0 过滤
由 RXB0M1:RXB0M0 位 (RXB0CTRL 寄存器)控制 CAN2510_RXB0_USEFILT 接收所有报文,使用过滤器 CAN2510_RXB0_STDMSG 只接收标准报文 CAN2510_RXB0_XTDMSG 只接收扩展报文 CAN2510_RXB0_NOFILT 接收所有报文,不使用过滤器

缓冲区 1 过滤
由 RXB1M1:RXB1M0 位 (RXB1CTRL 寄存器)控制 CAN2510_RXB1_USEFILT 接收所有报文,使用过滤器 CAN2510_RXB1_STDMSG 只接收标准报文 CAN2510_RXB1_XTDMSG 只接收扩展报文 CAN2510_RXB1_NOFILT 接收所有报文,不使用过滤器

? 2005 Microchip Technology Inc.

DS51297F_CN 第 87 页

MPLAB? C18 C 编译器函数库
CAN2510Init (续)
接收缓冲区 0 向接收缓冲区 1 转存
由 BUKT 位 (RXB0CTRL 寄存器)控制 CAN2510_RXB0_ROLL 如果接收缓冲区 0 已满,则报文会转存 到接收缓冲区 1 CAN2510_RXB0_NOROLL 禁止转存 RX1BF 引脚设置 由 B1BFS:B1BFE:B1BFM 位 (BFPCTRL 寄存器)控制 CAN2510_RX1BF_OFF RX1BF 引脚处于高阻态 CAN2510_RX1BF_INT RX1BF 引脚为输出, 表明接收缓冲区 1 装入数据,也可用作中断信号。 CAN2510_RX1BF_GPOUTH RX1BF 引脚为通用的数字输出,输出 为高电平。 CAN2510_RX1BF_GPOUTL RX1BF 引脚为通用的数字输出,输出 为低电平。 RX0BF 引脚设置 由 B0BFS:B0BFE:B0BFM 位 (BFPCTRL 寄存器)控制 CAN2510_RX0BF_OFF RX0BF 引脚处于高阻态 表明接收缓冲区 0 CAN2510_RX0BF_INT RX0BF 引脚为输出, 装入数据,也可用作中断信号。 CAN2510_RX0BF_GPOUTH RX0BF 引脚为通用的数字输出,输出 为高电平。 CAN2510_RX0BF_GPOUTL RX0BF 引脚为通用的数字输出,输出 为低电平。 TX2 引脚设置 由 B2RTSM 位 (TXRTSCTRL 寄存器)控制 CAN2510_TX2_GPIN TX2RTS 引脚为数字输入 CAN2510_TX2_RTS TX2RTS 引脚为输入,用于初始化来自 TXBUF2 的发送请求帧。 TX1 引脚设置 由 B1RTSM 位 (TXRTSCTRL 寄存器)控制 CAN2510_TX1_GPIN TX1RTS 引脚为数字输入 CAN2510_TX1_RTS TX1RTS 引脚为输入,用于初始化来自 TXBUF1 的发送请求帧。 TX0 引脚设置 由 B0RTSM 位 (TXRTSCTRL 寄存器)控制 CAN2510_TX0_GPIN TX0RTS 引脚为数字输入。 CAN2510_TX0_RTS TX0RTS 引脚为输入,用于初始化来自 TXBUF0 的发送请求帧。

请求工作模式
由 REQOP2:REQOP0 位 (CANCTRL 寄存器)控制 CAN2510_REQ_CONFIG 配置模式 CAN2510_REQ_NORMAL 正常工作模式 CAN2510_REQ_SLEEP 休眠模式 CAN2510_REQ_LOOPBACK 环回测试模式 CAN2510_REQ_LISTEN 监听模式 CLKOUT 引脚设置 由 CLKEN:CLKPRE1:CLKPRE0 位 (CANCTRL 寄存器)控制 CAN2510_CLKOUT_8 CLKOUT = FOSC / 8 CAN2510_CLKOUT_4 CLKOUT = FOSC / 4 CAN2510_CLKOUT_2 CLKOUT = FOSC / 2 CAN2510_CLKOUT_1 CLKOUT = FOSC CAN2510_CLKOUT_OFF 禁止 CLKOUT

DS51297F_CN 第 88 页

? 2005 Microchip Technology Inc.

软件外设函数库
CAN2510Init (续)
BitTimeConfig BitTimeConfig 的值是下列值的位与 (‘&’) 。每组功能中只可选择一个选 项,用粗体字标出的选项是默认值。

波特率预分频器 (BRP)
通过 BRP5:BRP0 位 (CNF1 寄存器)控制 CAN2510_BRG_1X TQ = 1 x (2TOSC) : : CAN2510_BRG_64X TQ = 64 x (2TOSC)

同步跳转宽度 (SJW)
通过 SJW1:SJW0 位 (CNF1 寄存器)控制 CAN2510_SJW_1TQ SJW 长度 = 1 TQ CAN2510_SJW_2TQ SJW 长度 = 2 TQ CAN2510_SJW_3TQ SJW 长度 = 3 TQ CAN2510_SJW_4TQ SJW 长度 = 4 TQ

相位缓冲段 2 宽度
通过 PH2SEG2:PH2SEG0 位 (CNF3 寄存器)控制 CAN2510_PH2SEG_2TQ 长度 = 2 TQ CAN2510_PH2SEG_3TQ 长度 = 3 TQ CAN2510_PH2SEG_4TQ 长度 = 4 TQ CAN2510_PH2SEG_5TQ 长度 = 5 TQ CAN2510_PH2SEG_6TQ 长度 = 6 TQ CAN2510_PH2SEG_7TQ 长度 = 7 TQ CAN2510_PH2SEG_8TQ 长度 = 8 TQ

相位缓冲段 1 宽度
通过 PH1SEG2:PH1SEG0 位 (CNF2 寄存器)控制 CAN2510_PH1SEG_1TQ 长度 = 1 TQ CAN2510_PH1SEG_2TQ 长度 = 2 TQ CAN2510_PH1SEG_3TQ 长度 = 3 TQ CAN2510_PH1SEG_4TQ 长度 = 4 TQ CAN2510_PH1SEG_5TQ 长度 = 5 TQ CAN2510_PH1SEG_6TQ 长度 = 6 TQ CAN2510_PH1SEG_7TQ 长度 = 7 TQ CAN2510_PH1SEG_8TQ 长度 = 8 TQ

传播段宽度
通过 PRSEG2:PRSEG0 位 (CNF2 寄存器)控制 CAN2510_PROPSEG_1TQ 长度 = 1 TQ CAN2510_PROPSEG_2TQ 长度 = 2 TQ CAN2510_PROPSEG_3TQ 长度 = 3 TQ CAN2510_PROPSEG_4TQ 长度 = 4 TQ CAN2510_PROPSEG_5TQ 长度 = 5 TQ CAN2510_PROPSEG_6TQ 长度 = 6 TQ CAN2510_PROPSEG_7TQ 长度 = 7 TQ CAN2510_PROPSEG_8TQ 长度 = 8 TQ 通过 BTLMODE 位 (CNF2 寄存器)控制。该值将确定相位段 2 的长度 是由 PH2SEG2:PH2SEG0 位决定,还是由 PH1SEG2:PH1SEG0 位和 (2TQ) 中的较大者来决定。 CAN2510_PH2SOURCE_PH2 长度 = PH2SEG2:PH2SEG0 CAN2510_PH2SOURCE_PH1 长度 = PH1SEG2:PH1SEG0 和 2TQ 中的较大者

相位段 2 的源

位采样点频度
通过 SAM 位 (CNF2 寄存器)来控制。它将确定在采样点上此位被采样 1 次还是被采样 3 次 。 CAN2510_SAMPLE_1x 只采样 1 次 CAN2510_SAMPLE_3x 采样 3 次

? 2005 Microchip Technology Inc.

DS51297F_CN 第 89 页

MPLAB? C18 C 编译器函数库
CAN2510Init (续)
休眠模式下 RX 引脚噪声滤波
由 WAKFIL 位 (CNF3 寄存器)控制。这将确定当器件处于休眠模式 时, RX 引脚是否使用滤波器来抑制噪声。 CAN2510_RX_FILTER 休眠模式时在 RX 引脚上滤波 CAN2510_RX_NOFILTER 休眠模式时不在 RX 引脚上滤波 interruptEnables interruptEnables 的值是下列值的位与 (‘&’) 。其中用粗体字标出的 选项是默认值。通过 CANINTE 寄存器的所有位来控制。 CAN2510_NONE_EN CAN2510_MSGERR_EN CAN2510_WAKEUP_EN CAN2510_ERROR_EN CAN2510_TXB2_EN CAN2510_TXB1_EN CAN2510_TXB0_EN CAN2510_RXB1_EN CAN2510_RXB0_EN SPI_syncMode 指定 PIC18CXXX SPI 同步频率: CAN2510_SPI_FOSC4 CAN2510_SPI_FOSC16 CAN2510_SPI_FOSC64 CAN2510_SPI_FOSCTMR2 SPI_busMode 指定 PIC18CXXX SPI 总线模式: CAN2510_SPI_MODE00 CAN2510_SPI_MODE01 不允许任何中断 在报文接收或发送过程中出现错误 时产生中断 在 CAN 总线工作时产生中断 在 EFLG 错误条件改变时产生中断 在发送缓冲区 2 为空时产生中断 在发送缓冲区 1 为空时产生中断 在发送缓冲区 0 为空时产生中断 当接收缓冲区 1 收到报文时产生中断 当接收缓冲区 0 收到报文时产生中断

以 FOSC/4 频率通讯 以 FOSC/16 频率通讯 以 FOSC/64 频率通讯 以 TMR2/2 频率通讯

使用 SPI 00 模式进行通讯 使用 SPI 01 模式进行通讯

SPI_smpPhase 指定 PIC18CXXX SPI 采样点位置: CAN2510_SPI_SMPMID 在 SPI 位的中间采样 CAN2510_SPI_SMPEND 在 SPI 位的末端采样 说明: 该函数初始化 PIC18CXXX SPI 模块,复位 MCP2510 器件 (如果需 要) ,并配置 MCP2510 寄存器。 注: 该函数执行完后, MCP2510 处于配置模式。 表明 MCP2510 是否完成初始化。 如果初始化完成,返回 0 ; 如果没有完成,则返回 -1。 caninit.c

返回值:

文件名:

DS51297F_CN 第 90 页

? 2005 Microchip Technology Inc.

软件外设函数库
CAN2510InterruptEnable
功能: 头文件: 函数原型: 参数: 将 CAN2510 的中断允许位 (CANINTE 寄存器)修改为新值。 can2510.h, spi_can.h void CAN2510InterruptEnable( unsigned char interruptEnables ); interruptEnables interruptEnable 的值是下列值的位与 (‘&’) 。由粗体标出的选项是 默认值。通过 CANINTE 寄存器的所有位来控制。 CAN2510_NONE_EN CAN2510_MSGERR_EN 不允许任何中断 (00000000) 在报文接收或发送过程中出现错误时产生 中断 (10000000) 在 CAN 总线工作时产生中断 (01000000) EFLG 错误条件变化时产生中断 (00100000) 在发送缓冲区 2 为空时产生中断 (00010000) 在发送缓冲区 1 为空时产生中断 (00001000) 在发送缓冲区 0 为空时产生中断 (00000100) 当接收缓冲区 1 收到报文时产生中断 (00000010) 当接收缓冲区 0 收到报文时产生中断 (00000001) 所要求的 CAN 模式: 所有模式均可

CAN2510_WAKEUP_EN CAN2510_ERROR_EN CAN2510_TXB2_EN CAN2510_TXB1_EN CAN2510_TXB0_EN CAN2510_RXB1_EN CAN2510_RXB0_EN 说明: 文件名:

该函数用对所期望中断源进行位与操作所得的值来更新 CANINTE 寄存 器。 caninte.c

? 2005 Microchip Technology Inc.

DS51297F_CN 第 91 页

MPLAB? C18 C 编译器函数库
CAN2510InterruptStatus
功能: 要求的 CAN 模式: 头文件: 函数原型: 说明: 返回值: 指明 CAN2510 的中断源。 所有模式均可 can2510.h, spi_can.h unsigned char CAN2510InterruptStatus( void ); 该函数读取 CANSTAT 寄存器,并且根据 ICODE2:ICODE0 位的状态指 定编码。 函数返回下列值之一: CAN2510_NO_INTS CAN2510_WAKEUP_INT CAN2510_ERROR_INT CAN2510_TXB2_INT CAN2510_TXB1_INT CAN2510_TXB0_INT CAN2510_RXB1_INT CAN2510_RXB0_INT canints.c 没有中断产生 CAN 总线工作时产生中断 EFLG 错误条件改变时产生中断 发送缓冲区 2 为空时产生中断 发送缓冲区 1 为空时产生中断 发送缓冲区 0 为空时产生中断 接收缓冲区 1 接收到报文时产生中断 接收缓冲区 0 接收到报文时产生中断

文件名:

CAN2510LoadBufferStd
功能: 要求的 CAN 模式: 头文件: 函数原型: 把标准数据帧装入指定的发送缓冲区。 所有模式均可 can2510.h void CAN2510LoadBufferStd( unsigned char bufferNum, unsigned int msgId, unsigned char numBytes, unsigned char *data ); bufferNum 指定要装入报文的缓冲区,取下列值之一: CAN2510_TXB0 发送缓冲区 0 CAN2510_TXB1 发送缓冲区 1 CAN2510_TXB2 发送缓冲区 2 msgId CAN 报文标识符。对于标准报文,标识符可达 11 位。 numBytes 要发送的数据的字节数,取值为 0 到 8。如果值大于 8,则只存储前 8 个 字节。 data 要装入的数组。此数组长度必须大于等于 numBytes 中指定的值。

参数:

DS51297F_CN 第 92 页

? 2005 Microchip Technology Inc.

软件外设函数库
CAN2510LoadBufferStd (续)
说明: 该函数仅装入报文,而不发送报文。 可使用函数 CAN2510WriteBuffer() 将报文写到 CAN 总线。 该函数不设置缓冲区的优先级。可使用函数 CAN2510SetBufferPriority() 来设置缓冲区优先级。 canloads.c

文件名:

CAN2510LoadBufferXtd
功能: 头文件: 函数原型: 把扩展数据帧装入指定的发送缓冲区。 can2510.h void CAN2510LoadBufferXtd( unsigned char bufferNum, unsigned long msgId, unsigned char numBytes, unsigned char *data ); bufferNum 指定要装入报文的缓冲区,取值如下: CAN2510_TXB0 发送缓冲区 0 CAN2510_TXB1 发送缓冲区 1 CAN2510_TXB2 发送缓冲区 2 msgId CAN 报文标识符,对于扩展报文,可达 29 位。 numBytes 要发送的数据的字节数,取值为从 0 到 8。如果值大于 8,则只存储数据 的前 8 个字节。 data 要装入的数组。此数组长度必须大于等于 numBytes 中指定的值。 说明: 该函数仅装入报文,而不发送报文。 可使用函数 CAN2510WriteBuffer() 将报文写到 CAN 总线。 该函数不设置缓冲区的优先级。可使用函数 CAN2510SetBufferPriority() 来设置缓冲区的优先级。 canloadx.c 所要求的 CAN 模式: 所有模式均可

参数:

文件名:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 93 页

MPLAB? C18 C 编译器函数库
CAN2510LoadRTRStd
功能: 要求的 CAN 模式: 头文件: 函数原型: 把标准远程帧装入指定的发送缓冲区。 所有模式均可 can2510.h void CAN2510LoadBufferStd( unsigned char bufferNum, unsigned int msgId, unsigned char numBytes); bufferNum 指定要装入报文的缓冲区,取下列值之一: CAN2510_TXB0 发送缓冲区 0 CAN2510_TXB1 发送缓冲区 1 CAN2510_TXB2 发送缓冲区 2 msgId CAN 报文标识符,对于标准报文可达 11 位。 numBytes 要发送的数据的字节数,取值为从 0 到 8。如果此值大于 8,则只存储数 据的前 8 个字节。 说明: 该函数仅装入报文,而不发送报文。 可使用函数 CAN2510WriteBuffer() 将报文写到 CAN 总线。 该函数不设置缓冲区的优先级。可使用函数 CAN2510SetBufferPriority() 来设置缓冲区的优先级。 canlrtrs.c

参数:

文件名:

CAN2510LoadRTRXtd
功能: 要求的 CAN 模式: 头文件: 函数原型: 把扩展远程帧装入指定的发送缓冲区。 所有模式均可 can2510.h void CAN2510LoadBufferXtd( unsigned char bufferNum, unsigned long msgId, unsigned char numBytes); bufferNum 指定要装入报文的缓冲区,取下列值之一: CAN2510_TXB0 发送缓冲区 0 CAN2510_TXB1 发送缓冲区 1 CAN2510_TXB2 发送缓冲区 2 msgId CAN 报文标识符,对于扩展报文可达 29 位。 numBytes 要发送的数据的字节数,取值为从 0 到 8。如果此值大于 8,则只存储数 据的前 8 个字节。 说明: 该函数仅装入报文,而不发送报文。 可使用函数 CAN2510WriteBuffer() 将报文写到 CAN 总线。 该函数不设置缓冲区的优先级。可使用函数 CAN2510SetBufferPriority() 来设置缓冲区的优先级。 canlrtrx.c

参数:

文件名:

DS51297F_CN 第 94 页

? 2005 Microchip Technology Inc.

软件外设函数库
CAN2510ReadMode
功能: 要求的 CAN 模式: 头文件: 函数原型: 说明: 返回值: 读取 MCP2510 的当前工作模式。 所有模式均可 can2510.h unsigned char CAN2510ReadMode( void ); 该函数读取当前的工作模式。对于新模式,可能有等待请求。 mode mode 的值可以为下列值之一 (在文件 can2510.h 中定义) 。由 OPMODE2:OPMODE0 位 (CANSTAT 寄存器)指定。取值如下: CAN2510_MODE_CONFIG 可修改配置寄存器 CAN2510_MODE_NORMAL 正常 (发送和接收报文) CAN2510_MODE_SLEEP 等待中断 CAN2510_MODE_LISTEN 仅监听,不发送 CAN2510_MODE_LOOPBACK 用于测试,自发自收 canmoder.c

文件名:

CAN2510ReadStatus
功能: 头文件: 函数原型: 说明: 返回值: 读取 MCP2510 发送缓冲区和接收缓冲区的状态。 can2510.h unsigned char CAN2510ReadStatus( void ); 该函数读取发送缓冲区和接收缓冲区的当前状态。 status status (一个无符号字节)的值有下列格式: bit 7 TXB2IF bit 6 TXB2REQ bit 5 TXB1IF bit 4 TXB1REQ bit 3 TXB0IF bit 2 TXB0REQ bit 1 RXB1IF bit 0 RXB0IF canstats.c 所要求的 CAN 模式: 所有模式均可

文件名:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 95 页

MPLAB? C18 C 编译器函数库
CAN2510Reset
功能: 要求的 CAN 模式: 头文件: 复位 MCP2510。 所有模式均可 can2510.h spi_can.h spi.h void CAN2510Reset( void ); 该函数复位 MCP2510。 canreset.c

函数原型: 说明: 文件名:

CAN2510SendBuffer
功能: 要求的 CAN 模式: 头文件: 函数原型: 参数: 请求发送指定发送缓冲区中的报文。 正常模式 can2510.h void CAN2510WriteBuffer ( unsigned char bufferNum ); bufferNum 指定请求发送哪些 (个)缓冲区中的报文,取下列值之一: CAN2510_TXB0 发送缓冲区 0 CAN2510_TXB1 发送缓冲区 1 CAN2510_TXB2 发送缓冲区 2 CAN2510_TXB0_B1 发送缓冲区 0 和发送缓冲区 1 CAN2510_TXB0_B2 发送缓冲区 0 和发送缓冲区 2 CAN2510_TXB1_B2 发送缓冲区 1 和发送缓冲区 2 CAN2510_TXB0_B1_B2 发送缓冲区 0、发送缓冲区 1 和发送缓冲区 2 该函数请求发送先前装入、存储在指定缓冲区中的报文。要装入报文, 使用函数 CAN2510LoadBufferStd() 或 CAN2510LoadBufferXtd()。 cansend.c

说明:

文件名:

CAN2510SequentialRead
功能: 要求的 CAN 模式: 头文件: 函数原型: 从 MCP2510 中, 自指定地址开始连续读取指定的字节数。 这些值存储在 DataArray 中。 所有模式均可 can2510.h void CAN2510SequentialRead( unsigned char *DataArray unsigned char CAN2510addr unsigned char numbytes ); DataArray 存储连续读取数据的数据数组的首地址。 CAN2510addr MCP2510 中开始连续读取处的地址。 numbytes 连续读取的字节数。

参数:

DS51297F_CN 第 96 页

? 2005 Microchip Technology Inc.

软件外设函数库
CAN2510SequentialRead (续)
说明: 文件名: 该函数从 MCP2510 中,自指定的地址开始读取连续的字节。这些值存 储到自指定数组首地址开始的地址。 readseq.c

CAN2510SequentialWrite
功能: 要求的 CAN 模式: 头文件: 函数原型: 自指定地址开始,向 MCP2510 连续写入指定的字节数。这些值来自于 DataArray。 所有模式均可 can2510.h void CAN2510SequentialWrite( unsigned char *DataArray unsigned char CAN2510addr unsigned char numbytes ); DataArray 包含连续写数据的数组的首地址。 CAN2510addr MCP2510 中连续写数据开始处的地址。 numbytes 要连续写的字节数。 说明: 文件名: 该函数自指定的地址开始,将连续的字节写入 MCP2510。这些值来自于 自指定数组首地址开始的地址。 wrtseq.c

参数:

CAN2510SetBufferPriority
功能: 要求的 CAN 模式: 头文件: 函数原型: 为指定发送缓冲区装入指定的优先级。 所有模式均可 can2510.h void CAN2510SetBufferPriority( unsigned char bufferNum, unsigned char bufferPriority ); bufferNum 指定要配置优先级的缓冲区,取下列值之一: CAN2510_TXB0 发送缓冲区 0 CAN2510_TXB1 发送缓冲区 1 CAN2510_TXB2 发送缓冲区 2 bufferPriority 缓冲区的优先级,取下列值之一: CAN2510_PRI_HIGHEST 最高的报文优先级 CAN2510_PRI_HIGH 高报文优先级 CAN2510_PRI_LOW 低报文优先级 CAN2510_PRI_LOWEST 最低的报文优先级 说明: 文件名: 该函数为指定缓冲区装入指定的优先级。 cansetpr.c

参数:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 97 页

MPLAB? C18 C 编译器函数库
CAN2510SetMode
功能: 要求的 CAN 模式: 头文件: 函数原型: 参数: 配置 MCP2510 的工作模式。 所有模式均可 can2510.h void CAN2510SetMode( unsigned char mode ); mode mode 的值可以是下列值之一 (在 can2510.h 中定义) 。由 REQOP2:REQOP0 位 (CANCTRL 寄存器)控制。 CAN2510_MODE_CONFIG 可修改配置寄存器 CAN2510_MODE_NORMAL 正常 (发送和接收报文) CAN2510_MODE_SLEEP 等待中断 CAN2510_MODE_LISTEN 仅监听,不发送 CAN2510_MODE_LOOPBACK 用于测试,自发自收 该函数配置指定的模式。直到所有等待发送的报文都发送完,模式才会 改变。 canmodes.c

说明: 文件名:

CAN2510SetMsgFilterStd
功能: 要求的 CAN 模式: 头文件: 函数原型: 为标准报文配置某个接收缓冲区的所有过滤器和屏蔽器。 所有模式 can2510.h unsigned char CAN2510SetMsgFilterStd( unsigned char bufferNum, unsigned int mask, unsigned int *filters ); bufferNum 指定要配置过滤器和屏蔽器的接收缓冲区,取下列值之一: CAN2510_RXB0 配置 RXM0、 RXF0 和 RXF1 CAN2510_RXB1 配置 RXM1、 RXF2、 RXF3、 RXF4 和 RXF5 mask 屏蔽器设定值 filters 过滤器设定值。 对于缓冲区 0: 标准长度的报文:2 个无符号整数组成的数组 对于缓冲区 1: 标准长度的报文:4 个无符号整数组成的数组 说明: 返回值: 该函数将 MCP2510 配置为配置模式,然后将屏蔽器设定值和过滤器设 定值写到相应的寄存器。在返回前,将 MCP2510 配置为原来的模式。 表明能否正确修改 MCP2510 的模式。 如果工作模式的初始化和恢复完成,返回 0 ; 如果工作模式的初始化和恢复未完成,则返回 -1 。 canfms.c

参数:

文件名:

DS51297F_CN 第 98 页

? 2005 Microchip Technology Inc.

软件外设函数库
CAN2510SetMsgFilterXtd
功能: 要求的 CAN 模式: 头文件: 函数原型: 为扩展报文配置某个接收缓冲区的所有过滤器和屏蔽器。 所有模式 can2510.h unsigned char CAN2510SetMsgFilterXtd( unsigned char bufferNum, unsigned long mask, unsigned long *filters ); bufferNum 指定要配置过滤器和屏蔽器的接收缓冲区,取下列值之一: CAN2510_RXB0 配置 RXM0、 RXF0 和 RXF1 CAN2510_RXB1 配置 RXM1、 RXF2、 RXF3、 RXF4 和 RXF5 mask 屏蔽器设定值 filters 过滤器设定值: 对于缓冲区 0 : 扩展长度的报文:2 个无符号长整型组成的数组 对于缓冲区 1 : 扩展长度的报文:4 个无符号长整型组成的数组 说明: 返回值: 该函数将 MCP2510 设置为配置模式,然后将过滤器设定值和屏蔽器设 定值写到相应的寄存器。在返回前,将 MCP2510 配置为原来的模式。 表明能否正确修改 MCP2510 的模式。 如果工作模式的初始化和恢复完成,返回 0 ; 如果工作模式的初始化和恢复未完成,则返回 -1。 canfmx.c

参数:

文件名:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 99 页

MPLAB? C18 C 编译器函数库
CAN2510SetSingleFilterStd
功能: 要求的 CAN 模式: 头文件: 函数原型: 为标准 (Std)报文配置指定的接收过滤器。 配置模式 can2510.h void CAN2510SetSingleFilterStd( unsigned char filterNum, unsigned int filter ); filterNum 指定要配置的接收过滤器,取下列值之一: CAN2510_RXF0 配置 RXF0 (用于 RXB0) CAN2510_RXF1 配置 RXF1 (用于 RXB0) CAN2510_RXF2 配置 RXF2 (用于 RXB1) CAN2510_RXF3 配置 RXF3 (用于 RXB1) CAN2510_RXF4 配置 RXF4 (用于 RXB1) CAN2510_RXF5 配置 RXF5 (用于 RXB1) filter 过滤器设定值。 说明: 文件名: 该函数将过滤器设定值写入到相应的寄存器。在执行该函数前 MCP2510 必须处于配置模式。 canfilts.c

参数:

CAN2510SetSingleFilterXtd
功能: 要求的 CAN 模式: 头文件: 函数原型: 为扩展 (Xtd)报文配置指定的接收过滤器。 配置模式 can2510.h void CAN2510SetSingleFilterXtd( unsigned char filterNum, unsigned long filter ); filterNum 指定要配置的接收过滤器,取下列值之一: CAN2510_RXF0 配置 RXF0 (用于 RXB0) CAN2510_RXF1 配置 RXF1 (用于 RXB0) CAN2510_RXF2 配置 RXF2 (用于 RXB1) CAN2510_RXF3 配置 RXF3 (用于 RXB1) CAN2510_RXF4 配置 RXF4 (用于 RXB1) CAN2510_RXF5 配置 RXF5 (用于 RXB1) filter 过滤器设定值。 说明: 文件名: 该函数将过滤器设定值写入到相应的寄存器。 在执行该函数前 MCP2510 必须处于配置模式。 canfiltx.c

参数:

DS51297F_CN 第 100 页

? 2005 Microchip Technology Inc.

软件外设函数库
CAN2510SetSingleMaskStd
功能: 要求的 CAN 模式: 头文件: 函数原型: 为标准 (Std)格式报文配置指定接收缓冲区的屏蔽器。 配置模式 can2510.h unsigned char CAN2510SetSingleMaskStd( unsigned char maskNum, unsigned int mask ); maskNum 指定要配置的接收屏蔽器,取下列值之一: CAN2510_RXM0 配置 RXM0 CAN2510_RXM1 配置 RXM1 mask 屏蔽器设定值。 说明: 文件名: 该函数将屏蔽器设定值写到相应的寄存器。在执行该函数前 MCP2510 必须处于配置模式。 canmasks.c

参数:

(用于 RXB0) (用于 RXB1)

CAN2510SetSingleMaskXtd
功能: 要求的 CAN 模式: 头文件: 函数原型: 为扩展 (Xtd)报文配置指定接收缓冲区的屏蔽器。 配置模式 can2510.h unsigned char CAN2510SetSingleMaskXtd( unsigned char maskNum, unsigned long mask ); maskNum 指定要配置的接收屏蔽器,取下列值之一: CAN2510_RXM0 配置 RXM0 CAN2510_RXM1 配置 RXM1 mask 屏蔽器设定值。

参数:

(用于 RXB0) (用于 RXB1)

说明: 文件名:

该函数将屏蔽器设定值写到相应的寄存器。在执行该函数前 MCP2510 必须处于配置模式。 canmaskx.c

? 2005 Microchip Technology Inc.

DS51297F_CN 第 101 页

MPLAB? C18 C 编译器函数库
CAN2510WriteBuffer
功能: 要求的 CAN 模式: 头文件: 函数原型: 参数: 启动所选发送缓冲区的 CAN 报文发送。 所有模式 can2510.h unsigned char CAN2510WriteBuffer( unsigned char bufferNum ) bufferNum 指定要装入报文的缓冲区,取如下值之一: CAN2510_TXB0 发送缓冲区 0 CAN2510_TXB1 发送缓冲区 1 CAN2510_TXB2 发送缓冲区 2 该函数启动所选发送缓冲区的报文发送。 canwrbuf.c

说明: 文件名:

DS51297F_CN 第 102 页

? 2005 Microchip Technology Inc.

软件外设函数库
CAN2510WriteStd
功能: 要求的 CAN 模式: 头文件: 函数原型: 使用第一个可用的发送缓冲区,将标准格式报文写到 CAN 总线。 正常模式 can2510.h unsigned char CAN2510WriteStd( unsigned int msgId, unsigned char msgPriority, unsigned char numBytes, unsigned char *data ); msgId CAN 报文标识符,对于标准报文有 11 位,这个 11 位的标识符存储在 msgId (无符号整型)的低 11 位中。 msgPriority 缓冲区的优先级,取下列值之一: CAN2510_PRI_HIGHEST 最高的报文优先级 CAN2510_PRI_HIGH 高报文优先级 CAN2510_PRI_LOW 低报文优先级 CAN2510_PRI_LOWEST 最低的报文优先级 numBytes 要发送数据的字节数,取值为从 0 到 8。如果值大于 8,则仅发送数据的 前 8 个字节。 data 要写的数据值的数组。此数组长度必须大于等于 numBytes 中指定的 值。 说明: 返回值: 文件名: 该函数将查询每个发送缓冲区,以确定是否有等待发送的报文,并将指 定的报文传送到第一个可用的缓冲区。 此值表明使用了哪一个缓冲区发送报文 (0、1 或 2) 。 -1 表明没有发送报文。 canwrits.c

参数:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 103 页

MPLAB? C18 C 编译器函数库
CAN2510WriteXtd
功能: 要求的 CAN 模式: 头文件: 函数原型: 使用第一个可用的发送缓冲区,将扩展格式报文写到 CAN 总线。 正常模式 can2510.h unsigned char CAN2510WriteXtd( unsigned long msgId, unsigned char msgPriority, unsigned char numBytes, unsigned char *data ); msgId CAN 报文标识符,对于扩展报文有 29 位,这个 29 位的标识符存储在 msgId (无符号长整型)的低 29 位中。 msgPriority 缓冲区的优先级,取下列值之一: CAN2510_PRI_HIGHEST 最高的报文优先级 CAN2510_PRI_HIGH 高报文优先级 CAN2510_PRI_LOW 低报文优先级 CAN2510_PRI_LOWEST 最低的报文优先级 numBytes 要发送数据的字节数,取值为从 0 到 8。如果值大于 8,则仅发送数据 的前 8 个字节。 data 要写的数据值的数组。此数组长度必须大于等于 numBytes 中指定的 值。 说明: 返回值: 文件名: 该函数将查询每个发送缓冲区,以确定是否有等待发送的报文,并将指 定的报文传送到第一个可用的缓冲区。 此值表明使用了哪一个缓冲区发送报文 (0、1 或 2) 。 -1 表明没有发送报文。 canwritx.c

参数:

DS51297F_CN 第 104 页

? 2005 Microchip Technology Inc.

软件外设函数库
3.4 软件 I?C 函数
设计这些函数的目的是使用 PIC18 单片机的 I/O 引脚来实现 I2C 总线,具体函数见下 表: 表 3-6:
函数 Clock_test SWAckI2C SWGetcI2C SWGetsI2C SWNotAckI2C SWPutcI2C SWPutsI2C SWReadI2C SWRestartI2C SWStartI2C SWStopI2C SWWriteI2C 产生 I2C? 总线应答条件。 从 I2C 总线读取一个字节。 读取一个数据串。 产生 I2C 总线不应答条件。 将一个字节写到 I2C 总线。 将一个数据串写到 I2C 总线。 从 I2C 总线读取一个字节。 产生 I2C 总线重复启动条件。 产生 2C 总线启动条件。 产生 I2C 总线停止条件。 将一个字节写到 I2C 总线。

I2C? 软件函数
描述 为延长从时钟低电平时间产生延时。

这些函数的预编译形式使用默认的引脚分配。通过在文件 sw_i2c.h (在编译器安装目 录的 h 子目录下)中重新定义下列宏,可以改变引脚的分配: 表 3-7:
I2C 线 DATA 引脚

选择 I2C? 引脚分配的宏
宏 DATA_PIN DATA_LAT DATA_LOW 默认值 PORTBbits.RB4 LATBbits.RB4 TRISBbits.TRISB4 = 0; 用途 用于数据 (DATA)线的引脚。 与 DATA 引脚有关的锁存器。 将 DATA 引脚配置为输出的语 句。 将 DATA 引脚配置为输入的语 句。 用于时钟 (CLOCK)线的引脚。 与 CLOCK 引脚有关的锁存器。

DATA_HI CLOCK 引 脚 SCLK_PIN SCLK_LAT

TRISBbits.TRISB4 = 1; PORTBbits.RB3 LATBbits.LATB3

CLOCK_LOW

TRISBbits.TRISB3 = 0;

将 CLOCK 引脚配置为输出的语 句。 将 CLOCK 引脚配置为输入的语 句。

CLOCK_HI

TRISBbits.TRISB3 = 1;

完成这些定义后,用户必须重新编译 I2C 函数,然后在项目中使用更新过的文件。这 可通过把库源文件添加到项目中,或者使用提供的批处理文件重新编译库文件来完成。

? 2005 Microchip Technology Inc.

DS51297F_CN 第 105 页

MPLAB? C18 C 编译器函数库
3.4.1 函数描述

Clock_test
功能: 头文件: 函数原型: 说明: 为延长从时钟低电平时间产生延时。 sw_i2c.h char Clock_test( void ); 调用该函数可延长从时钟低电平时间。可能需要根据应用的要求调节延 时时间。如果在延时周期结束时,时钟线为低电平,则返回一个表明时 钟错误的值。 如果没有发生时钟错误,返回 0 ; 如果发生时钟错误,则返回 -2。 swckti2c.c

返回值: 文件名:

SWAckI2C SWNotAckI2C
功能: 头文件: 函数原型: 说明: 返回值: 文件名: 产生 I2C 总线应答 / 不应答条件。 sw_i2c.h char SWAckI2C( void ); char SWNotAckI2C( void ); 调用该函数将产生 I2C 总线应答序列。 如果从器件应答,返回 0 ; 如果从器件不应答,则返回 -1。 swacki2c.c

SWGetcI2C
参见 SWReadI2C。

SWGetsI2C
功能: 头文件: 函数原型: 从 I2C 总线读取一个数据串。 sw_i2c.h char SWGetsI2C( unsigned char *rdptr, unsigned char length ); rdptr 存储从 I2C 总线上读取的数据的地址。 length 要读取的字节数。 该函数读取一个预定义长度的数据串。 如果主器件在所有字节接收完前产生一个不应答 (NOT ACK)总线条 件,返回 -1 ; 否则,返回 0。 swgtsi2c.c char x[10]; SWGetsI2C( x,5 );

参数:

说明: 返回值:

文件名: 代码示例:

DS51297F_CN 第 106 页

? 2005 Microchip Technology Inc.

软件外设函数库
SWNotAckI2C
参见 SWAckI2C。

SWPutcI2C
参见 SWWriteI2C。

SWPutsI2C
功能: 头文件: 函数原型: 参数: 说明: 返回值: 文件名: 代码示例: 写一个数据串到 I2C 总线。 sw_i2c.h char SWPutsI2C( unsigned char *wrdptr ); wrdptr 指向要写到 I2C 总线的数据的指针。 该函数将写一个数据串到 I2C 总线,直到空字符为止 (但不包括空字 符) 。 如果写到 I2C 总线时有错误,返回 -1 ; 否则,返回 0。 swptsi2c.c char mybuff [] = “Hello”; SWPutsI2C(mybuff);

SWReadI2C SWGetcI2C
功能: 头文件: 函数原型: 说明: 返回值: 文件名: 从 I2C 总线上读取一个字节。 sw_i2c.h char SWReadI2C( void ); 该函数通过在预定义的 I2C 时钟线上产生适当的信号,来读取一个数据 字节。 该函数返回已读取的 I2C 数据字节。 如果该函数出现错误,则返回 -1。 swgtci2c.c

SWRestartI2C
功能: 头文件: 函数原型: 说明: 文件名: 产生 I2C 总线重复启动条件。 sw_i2c.h void SWRestartI2C( void ); 调用该函数,可产生 I2C 总线重复启动条件。 swrsti2c.c

? 2005 Microchip Technology Inc.

DS51297F_CN 第 107 页

MPLAB? C18 C 编译器函数库
SWStartI2C
功能: 头文件: 函数原型: 说明: 文件名: 产生 I2C 总线启动条件。 sw_i2c.h void SWStartI2C( void ); 调用该函数来产生 I2C 总线启动条件。 swstri2c.c

SWStopI2C
功能: 头文件: 函数原型: 说明: 文件名: 产生 I2C 总线停止条件。 sw_i2c.h void SWStopI2C( void ); 调用该函数来产生 I2C 总线停止条件。 swstpi2c.c

SWWriteI2C SWPutcI2C
功能: 头文件: 函数原型: 参数: 说明: 返回值: 文件名: 代码示例 写一个字节到 I2C 总线。 sw_i2c.h char SWWriteI2C( unsigned char data_out ); data_out 要写到 I2C 总线的一个数据字节。 该函数将一个数据字节写到预定义的数据引脚。 如果写入成功,返回 0 ; 如果出现错误,返回 -1。 swptci2c.c if(SWWriteI2C(0x80)) { errorHandler(); }

DS51297F_CN 第 108 页

? 2005 Microchip Technology Inc.

软件外设函数库
3.4.2 使用示例
下面是一个简单的代码示例,举例说明了与 Microchip 24LC01B I2C 电可擦除存储器件 进行 I2C 通讯的软件实现。
#include <p18cxxx.h> #include <sw_i2c.h> #include <delays.h> // FUNCTION Prototype void main(void); void byte_write(void); void page_write(void); void current_address(void); void random_read(void); void sequential_read(void); void ack_poll(void); unsigned char warr[] = {8,7,6,5,4,3,2,1,0}; unsigned char rarr[15]; unsigned char far *rdptr = rarr; unsigned char far *wrptr = warr; unsigned char var; #define W_CS PORTA.2

//************************************************** void main( void ) { byte_write(); ack_poll(); page_write(); ack_poll(); Nop(); sequential_read(); Nop(); while (1); // Loop indefinitely } void byte_write( void ) { SWStartI2C(); var = SWPutcI2C(0xA0); // control byte SWAckI2C(); var = SWPutcI2C(0x10); // word address SWAckI2C(); var = SWPutcI2C(0x66); // data SWAckI2C(); SWStopI2C(); } void page_write( void ) { SWStartI2C(); var = SWPutcI2C(0xA0); // control byte SWAckI2C(); var = SWPutcI2C(0x20); // word address SWAckI2C(); var = SWPutsI2C(wrptr); // data SWStopI2C(); }

? 2005 Microchip Technology Inc.

DS51297F_CN 第 109 页

MPLAB? C18 C 编译器函数库
void sequential_read( void ) { SWStartI2C(); var = SWPutcI2C( 0xA0 ); // control byte SWAckI2C(); var = SWPutcI2C( 0x00 ); // address to read from SWAckI2C(); SWRestartI2C(); var = SWPutcI2C( 0xA1 ); SWAckI2C(); var = SWGetsI2C( rdptr, 9 ); SWStopI2C(); } void current_address( void ) { SWStartI2C(); SWPutcI2C( 0xA1 ); // control byte SWAckI2C(); SWGetcI2C(); // word address SWNotAckI2C(); SWStopI2C(); } void ack_poll( void ) { SWStartI2C(); var = SWPutcI2C( 0xA0 ); // control byte while( SWAckI2C() ) { SWRestartI2C(); var = SWPutcI2C(0xA0); // data } SWStopI2C(); }

DS51297F_CN 第 110 页

? 2005 Microchip Technology Inc.

软件外设函数库
3.5 软件 SPI 函数
设计这些函数的目的是使用 PIC18 单片机的 I/O 引脚来实现 SPI 。具体函数见下表: 表 3-8:
函数 ClearCSSWSPI OpenSWSPI putcSWSPI SetCSSWSPI WriteSWSPI 将片选 (CS)引脚清零。 配置用于 SPI 的 I/O 引脚。 向软件 SPI 写一字节数据。 置位片选 (CS)引脚。 向软件 SPI 总线写一字节数据。

软件 SPI 函数
描述

这些函数的预编译形式使用默认的引脚分配。通过在文件 sw_spi.h (在编译器安装 目录的 h 子目录下)中重新定义下列宏,可以改变引脚分配: 表 3-9:
LCD 控制器 线 CS 引脚

选择 SPI 引脚分配的宏
宏 SW_CS_PIN TRIS_SW_CS_PIN 默认值 PORTBbits.RB2 TRISBbits.TRISB2 PORTBbits.RB3 TRISBbits.TRISB3 PORTBbits.RB7 TRISBbits.TRISB7 PORTBbits.RB6 TRISBbits.TRISB6 用途 用于片选 (CS)线的引脚。 控制与 CS 线相连引脚的方向的 位。 用于 DIN 线的引脚。 控制与 DIN 线相连引脚的方向 的位。 用于 DOUT 线的引脚。 控制与 DOUT 线相连引脚的方 向的位。 用于 SCK 线的引脚。 控制与 SCK 线相连引脚的方向 的位。

DIN 引脚

SW_DIN_PIN TRIS_SW_DIN_PIN

DOUT 引脚

SW_DOUT_PIN TRIS_SW_DOUT_PIN

SCK 引脚

SW_SCK_PIN TRIS_SW_SCK_PIN

? 2005 Microchip Technology Inc.

DS51297F_CN 第 111 页

MPLAB? C18 C 编译器函数库
所提供的函数库能工作在四种模式之一。下表列出了用于在这些模式之间进行选择的 宏。在重建软件 SPI 函数库时,必须要定义其中一种宏。 表 3-10:
宏 MODE0 MODE1 MODE2 MODE3 已定义 未定义 未定义 未定义

用于选择模式的宏
默认值 CKP = 0 CKE = 0 CKP = 1 CKE = 0 CKP = 0 CKE = 1 CKP = 1 CKE = 1 含义

完成这些定义后,用户必须重新编译软件 SPI 函数,然后在项目中包含更新过的文 件。这可通过将软件 SPI 源文件添加到项目中,或者使用所提供的批处理文件重新编 译库文件来完成。

3.5.1

函数描述

ClearCSSWSPI
功能: 头文件: 函数原型: 说明: 文件名: 将头文件 sw_spi.h 中指定的片选 (CS)引脚清零。 sw_spi.h void ClearCSSWSPI( void ); 该函数将头文件 sw_spi.h 中指定用于软件 SPI 片选 (CS)引脚的 I/O 引脚清零。 clrcsspi.c

OpenSWSPI
功能: 头文件: 函数原型: 说明: 文件名: 配置用于软件 SPI 的 I/O 引脚。 sw_spi.h void OpenSWSPI( void ); 该函数将用于软件 SPI 的 I/O 引脚配置为正确的输入或输出状态和逻辑 电平。 opensspi.c

putcSWSPI
参见 WriteSWSPI。

DS51297F_CN 第 112 页

? 2005 Microchip Technology Inc.

软件外设函数库
SetCSSWSPI
功能: 头文件: 函数原型: 说明: 文件名: 将头文件 sw_spi.h 中指定的片选 (CS)引脚置位。 sw_spi.h void SetCSSWSPI( void ); 该函数将头文件 sw_spi.h 中指定用于软件 SPI 片选 (CS)引脚的 I/O 引脚置位。 setcsspi.c

WriteSWSPI putcSWSPI
功能: 头文件: 函数原型: 参数: 说明: 返回值: 文件名: 代码示例 ; 向软件 SPI 写一个字节。 sw_spi.h char WriteSWSPI( char data ); data 要写到软件 SPI 的数据。 该函数将指定的数据字节写到软件 SPI,并且返回读取的数据字节。该 函数不提供对片选引脚 (CS)的控制。 该函数返回从软件 SPI 的 (DIN)引脚的数据中读取的数据字节。 wrtsspi.c char addr = 0x10; char result; result = WriteSWSPI( addr );

3.5.2

使用示例

#include <p18C452.h> #include <sw_spi.h> #include <delays.h> void main( void ) { char address; // configure software SPI OpenSWSPI(); for( address=0; address<0x10; address++ ) { ClearCSSWSPI(); //clear CS pin WriteSWSPI( 0x02 ); //send write cmd WriteSWSPI( address ); //send address hi WriteSWSPI( address ); //send address low SetCSSWSPI(); //set CS pin Delay10KTCYx( 50 ); //wait 5000,000TCY } }

? 2005 Microchip Technology Inc.

DS51297F_CN 第 113 页

MPLAB? C18 C 编译器函数库
3.6 软件 UART 函数
设计这些函数的目的是使用 PIC18 单片机的 I/O 引脚来实现 UART 。具体函数见下 表: 表 3-11:
函数 getcUART getsUART OpenUART putcUART putsUART ReadUART WriteUART

软件 UART 函数
描述 从软件 UART 中读取一个字节。 从软件 UART 中读取一个字符串。 配置用于 UART 的 I/O 引脚。 写一个字节到软件 UART。 写一个字符串到软件 UART。 从软件 UART 中读取一个字节。 写一个字节到软件 UART。

这些函数的预编译形式使用默认的引脚分配。通过重新定义文件 writuart.asm、 readuart.asm 和 openuart.asm 中的 equate (equ)语句,可以改变引脚分配。这些 文件包含在编译器安装目录的 src/traditional/pmc/sw_uart 或 scr/extended/pmc/sw_uart 子目录中。 表 3-12:
LCD 控制器 线 TX 引脚

用于选择 UART 引脚分配的宏
定义 SWTXD SWTXDpin TRIS_SWTXD 默认值 PORTB 4 TRISB PORTB 5 TRISB 用途 用于发送线的端口。 SWTXD 端口中用于 TX 线的位。 与用于 TX 线的端口相关的数据方向寄存 器。 用于接收线的端口。 SWTXD 端口中用于 RX 线的位。 与用于 RX 线的端口相关的数据方向寄存 器。

RX 引脚

SWRXD SWRXDpin TRIS_SWRXD

更改这些定义后,用户必须重新编译软件 UART 函数,然后在项目中包含更新过的文 件。这可通过把软件 UART 源文件添加到项目中,或使用 MPLAB C18 编译器安装目 录中提供的批处理文件重新编译库文件来完成。 UART 函数库还要求用户定义下列函数,以提供适当的延时: 表 3-13: 软件 UART 延时函数
函数 DelayTXBitUART DelayRXHalfBitUART DelayRXBitUART 功能 延时: ((((2*FOSC) / (4*baud)) + 1) / 2) - 12 周期 延时: ((((2*FOSC) / (8*baud)) + 1) / 2) - 9 周期 延时: ((((2*FOSC) / (4*baud)) + 1) / 2) - 14 周期

DS51297F_CN 第 114 页

? 2005 Microchip Technology Inc.

软件外设函数库
3.6.1 函数描述

getcUART
参见 ReadUART。

getsUART
功能: 头文件: 函数原型: 参数: 从软件 UART 中读取一个字符串。 sw_uart.h void getsUART( char * buffer, unsigned char len); buffer 指向从软件 UART 中读取字符串的指针。 len 要从软件 UART 中读取的字符数。 该函数从软件 UART 中读取 len 个字符,并放入 buffer。 getsuart.c char x[10]; getsUART( x, 5 );

说明: 文件名: 代码示例:

OpenUART
功能: 头文件: 函数原型: 说明: 文件名: 代码示例: 配置用于软件 UART 的 I/O 引脚。 sw_uart.h void OpenUART( void ); 该函数将用于软件 UART 的 I/O 引脚配置为正确的输入或输出状态和逻 辑电平。 openuart.asm OpenUART();

putcUART
参见 WriteUART。

putsUART
功能: 头文件: 函数原型: 参数: 说明: 文件名: 代码示例: 写一个字符串到软件 UART。 sw_uart.h void putsUART( char * buffer ); buffer 要写到软件 UART 的字符串。 该函数将一个字符串写到软件 UART。包括空字符在内的全部字符串将 被写到 UART。 putsuart.c char mybuff [] = “Hello”; putsUART( mybuff );

? 2005 Microchip Technology Inc.

DS51297F_CN 第 115 页

MPLAB? C18 C 编译器函数库
ReadUART getcUART
功能: 头文件: 函数原型: 说明: 返回值: 文件名: 代码示例: 从软件 UART 读取一个字节。 sw_uart.h char ReadUART( void ); 该函数从软件 UART 读取一个数据字节。 返回从软件 UART 的接收数据 (RXD)引脚读取的数据字节。 readuart.asm char x; x = ReadUART();

WriteUART putcUART
功能: 头文件: 函数原型: 参数 ×??¨: 说明: 文件名: 代码示例: 写一个字节到软件 UART。 sw_uart.h void WriteUART( char data ); data 要写到软件 UART 的数据字节。 该函数将指定的数据字节写到软件 UART。 writuart.asm char x = ‘H’; WriteUART( x );

3.6.2

使用示例

#include <p18C452.h> #include <sw_uart.h> void main( void ) { char data // configure software UART OpenUART(); while( 1 ) { data = ReadUART(); WriteUART( data ); } }

//read a byte //bounce it back

DS51297F_CN 第 116 页

? 2005 Microchip Technology Inc.

MPLAB? C18 C 编译器 函数库 第 4 章 通用软件函数库
4.1 简介
本章讲述预编译标准 C 库文件中的通用软件库函数。所有这些函数的源代码都包含在 MPLAB C18 编译器安装目录的如下子目录中: ? src\traditional\stdlib ? src\extended\stdlib ? src\traditional\delays ? src\extended\delays MPLAB C18 函数库支持如下函数类别: ? ? ? ? ? ? 字符分类函数 数据转换函数 存储器和字符串操作函数 延时函数 复位函数 字符输出函数

4.2

字符分类函数
这些函数与 ANSI 1989 标准 C 库函数中的同名函数是一致的,见下表: 表 4-1:
函数 isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit 确定字符是否为字母数字字符。 确定字符是否为字母。 确定字符是否为控制字符。 确定字符是否为十进制数字。 确定字符是否为图形字符。 确定字符是否为小写字母。 确定字符是否为可打印字符。 确定字符是否为标点字符。 确定字符是否为空白字符。 确定字符是否为大写字母。 确定字符是否为十六进制数字。

字符分类函数
描述

? 2005 Microchip Technology Inc.

DS51297F_CN 第 117 页

MPLAB? C18 C 编译器函数库
4.2.1 函数描述

isalnum
功能: 头文件: 函数原型: 参数: 说明: 返回值: 文件名: 确定字符是否为字母数字字符。 ctype.h unsigned char isalnum( unsigned char ch ); ch 要检查的字符。 如果字符在 “A”到 “Z” “a” 到 “z”或者 “0”到 “9”的范围 , 内,就认为它是字母数字字符。 如果是字母数字字符,返回非 0 ; 否则,返回 0。 isalnum.c

isalpha
功能: 头文件: 函数原型: 参数: 说明: 返回值: 文件名: 确定字符是否为字母。 ctype.h unsigned char isalpha( unsigned char ch ); ch 要检查的字符。 如果字符在 “A”到 “Z”或者 “a”到 “z”的范围内,就认为它是字 母。 如果字符是字母,返回非 0 ; 否则,返回 0。 isalpha.c

iscntrl
功能: 头文件: 函数原型: 参数: 说明: 返回值: 文件名: 确定字符是否为控制字符。 ctype.h unsigned char iscntrl( unsigned char ch ); ch 要检查的字符。 如果字符不是由 isprint() 定义的可打印字符,则认为它是控制字 符。 如果字符为控制符,返回非 0 ; 否则,返回 0。 iscntrl.c

DS51297F_CN 第 118 页

? 2005 Microchip Technology Inc.

通用软件函数库
isdigit
功能: 头文件: 函数原型: 参数: 说明: 返回值: 文件名: 确定字符是否为十进制数字。 ctype.h unsigned char isdigit( unsigned char ch ); ch 要检查的字符。 如果字符在 “0”到 “9”范围内,就认为它是十进制数字。 如果字符是十进制数字,返回非 0 ; 否则,返回 0。 isdigit.c

isgraph
功能: 头文件: 函数原型: 参数: 说明: 返回值: 文件名: 确定字符是否为图形字符。 ctype.h unsigned char isgraph( unsigned char ch ); ch 要检查的字符。 如果字符是除空格外的任何可打印字符,就认为它是图形字符。 如果字符是图形字符,返回非 0 ; 否则,返回 0。 isgraph.c

islower
功能: 头文件: 函数原型: 参数: 说明: 返回值: 文件名: 确定字符是否为小写字母。 ctype.h unsigned char islower( unsigned char ch ); ch 要检查的字符。 如果字符在 “a”到 “z”范围内,就认为它是小写字母。 如果字符是小写字母,返回非 0 ; 否则,返回 0。 islower.c

? 2005 Microchip Technology Inc.

DS51297F_CN 第 119 页

MPLAB? C18 C 编译器函数库
isprint
功能: 头文件: 函数原型: 参数: 说明: 返回值: 文件名: 确定字符是否为可打印字符。 ctype.h unsigned char isprint( unsigned char ch ); ch 要检查的字符。 如果字符是在 0x20 至 0x7e (包括 0x20 和 0x7e)范围内,就认为它 是可打印字符。 如果字符是可打印字符,返回非 0 ; 否则,返回 0。 isprint.c

ispunct
功能: 头文件: 函数原型: 参数: 说明: 返回值: 文件名: 确定字符是否为标点字符。 ctype.h unsigned char ispunct( unsigned char ch ); ch 要检查的字符。 如果字符是可打印字符,且既不是空格,也不是字母数字字符,则认为 它是标点字符。 如果字符是标点字符,返回非 0 ; 否则,返回 0。 ispunct.c

isspace
功能: 头文件: 函数原型: 参数: 说明: 确定字符是否为空白字符。 ctype.h unsigned char isspace (unsigned char ch); ch 要检查的字符。 如果字符属于下列一种:空格 ( ” 、制表符 ( “ ) “\t” 、回车符 ) ( “\r” 、换行符 ( ) “\n” 、换页符 ( ) “\f” 或者垂直制表符 ) ( “\v” ,则认为它是空白字符。 ) 如果字符是空白字符,返回非 0 ; 否则,返回 0。 isspace.c

返回值: 文件名:

DS51297F_CN 第 120 页

? 2005 Microchip Technology Inc.

通用软件函数库
isupper
功能: 头文件: 函数原型: 参数: 说明: 返回值: 文件名: 确定字符是否为大写字母。 ctype.h unsigned char isupper (unsigned char ch); ch 要检查的字符。 如果字符在 “A”到 “Z”范围内,就认为它是大写字母字符。 如果字符是大写字母字符,返回非 0 ; 否则,返回 0。 isupper.c

isxdigit
功能: 头文件: 函数原型: 参数: 说明: 返回值: 文件名: 确定字符是否为十六进制数字。 ctype.h unsigned char isxdigit( unsigned char ch ); ch 要检查的字符。 如果字符在 “0”到 “9” “a”到 “f”或” “A”到 “F”范围 , 内,就认为它是十六进制数字字符。 如果字符是十六进制数字字符,返回非 0 ; 否则,返回 0。 isxdig.c

? 2005 Microchip Technology Inc.

DS51297F_CN 第 121 页

MPLAB? C18 C 编译器函数库
4.3 数据转换函数
除非在函数描述中另有注明,这些函数和 ANSI 1989 标准 C 库函数中的同名函数是一 致的。具体函数见下表: 表 4-2:
函数 atob atof atoi atol btoa itoa ltoa rand srand tolower toupper ultoa

数据转换函数
描述 将一个字符串转换为 8 位有符号数。 将一个字符串转换为浮点数。 将一个字符串转换为 16 位有符号整型。 将一个字符串转换为长整型。 将一个 8 位有符号数转换为字符串。 将一个 16 位有符号整型转换为字符串。 将有符号长整型转换为字符串。 生成一个伪随机整数。 设置伪随机数发生器的起始种子值。 将字符转换为小写字母的 ASCII 字符。 将字符转换为大写字母的 ASCII 字符。 将无符号长整型转换为字符串。

4.3.1

函数描述

atob
功能: 头文件: 函数原型: 参数: 说明: 将一个字符串转换为一个 8 位有符号数。 stdlib.h signed char atob( const char * s ); s 指向要转换的 ASCII 字符串的指针。 该函数将 ASCII 字符串 s 转换为 8 位有符号数 (-128 到 127) 。输入 的字符串必须以 10 为基数 (十进制) ,且可以字符指示符号 ( “+”或 “-” )开始。溢出结果未定义。该函数是 MPLAB C18 对 ANSI 标准函 数库的扩展。 -128 到 127 范围内所有字符串的 8 位有符号数。 atob.asm

返回值: 文件名:

atof
功能: 头文件: 函数原型: 参数: 说明: 将一个字符串转换为浮点数。 stdlib.h double atof ( const char * s ); s 指向要转换的 ASCII 字符串的指针。 该函数将 ASCII 字符串 s 转换为浮点数。以下是可识别的浮点字符串示 例: -3.1415 1.0E2 1.0E+2 1.0E-2 函数返回转换的结果。 atof.c

返回值: 文件名:

DS51297F_CN 第 122 页

? 2005 Microchip Technology Inc.

通用软件函数库
atoi
功能: 头文件: 函数原型: 参数: 说明: 将一个字符串转换为 16 位有符号整数。 stdlib.h int atoi( const char * s ); s 指向要转换的 ASCII 字符串的指针。 该函数将 ASCII 字符串 s 转换为 16 位有符号整型 (-32768 到 32767) 。输入的字符串必须以 10 为基数 (十进制) ,且可以指示符号 ( “+”或 “-” )开始。溢出结果未定义。该函数是 MPLAB C18 对 ANSI 标准函数库的扩展。 在 -32768 到 32767 范围内所有字符串的 16 位有符号整型 atoi.asm

返回值: 文件名:

atol
功能: 头文件: 函数原型: 参数: 说明: 将一个字符串转换为长整型表示。 stdlib.h long atol( const char * s ); s 指向要转换的 ASCII 字符串的指针。 该函数将 ASCII 字符串 s 转换为长整型。输入的字符串必须以 10 为基 数 (十进制) ,且可以指示符号 ( “+”或 “-” )开始。溢出结果未定 义。该函数是 MPLAB C18 对 ANSI 标准函数库的扩展。 返回转换的结果。 atol.asm

返回值: 文件名:

btoa
功能: 头文件: 函数原型: 参数: 将一个 8 位有符号数转换为字符串。 stdlib.h char * btoa( signed char value, char * string ); value 8 位有符号数。 string 指向保存结果的 ASCII 字符串的指针。 string 必须足够长才能保存 ASCII 表示,包括负值的符号字符和结尾的空字符。 该函数将参数 value 中的 8 位有符号数转换为 ASCII 字符串。 该函数是 MPLAB C18 对 ANSI 所需函数库的扩展。 指向结果 string 的指针。 btoa.asm

说明: 返回值: 文件名:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 123 页

MPLAB? C18 C 编译器函数库
itoa
功能: 头文件: 函数原型: 参数: 将 16 位有符号整型转换为字符串。 stdlib.h char * itoa( int value, char * string ); value 16 位有符号整型。 string 指向保存结果的 ASCII 字符串的指针。 string 必须足够长才能保存 ASCII 表示,包括负值的符号字符和结尾的空字符。 该函数将参数 value 中的 16 位有符号整型转换为 ASCII 字符串表示。 该函数是 MPLAB C18 对 ANSI 所需函数库的扩展。 指向结果 string 的指针。 itoa.asm

说明: 返回值: 文件名:

ltoa
功能: 头文件: 函数原型: 参数: 将有符号长整型转换为字符串。 stdlib.h char * ltoa( long value, char * string ); value 要转换的有符号长整型。 string 指向保存结果的 ASCII 字符串的指针。 该函数将参数 value 中的有符号长整型转换为 ASCII 字符串。 string 必须足够长才能保存 ASCII 表示, 包括负值的符号字符和结尾的 空字符。该函数是 MPLAB C18 对 ANSI 所需函数库的扩展。 指向结果 string 指针。 ltoa.asm

说明:

返回值: 文件名:

rand
功能: 头文件: 函数原型: 说明: 生成一个伪随机整数。 stdlib.h int rand( void ); 调用该函数会返回 [0,32767] 范围内的一个伪随机整数。为了有效使用 该函数,必须使用 srand() 函数来设置随机数发生器的种子值。当使 用相同的种子值时,该函数总会返回相同的整数序列。 一个伪随机整数。 rand.asm

返回值: 文件名:

DS51297F_CN 第 124 页

? 2005 Microchip Technology Inc.

通用软件函数库
srand
功能: 头文件: 函数原型: 参数: 说明: 为伪随机数字序列设置起始种子值。 stdlib.h void srand( unsigned int seed ); seed 伪随机数字序列的起始值。 该函数为 rand() 函数生成的伪随机数字序列设置起始种子值。当使用 相同的种子值时, rand() 函数总会返回相同的整数序列。如果在调用 rand() 以前,未调用 srand(),则生成的数字序列与种子值为 1 调用 srand() 函数时相同。 rand.asm

文件名:

tolower
功能: 头文件: 函数原型: 参数: 说明: 返回值: 文件名: 将字符转换为小写字母 ASCII 字符。 ctype.h char tolower( char ch ); ch 要转换的字符。 假如参数是有效大写字母字符,则该函数会将 ch 转换为小写字母 ASCII 字符。 如果参数是大写字母字符,则返回小写字符;否则返回原字符。 tolower.c

toupper
功能: 头文件: 函数原型: 参数: 说明: 返回值: 文件名: 将字符转换为大写字母 ASCII 字符。 ctype.h char toupper( char ch ); ch 要转换的字符。 假如参数是有效的小写字母字符,则该函数会将 ch 转换为大写字母 ASCII 字符。 如果参数是大写字母字符,则返回小写字符;否则返回原字符。 toupper.c

? 2005 Microchip Technology Inc.

DS51297F_CN 第 125 页

MPLAB? C18 C 编译器函数库
ultoa
功能: 头文件: 函数原型: 参数: 将无符号长整型转换为字符串。 stdlib.h char * ultoa( unsigned long value, char * string); value 要转换的无符号长整型。 string 指向保存结果的 ASCII 字符串的指针。 该函数将参数 value 中的无符号长整型转换为 ASCII 字符串表示。 string 必须足够长才能保存 ASCII 表示, 包括负值的符号字符和结尾的 空字符。该函数是 MPLAB C18 对 ANSI 所需函数库的扩展。 指向结果 string 的指针。 ultoa.asm

说明:

返回值: 文件名:

4.4

存储器和字符串操作函数
除非在函数描述中另有注明,这些函数和 ANSI (1989)标准 C 库函数中的同名函数 是一致的。具体函数见下表: 表 4-3:
函数 memchr memchrpgm memcmp memcmppgm memcmppgm2ram memcmpram2pgm memcpy memcpypgm memcpypgm2ram memcpyram2pgm memmove memmovepgm memmovepgm2ram memmoveram2pgm memset memsetpgm strcat strcatpgm strcatpgm2ram strcatram2pgm strchr strchrpgm strcmp strcmppgm strcmppgm2ram strcmpram2pgm strcpy strcpypgm strcpypgm2ram strcpyram2pgm 在指定的存储区中查找某个值。 比较两个数组的内容。

存储器和字符串操作函数
描述

复制缓冲区。

复制缓冲区,源缓冲区和目标缓冲区可以重叠。

用某个重复的值初始化数组。 将源字符串的拷贝添加到目标字符串的末尾。

查找某个值在字符串中首次出现的位置。 比较两个字符串。

将一个字符串从数据存储器或程序存储器复制到数据存储器。

DS51297F_CN 第 126 页

? 2005 Microchip Technology Inc.

通用软件函数库
表 4-3: 存储器和字符串操作函数 (续)
计算从字符串开头不包含在另一组字符中的连续字符数。 strcspn strcspnpgm strcspnpgmram strcspnrampgm strlen strlenpgm strlwr strlwrpgm strncat strncatpgm strncatpgm2ram strncatram2pgm strncmp strncmppgm strncmppgm2ram strncmpram2pgm strncpy strncpypgm strncpypgm2ram strncpyram2pgm strpbrk strpbrkpgm strpbrkpgmram strpbrkrampgm strrchr strrchrpgm strspn strspnpgm strspnpgmram strspnrampgm strstr strstrpgm strstrpgmram strstrrampgm strtok strtokpgm strtokpgmram strtokrampgm strupr struprpgm

确定字符串的长度。 将字符串中所有大写字符转换为小写。 将源字符串中指定数目的字符添加到目标字符串的末尾。

比较两个字符串,直到指定的字符数。

将源字符串中的字符复制到目标字符串,直到指定的字符数。

查找一组字符中的某个字符在另一个字符串中首次出现的位置。

在字符串中查找指定字符最后一次出现的位置。 计算从字符串开头包含在另一组字符中的连续字符数。

查找某字符串在另一字符串中首次出现的位置。

将空字符插入到指定的分隔符处,把某个字符串分隔为子字符串或标 记 (token) 。

将某个字符串中的所有小写字符转换为大写。

? 2005 Microchip Technology Inc.

DS51297F_CN 第 127 页

MPLAB? C18 C 编译器函数库
4.4.1 函数描述

memchr memchrpgm
函数: 头文件: 函数原型: 在指定存储区中查找某个单字节值首次出现的位置。 string.h void * memchr( const void *mem, unsigned char c, size_t n ); rom char * memchrpgm( const rom char *mem, const unsigned char c, sizerom_t n ); mem 指向存储区的指针。 c 要查找的单字节值。 n 查找的最大字节数。 该函数在存储区 mem 中查找 n 个字节,查找 c 首次出现的位置。 该函数和 ANSI 中指定函数的不同之处在于, c 定义为 unsigned char 参数,而不是 int 参数。 如果 c 在 mem 的前 n 个字节中出现,则函数返回指向 mem 内该字符的 指针;否则,返回一个空指针。 memchr.asm mchrpgm.asm

参数:

说明:

返回值: 文件名:

memcmp memcmppgm memcmppgm2ram memcmpram2pgm
功能: 头文件: 函数原型: 比较两个数组的内容。 string.h signed char memcmp( const void * buf1, const void * buf2, size_t memsize ); signed char memcmppgm( const rom void * buf1, const rom void * buf2, sizerom_t memsize ); signed char memcmppgm2ram( const void * buf1, const rom void * buf2, sizeram_t memsize ); signed char memcmpram2pgm( const rom void * buf1, const void * buf2, sizeram_t memsize );

DS51297F_CN 第 128 页

? 2005 Microchip Technology Inc.

通用软件函数库
memcmp memcmppgm memcmppgm2ram memcmpram2pgm (续)
参数: buf1 指向第一个数组的指针。 buf2 指向第二个数组的指针。 memsize 数组中要比较的元素个数。 该函数将 buf1 中前 memsize 个字节与 buf2 中前 memsize 个字节进 行比较,然后返回一个值,表明其中一个缓冲区是小于、等于还是大于 另一个缓冲区。 返回值为: <0 buf1 小于 buf2 ==0 buf1 等于 buf2 >0 buf1 大于 buf2 memcmp.asm memcmpp2p.asm memcmpp2r.asm memcmpr2p.asm

说明:

返回值:

文件名:

memcpy memcpypgm memcpypgm2ram memcpyram2pgm
功能: 头文件: 函数原型: 将源缓冲区的内容复制到目标缓冲区。 string.h void * memcpy( void * dest, const void * src, size_t memsize ); rom void * memcpypgm( rom void * dest, const rom void * src, sizerom_t memsize ); void * memcpypgm2ram( void * dest, const rom void * src, sizeram_t memsize ); rom void * memcpyram2pgm( rom void * dest, const void * src, sizeram_t memsize ); dest 指向目标数组的指针。 src 指向源数组的指针。 memsize 从 src 数组复制到 dest 数组的字节数。 该函数将 src 中前 memsize 个字节复制到数组 dest。如果 src 与 dest 地址有重叠,则无法执行此操作 (未定义) 。

参数:

说明:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 129 页

MPLAB? C18 C 编译器函数库
memcpy memcpypgm memcpypgm2ram memcpyram2pgm (续)
返回值: 文件名: 返回 dest 的值。 memcpy.asm memcpyp2p.asm memcpyp2r.asm memcpyr2p.asm

memmove memmovepgm memmovepgm2ram memmoveram2pgm
功能: 头文件: 函数原型: 将源缓冲区中内容复制到目标缓冲区,即使两者的地址重叠。 string.h void * memmove( void * dest, const void * src, size_t memsize ); rom void * memmovepgm( rom void * dest, const rom void * src, sizerom_t memsize ); void * memmovepgm2ram( void * dest, const rom void * src, sizeram_t memsize ); rom void * memmoveram2pgm( rom void * dest, const void * src, sizeram_t memsize ); dest 指向目标数组的指针。 src 指向源数组的指针。 memsize 从 src 复制到 dest 的字节数。 该函数将 src 中前 memsize 字节复制到 dest 数组。即使 src 与 dest 地址重叠,该函数也能正确执行。 返回 dest 的值。 memmove.asm memmovp2p.asm memmovp2r.asm memmovr2p.asm

参数:

说明: 返回值: 文件名:

DS51297F_CN 第 130 页

? 2005 Microchip Technology Inc.

通用软件函数库
memset memsetpgm
功能: 头文件: 函数原型: 将指定字符复制到目标数组。 string.h void * memset( void * dest, unsigned char value, size_t memsize ); rom void * memsetpgm( rom void * dest, unsigned char value, sizerom_t memsize ); dest 指向目标数组的指针。 value 要复制的字符值。 memsize dest 中将 value 复制到的字节数。 该函数将字符 value 复制到数组 dest 的前 memsize 个字节。该函数 与 ANSI 中指定函数的不同之处在于, value 定义为 unsigned char 型,而不是 int 参数。 返回 dest 的值。 memset.asm memsetpgm.asm

参数:

说明:

返回值: 文件名:

strcat strcatpgm strcatpgm2ram strcatram2pgm
功能: 头文件: 函数原型: 将源字符串的一个拷贝添加到目标字符串的末尾。 string.h char * strcat( char * dest, const char * src rom char * strcatpgm( rom char * dest, const rom char * char * strcatpgm2ram( char * dest, const rom char * rom char * strcatram2pgm( rom char * dest, const char * src dest 指向目标数组的指针。 src 指向源数组的指针。 该函数将 src 中的字符串复制到 dest 中字符串的末尾,且从 dest 中 的空字符处开始添加 src 字符串。添加后,在 dest 的末尾处,将加上 一个空字符。如果 src 与 dest 地址有重叠,则无法执行此操作 (未 定义) 。 返回 dest 的值。 );

src );

src );

);

参数:

说明:

返回值:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 131 页

MPLAB? C18 C 编译器函数库
strcat strcatpgm strcatpgm2ram strcatram2pgm (续)
文件名: strcat.asm scatp2p.asm scatp2r.asm scatp2p.asm

strchr strchrpgm
功能: 头文件: 函数原型: 查找指定字符在字符串中首次出现的位置。 string.h char * strchr( const char * str, unsigned char c ); rom char * strchrpgm( const rom char * str, unsigned char c ); str 指向要查找的字符串的指针。 c 要查找的字符。 该函数查找字符串 str,找出字符 c 首次出现的位置。 此函数和 ANSI 中指定函数的不同之处在于, c 定义为 unsigned char 参数,而不是 int 型参数。 如果 c 出现在 str 中,则返回指向 str 中此字符的指针。否则,返回 一个空指针。 strchr.asm schrpgm.asm

参数:

说明:

返回值: 文件名:

strcmp strcmppgm strcmppgm2ram strcmpram2pgm
功能: 头文件: 函数原型: 比较两个字符串。 string.h signed char const const signed char const const signed char const const signed char const const strcmp( char * str1, char * str2 ); strcmppgm( rom char * str1, rom char * str2 ); strcmppgm2ram( char * str1, rom char * str2 ); strcmpram2pgm( rom char * str1, char * str2 );

DS51297F_CN 第 132 页

? 2005 Microchip Technology Inc.

通用软件函数库
strcmp strcmppgm strcmppgm2ram strcmpram2pgm
参数: str1 指向第一个字符串的指针。 str2 指向第二个字符串的指针。 该函数将 str1 中的字符串与 str2 中的字符串进行比较,且返回一个 值,表明 str1 是小于、等于还是大于 str2。 返回值为: <0 str1 小于 str2 ==0 str1 等于 str2 >0 str1 大于 str2 strcmp.asm scmpp2p.asm scmpp2r.asm scmpr2p.asm

说明: 返回值:

文件名:

strcpy strcpypgm strcpypgm2ram strcpyram2pgm
功能: 头文件: 函数原型: 将源字符串复制到目标字符串。 string.h char * strcpy( char * dest, const char * src ); rom char * strcpypgm( rom char * dest, const rom char * src );char * char * strcpypgm2ram( char * dest, const rom char *src ); rom char * strcpyram2pgm( rom char * dest, const char * src ); dest 指向目标字符串的指针。 src 指向源字符串的指针。 该函数将 src 中的字符串复制到 dest 中,直到终止空字符,所复制的 字符包括 src 中的终止空字符。如果 src 与 dest 地址有重叠,则无 法执行此操作 (操作未定义) 。 该函数返回 dest 的值。 strcpy.asm scpyp2p.asm scpyp2r.asm scpyr2p.asm

参数:

说明:

返回值: 文件名:

? 2005 Microchip Technology Inc.

DS51297F_CN 第 133 页

MPLAB? C18 C 编译器函数库
strcspn strcspnpgm strcspnpgmram strcspnrampgm
功能: 头文件: 函数原型: 计算从字符串开头不包含在另一组字符中的连续字符数。 string.h size_t strcspn( const char * str1, const char * str2 ); sizerom_t strcspnpgm( const rom char * str1, const rom char * str2 ); sizerom_t strcspnpgmram( const rom char * str1, const char * str2 ); sizeram_t strcspnrampgm( const char * str1, const rom char * str2 ); str1 指向要查找字符串的指针。 str2 指向视为另一组字符的字符串的指针。 该函数确定从 str1 中首字符开始不包含在 str2 中的连续字符数。例 如: str1 str2 结果 "hello" "aeiou" 1 "antelope" "aeiou" 0 "antelope" "xyz" 8 如上例所示,该函数返回 str1 中首字符开始不包含在 str2 中的连续 字符数。 strcspn.asm scspnpp.asm scspnpr.asm scspnrp.asm

参数:

说明:

返回值: 文件名:

strlen strlenpgm
功能: 头文件: 函数原型: 参数: 说明: 返回值: 文件名: 返回字符串的长度。 string.h size_t strlen( const char * str ); sizerom_t strlenpgm( const rom char * str ); str 指向字符串的指针。 该函数确定字符串的长度,但不包括结尾的空字符。 返回字符串的长度。 strlen.asm slenpgm.asm

DS51297F_CN 第 134 页

? 2005 Microchip Technology Inc.

通用软件函数库
strlwr strlwrpgm
功能: 头文件: 函数原型: 参数: 说明: 返回值: 文件名: 将字符串中所有大写字符转换为小写。 string.h char * strlwr( char * str ); rom char * strlwrpgm( rom char * str ); str 指向字符串的指针。 该函数将 str 中所有大写字符转换为小写字符。不会影响不在大写字符 范围 (A 到 Z)内的字符。 返回 str 的值。 strlwr.asm slwrpgm.asm

strncat strncatpgm strncatpgm2ram strncatram2pgm
功能: 头文件: 函数原型: 将源字符串中指定数目的字符添加到目标字符串。 string.h char * strncat( char * dest, const char * src, size_t n ); rom char * strncatpgm( rom char * dest, const rom char * src, sizerom_t n ); char * strncatpgm2ram( char * dest, const rom char * src, sizeram_t n ); rom char * strncatram2p

相关文章:
编译libtorrent.lib篇
由DLL反编译出Lib 7页 2下载券 PIC C18编译器lib_中文 184页 免费 ubuntu下...BT 的编译测试全过程 为了进行 libtorrent.lib 的编译,首先我们需要搭建起基本...
关于PIC的C18编译器的链接脚本文件
关于PICC18编译器的链接脚本文件_计算机软件及应用_IT/计算机_专业资料。关于 ...FILES c018i.o FILES clib.lib FILES p18f4620.lib //链接描述文件说明 PIC...
PIC 编译器系列
PIC 编译器系列_电子/电路_工程科技_专业资料。PIC 编译器系列一、HI-TECH C...PIC 封装尺寸 PIC 工具系列1/2 相关文档推荐 PIC C18编译器lib_中文 184页 ...
PICC 编译器的安装与使用方法
PIICC C 编译器 for MPLAB IDE 的 安装与使用方法,从此开始了我们的 PIC ...选择为:安装路径/include; Library Search Directory 路径选择为:安装路径/lib。...
gcc编译器使用简明指南
gcc编译器使用简明指南_计算机软件及应用_IT/计算机_专业资料。itgcc...libmessge.so message.o 其中,PIC 命令行标记告诉 GCC 产生的代码不要包含对...
Microchip 几种编译器 在代码中 对CONFIG 位的配置
* //*MPLAB C18 verifies that the configuration settings specified are valid...Microchip 几种编译器 在... 8页 1下载券 PIC单片机配置 18页 免费 PIC...
常用单片机使用的编译软件
三、PIC 单片机 使用 MPLAB 编译器,但它只支持汇编语言的程序设计与调试,需要第三方编译器 的支持才能编译 C 语言程序,常用 picc 编译器,可以使用 microbrn 下载...
用PICC编译器开发PIC系列单片机的代码
PICC 编译器开发 PIC 系列单片机的代码 摘要:介绍 PIC 系列单片机 C 语言的...PIC C18编译器lib_中文 184页 免费 PICC编译器资料 26页 免费 用PICC编译器语言...
用PICC编译器开发PIC系列单片机的代码
PICC编译器开发PIC系列单片机的代码_四年级数学_数学_小学教育_教育专区。介绍PIC系列单片机C语言的发展;以HI-TECH Software公司的HI-TECH PICC为例 , 介绍PICC编...
目前最全的GCC+中文手册
-mcall-lib-mul 对于整数乘法使用 lmul$$ . -m...-mhalf-pic -mno-half-pic -mhalf-pic 开关选项...c++编译器 gcc/g++在执行编译工作的时候,总共需要 ...
更多相关标签:
mplab c18编译器下载 | mplab c18编译器 | c18编译器 | pic18编译器 | pic编译器 | pic单片机编译器 | pic ccs编译器 | pic编译器下载 |