12.07.2015 Views

MPLAB® C18 C 编译器函数库

MPLAB® C18 C 编译器函数库

MPLAB® C18 C 编译器函数库

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

MPLAB ® <strong>C18</strong>C 编 译 器函 数 库© 2004 Microchip Technology Inc. DS51297C_CN


MPLAB ® <strong>C18</strong> C 编 译 器函 数 库目 录前 言 .................................................................................................................................. 1第 1 章 概 述1.1 简 介 .............................................................................................................. 71.2 MPLAB <strong>C18</strong> 函 数 库 概 述 .............................................................................. 71.3 启 动 代 码 ....................................................................................................... 71.4 处 理 器 内 核 函 数 库 ........................................................................................ 81.5 特 定 处 理 器 的 函 数 库 ..................................................................................... 9第 2 章 硬 件 外 设 函 数2.1 简 介 ............................................................................................................ 112.2 A/D 转 换 器 函 数 .......................................................................................... 112.3 输 入 捕 捉 函 数 ............................................................................................. 192.4 I²C 函 数 .................................................................................................. 232.5 I/O 口 函 数 .................................................................................................. 322.6 Microwire ® 函 数 ......................................................................................... 342.7 脉 宽 调 制 函 数 ............................................................................................. 392.8 SPI 函 数 ................................................................................................. 422.9 定 时 器 函 数 ................................................................................................. 482.10 USART 函 数 ............................................................................................... 56第 3 章 软 件 外 设 函 数 库3.1 简 介 ............................................................................................................ 653.2 外 部 LCD 函 数 ............................................................................................ 653.3 外 部 CAN2510 函 数 ................................................................................... 723.4 软 件 I²C 函 数 .............................................................................................. 943.5 软 件 SPI ® 函 数 ......................................................................................... 1003.6 软 件 UART 函 数 ....................................................................................... 103第 4 章 通 用 软 件 函 数 库4.1 简 介 .......................................................................................................... 1074.2 字 符 分 类 函 数 ........................................................................................... 1074.3 数 据 转 换 函 数 ........................................................................................... 1124.4 存 储 器 和 字 符 串 操 作 函 数 ......................................................................... 1174.5 延 时 函 数 ................................................................................................... 1294.6 复 位 函 数 ................................................................................................... 131第 5 章 数 学 函 数 库5.1 简 介 .......................................................................................................... 1355.2 32 位 整 数 和 32 位 浮 点 数 数 学 函 数 库 ....................................................... 1355.3 十 进 制 / 浮 点 数 和 浮 点 数 / 十 进 制 转 换 ..................................................... 136© 2004 Microchip Technology Inc. DS51297C_CN 第 iii 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库术 语 表 ...........................................................................................................................141索 引 ..............................................................................................................................147全 球 销 售 及 服 务 网 点 .....................................................................................................152DS51297C_CN 第 iv 页© 2004 Microchip Technology Inc.


MPLAB ® <strong>C18</strong> C 编 译 器函 数 库前 言简 介本 文 档 旨 在 提 供 关 于 Microchip MPLAB ® <strong>C18</strong> C 编 译 器 可 使 用 的 函 数 库 和 预 编 译 目 标文 件 的 详 细 信 息 。关 于 本 指 南文 档 内 容 编 排文 档 内 容 编 排 如 下 :• 第 1 章 : 概 述 — 描 述 可 使 用 的 函 数 库 和 预 编 译 目 标 文 件 。• 第 2 章 : 硬 件 外 设 函 数 库 — 描 述 每 个 硬 件 外 设 库 函 数 。• 第 3 章 : 软 件 外 设 函 数 库 — 描 述 每 个 软 件 外 设 库 函 数 。• 第 4 章 : 通 用 软 件 函 数 库 — 描 述 每 个 通 用 软 件 库 函 数 。• 第 5 章 : 数 学 函 数 库 — 讲 述 数 学 库 函 数 。• 术 语 表 — 包 括 本 指 南 使 用 的 术 语 。• 索 引 — 本 文 档 中 的 术 语 、 特 性 以 及 各 个 章 节 的 交 叉 引 用 列 表 。© 2004 Microchip Technology Inc. DS51297C_CN 第 1 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库本 指 南 使 用 的 约 定本 指 南 使 用 如 下 文 档 约 定 :文 档 约 定描 述 表 示 示 例代 码 (Courier 字 体 ):Courier 字 体 示 例 源 代 码 distance -= time * speed;文 件 名 及 路 径c:\mcc18\h关 键 字_asm, _endasm, static命 令 行 选 项-Opa+, -Opa-斜 体 Courier 可 变 参 数file.o, 其 中 file 可 以 是 任 何 有 效 的 文 件 名字 体方 括 号 [ ] 可 选 参 数 mcc18 [options] file [options]省 略 号 ... 代 替 重 复 的 文 本 var_name [, var_name...]表 示 用 户 提 供 的 代 码 void main (void){ ...}0xnnnn 十 六 进 制 数0xFFFF, 0x007A其 中 n 代 表 十 六 进 制 位文 档 (Arial 字 体 )斜 体 字 符 参 考 书 籍 MPLAB User’s Guide文 档 更 新所 有 文 档 都 有 过 时 的 时 候 , 本 指 南 也 不 例 外 。 为 满 足 客 户 的 需 要 , MPLAB <strong>C18</strong> 在 不 断发 展 之 中 , 本 文 档 中 的 某 些 工 具 描 述 可 能 与 实 际 有 所 差 别 。 请 登 录 我 公 司 网 站 获 得 最新 文 档 。文 档 命 名 约 定文 档 用 “DS” 号 编 号 。 DS 号 位 于 每 页 页 脚 的 页 码 之 前 。 DS 号 的 命 名 约 定 为DSXXXXXA 或 DSXXXXXA_CN, 其 中 :XXXXX = 文 档 号 。A = 文 档 的 版 本 。_CN = 文 档 为 中 文 版 。DS51297C_CN 第 2 页© 2004 Microchip Technology Inc.


前 言推 荐 读 物要 了 解 更 多 关 于 编 译 器 的 函 数 库 和 预 编 译 目 标 文 件 、 MPLAB IDE 及 其 它 工 具 使 用 方 面的 信 息 , 请 阅 读 以 下 推 荐 读 物 。readme.c18关 于 使 用 MPLAB <strong>C18</strong> C 编 译 器 的 最 新 信 息 , 请 阅 读 本 软 件 自 带 的 readme.c18 文 件(ASCII 文 本 )。 此 readme 文 件 包 含 了 本 文 档 可 能 未 提 供 的 更 新 信 息 。readme.xxx需 要 其 它 Microchip 工 具 的 最 新 信 息 (MPLAB IDE 和 MPLINK 链 接 器 等 ), 请 阅 读软 件 自 带 的 相 关 readme 文 件 (ASCII 文 本 文 件 )。MPLAB ® <strong>C18</strong> C 编 译 器 入 门 (DS51295C_CN)讲 述 如 何 安 装 MPLAB <strong>C18</strong> 编 译 器 , 如 何 编 写 简 单 的 程 序 以 及 如 何 在 MPLAB IDE 中 使用 编 译 器 。MPLAB ® <strong>C18</strong> C 编 译 器 用 户 指 南 (DS51288C_CN)一 个 综 合 指 南 , 讲 述 了 针 对 PI<strong>C18</strong> 器 件 设 计 的 Microchip MPLAB <strong>C18</strong> C 编 译 器 的 使 用及 特 征 。MPLAB ® IDE V6.XX 快 速 入 门 指 南 (DS51281C_CN)介 绍 如 何 安 装 MPLAB IDE 软 件 及 如 何 使 用 IDE 创 建 项 目 并 烧 写 器 件 。MPASM User's Guide with MPLINK Linker and MPLIB Librarian(DS33014)这 个 用 户 指 南 描 述 了 如 何 使 用 Microchip 的 PICmicro 单 片 机 汇 编 器 (MPASM )、 链接 器 (MPLINK) 和 库 管 理 器 (MPLIB)。PICmicro ® 18C 单 片 机 系 列 参 考 手 册 (DS39500A_CN)重 点 介 绍 增 强 型 单 片 机 系 列 。 说 明 了 增 强 型 单 片 机 系 列 架 构 和 外 设 模 块 的 工 作 原 理 ,但 没 有 涉 及 到 每 个 器 件 的 具 体 细 节 。PI<strong>C18</strong> Device Data Sheets and Application Notes讲 述 PI<strong>C18</strong> 器 件 工 作 和 电 气 特 性 的 数 据 手 册 。 应 用 笔 记 介 绍 了 如 何 使 用 PI<strong>C18</strong> 器 件 。要 获 得 上 述 任 何 文 档 , 请 访 问 Microchip 的 网 站 (www.microchip.com), 获 得 AdobeAcrobat (.pdf) 格 式 的 文 档 。© 2004 Microchip Technology Inc. DS51297C_CN 第 3 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库MICROCHIP 网 站Microchip 在 其 网 站 上 为 您 提 供 在 线 支 持 。 客 户 很 容 易 从 Microchip 网 站 上 获 得 文 件 和信 息 。 要 访 问 此 网 站 , 您 必 须 能 访 问 互 联 网 并 要 安 装Netscape Navigator ® 或 Microsoft ® Internet Explorer 等 网 络 浏 览 器 。使 用 您 喜 欢 的 互 联 网 浏 览 器 , 可 以 访 问 Microchip 的 网 站 :http://www.microchip.com网 站 提 供 多 种 服 务 。 用 户 从 网 站 上 可 以 下 载 到 最 新 开 发 工 具 的 文 件 、 数 据 手 册 、 应 用笔 记 、 用 户 指 南 、 文 章 和 示 例 程 序 。 也 可 以 获 得 关 于 Microchip 业 务 的 具 体 信 息 , 包 括销 售 办 事 处 、 分 销 商 和 工 厂 代 表 的 列 表 。技 术 支 持• 常 见 问 题 (FAQ)• 在 线 讨 论 组 — 关 于 产 品 、 开 发 系 统 、 技 术 信 息 及 其 它 方 面 的 讨 论 会 。• Microchip 顾 问 计 划 成 员 列 表• 到 其 它 与 Microchip 产 品 相 关 的 有 用 网 站 的 链 接工 程 师 工 具 箱• 设 计 技 巧• 器 件 勘 误 表其 它 信 息• 最 新 Microchip 新 闻 稿• 研 讨 会 和 活 动 列 表• 招 聘 职 位DS51297C_CN 第 4 页© 2004 Microchip Technology Inc.


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


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库客 户 支 持Microchip 产 品 的 用 户 可 通 过 下 列 渠 道 获 得 支 持 :• 分 销 商 或 代 表• 当 地 销 售 办 事 处• 应 用 工 程 师 (FAE)• 应 用 工 程 师 (CAE)• 热 线客 户 可 以 致 电 其 分 销 商 、 代 表 或 应 用 工 程 师 (FAE) 寻 求 支 持 。 请 查 看 本 手 册 最 后 一页 的 销 售 办 事 处 及 地 址 列 表 。也 可 致 电 应 用 工 程 师 (CAE) 获 得 技 术 支 持 , 美 国 地 区 请 拨 打 (480) 792-7627。 中 国大 陆 地 区 请 拨 打 800-820-6247。此 外 还 有 系 统 信 息 和 更 新 热 线 。 此 热 线 为 系 统 用 户 提 供 开 发 系 统 软 件 产 品 最 新 版 本 的列 表 。 此 热 线 还 提 供 有 关 客 户 如 何 获 得 目 前 更 新 工 具 包 的 信 息 。热 线 号 码 为 :美 国 和 加 拿 大 大 部 分 地 区 , 请 拨 打 1-800-755-2345。全 球 其 它 国 家 或 地 区 , 请 拨 打 1-480-792-7302。DS51297C_CN 第 6 页© 2004 Microchip Technology Inc.


第 1 章 概 述MPLAB ® <strong>C18</strong> C 编 译 器函 数 库1.1 简 介本 章 概 括 了 可 在 应 用 程 序 中 包 含 的 MPLAB <strong>C18</strong> 库 文 件 和 预 编 译 目 标 文 件 。1.2 MPLAB <strong>C18</strong> 函 数 库 概 述1.3 启 动 代 码函 数 库 是 为 便 于 引 用 和 链 接 而 分 类 形 成 的 函 数 集 合 。 可 参 阅 MPASM User's Guidewith MPLINK and MPLIB (DS33014), 获 得 更 多 关 于 创 建 和 维 护 函 数 库 的 信 息 。MPLAB <strong>C18</strong> 函 数 库 在 安 装 目 录 下 的 lib 子 目 录 中 。 这 些 函 数 库 可 通 过 MPLINK 链 接 器直 接 链 接 到 应 用 程 序 中 。这 些 文 件 在 c:\mcc18\src 目 录 下 进 行 预 编 译 。 目 录 src\traditional 包 含 非 扩展 模 式 的 文 件 , 目 录 src\extended 包 含 扩 展 模 式 的 文 件 。 假 如 你 选 择 不 把 编 译 器 和相 关 文 件 安 装 到 c:\mcc18 目 录 下 , 那 么 链 接 器 列 表 文 件 中 不 会 显 示 函 数 库 的 源 代码 , 使 用 MPLAB IDE 时 也 不 能 单 步 执 行 函 数 库 的 源 代 码 。为 了 在 .lst 文 件 中 包 含 库 函 数 代 码 和 能 够 单 步 执 行 库 函 数 , 可 以 按 照 README.<strong>C18</strong> 中的 指 示 说 明 , 使 用 在 src、 src\traditional 和 src\extended 目 录 下 提 供 的 批处 理 文 件 (.bat) 重 建 函 数 库 。1.3.1 概 述MPLAB <strong>C18</strong> 提 供 了 三 个 版 本 的 启 动 代 码 , 其 初 始 化 级 别 不 同 。c018*.o 目 标 文 件 用 于工 作 在 非 扩 展 模 式 的 编 译 器 。 c018*_e.o 目 标 文 件 用 于 工 作 在 扩 展 模 式 的 编 译 器 。 按照 复 杂 程 度 递 增 的 顺 序 排 列 为 :c018.o/c018_e.o 初 始 化 C 软 件 堆 栈 , 然 后 跳 转 到 应 用 函 数 main() 的 开 头 。c018i.o/c018i_e.o 执 行 所 有 与 c018.o/c018_e.o 相 同 的 任 务 , 且 在 调 用 用 户 的应 用 程 序 之 前 , 为 需 要 初 始 化 的 数 据 赋 值 。 如 果 全 局 变 量 或 静 态 变 量 在 定 义 时 已 赋 值 ,也 需 要 进 行 初 始 化 。 这 是 包 含 在 随 MPLAB <strong>C18</strong> 提 供 的 链 接 器 描 述 文 件 中 的 启 动 代 码 。c018iz.o/c018iz_e.o 执 行 所 有 与 c018.o/c018_e.o 相 同 的 任 务 , 并 按 照 严 格ANSI 符 合 的 要 求 , 将 所 有 未 初 始 化 的 变 量 赋 值 为 0。© 2004 Microchip Technology Inc. DS51297C_CN 第 7 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库1.3.2 源 代 码启 动 子 程 序 的 源 代 码 保 存 在 编 译 器 安 装 目 录 的 src\traditional\ startup 和src\extended\startup 子 目 录 中 。1.3.3 重 建使 用 批 处 理 文 件 makestartup.bat 来 创 建 启 动 代 码 , 并 把 生 成 的 目 标 文 件 复 制 到lib 目 录 中 。使 用 makestartup.bat 重 建 代 码 之 前 , 检 查 MPLAB <strong>C18</strong> (mcc18.exe) 是 否 在 正确 的 路 径 中 。1.4 处 理 器 内 核 函 数 库1.4.1 概 述标 准 C 函 数 库 (clib.lib 或 clib_e.lib) 提 供 了 PI<strong>C18</strong> 内 核 架 构 支 持 的 函 数 , 本 系列 中 所 有 处 理 器 都 支 持 这 些 函 数 。 将 在 以 下 章 节 中 描 述 这 些 函 数 :• 第 4 章 , 通 用 软 件 函 数 库 。• 第 5 章 , 数 学 函 数 库 。1.4.2 源 代 码可 以 在 编 译 器 安 装 目 录 的 下 列 子 目 录 中 找 到 标 准 C 函 数 库 中 函 数 的 源 代 码 :• src\traditional\math• src\extended\math• src\traditional\delays• src\extended\delays• src\traditional\stdclib• src\extended\stdclib1.4.3 重 建可 以 使 用 批 处 理 文 件 makeclib.bat 重 建 处 理 器 内 核 函 数 库 。 在 调 用 这 个 批 处 理 文 件之 前 , 确 认 下 列 工 具 在 相 应 路 径 中 :• MPLAB <strong>C18</strong> (mcc18.exe)• MPASM 汇 编 器 (mpasm.exe)• MPLIB 库 管 理 器 (mplib.exe)在 重 建 标 准 C 函 数 库 之 前 , 确 保 环 境 变 量 MCC_INCLUDE 已 经 设 置 为 MPLAB <strong>C18</strong> 头 文件 的 路 径 ( 如 c:\mcc18\h)。DS51297C_CN 第 8 页© 2004 Microchip Technology Inc.


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库注 :DS51297C_CN 第 10 页© 2004 Microchip Technology Inc.


第 2 章 硬 件 外 设 函 数MPLAB ® <strong>C18</strong> C 编 译 器函 数 库2.1 简 介本 章 描 述 特 定 处 理 器 函 数 库 中 的 硬 件 外 设 函 数 , 所 有 这 些 函 数 的 源 代 码 都 包 含 在MPLAB <strong>C18</strong> 编 译 器 安 装 目 录 的 src\pmc 和 src\extended\pmc 子 目 录 下 。更 多 有 关 使 用 MPLIB 函 数 库 管 理 器 管 理 函 数 库 的 信 息 , 可 参 阅 MPASM User'sGuide with MPLINK and MPLIB (DS33014)。MPLAB <strong>C18</strong> 库 函 数 支 持 下 列 外 设 :• A/D 转 换 器 (2.2 节 “A/D 转 换 器 函 数 ”)• 输 入 捕 捉 (2.3 节 “ 输 入 捕 捉 函 数 ”)• I 2 C (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: A/D 转 换 器 函 数函 数描 述BusyADC A/D 转 换 器 是 否 正 在 进 行 转 换 ?CloseADC 禁 止 A/D 转 换 器 。ConvertADC 启 动 A/D 转 换 。OpenADC 配 置 A/D 转 换 器 。ReadADC 读 取 A/D 转 换 的 结 果 。SetChanADC 选 择 要 使 用 的 A/D 通 道 。© 2004 Microchip Technology Inc. DS51297C_CN 第 11 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库2.2.1 函 数 描 述BusyADC功 能 : A/D 转 换 器 是 否 正 在 进 行 转 换 ?包 含 头 文 件 : adc.h原 型 : char BusyADC( void );说 明 : 该 函 数 表 明 A/D 外 设 是 否 正 在 进 行 转 换 。返 回 值 : 如 果 A/D 外 设 正 在 进 行 转 换 , 为 1 ;如 果 A/D 外 设 不 在 进 行 转 换 , 为 0。文 件 名 :adcbusy.cCloseADC功 能 : 禁 止 A/D 转 换 器 。包 含 头 文 件 : adc.h原 型 : void CloseADC( void );说 明 : 该 函 数 禁 止 A/D 转 换 器 和 A/D 中 断 机 制 。文 件 名 :adcclose.cConvertADC功 能 : 启 动 A/D 转 换 过 程 。包 含 头 文 件 : adc.h原 型 : void ConvertADC( void );说 明 : 该 函 数 启 动 A/D 转 换 。 可 用 函 数 BusyADC() 来 检 测 转 换 是 否 完 成 。文 件 名 :adcconv.cOpenADCPI<strong>C18</strong>CXX2, PI<strong>C18</strong>FXX2, PI<strong>C18</strong>FXX8, PI<strong>C18</strong>FXX39功 能 : 配 置 A/D 转 换 器 。包 含 头 文 件 : adc.h原 型 :void OpenADC( unsigned char config,unsigned char config2 );参 数 :config从 下 面 所 列 出 各 类 型 中 分 别 取 一 个 值 并 相 与 (‘&’) 所 得 的 值 。 这 些 值 在文 件 adc.h 中 定 义 。A/D 时 钟 源 :ADC_FOSC_2 FOSC / 2ADC_FOSC_4 FOSC / 4ADC_FOSC_8 FOSC / 8ADC_FOSC_16 FOSC / 16ADC_FOSC_32 FOSC / 32ADC_FOSC_64 FOSC / 64ADC_FOSC_RC 内 部 RC 振 荡 器A/D 结 果 对 齐 :ADC_RIGHT_JUST 结 果 向 最 低 有 效 位 对 齐 ( 右 对 齐 )ADC_LEFT_JUST 结 果 向 最 高 有 效 位 对 齐 ( 左 对 齐 )DS51297C_CN 第 12 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数OpenADCPI<strong>C18</strong>CXX2, PI<strong>C18</strong>FXX2, PI<strong>C18</strong>FXX8, PI<strong>C18</strong>FXX39 ( 续 )A/D 参 考 电 压 源 :ADC_8ANA_0REFADC_7ANA_1REFVREF+=VDD, VREF-=VSS,所 有 通 道 都 是 模 拟 通 道AN3=VREF+, 除 AN3 外 都 是 模 拟 通 道ADC_6ANA_2REFADC_6ANA_0REFADC_5ANA_1REFADC_5ANA_0REFADC_4ANA_2REFADC_4ANA_1REFADC_3ANA_2REFADC_3ANA_0REFADC_2ANA_2REFADC_2ANA_1REFADC_1ANA_2REFADC_1ANA_0REFADC_0ANA_0REFAN3=VREF+, AN2=VREFVREF+=VDD, VREF-=VSSAN3=VREF+, VREF-=VSSVREF+=VDD, VREF-=VSSAN3=VREF+, AN2=VREF-AN3=VREF+AN3=VREF+, AN2=VREF-VREF+=VDD, VREF-=VSSAN3=VREF+, AN2=VREF-AN3=VREF+AN3=VREF+, AN2=VREF-,AN0=AAN0 为 模 拟 输 入所 有 通 道 都 是 数 字 I/Oconfig2从 下 面 所 列 出 各 类 型 中 分 别 取 一 个 值 并 相 与 (‘&’) 所 得 的 值 。 这 些 值 在文 件 adc.h 定 义 。通 道 :ADC_CH0 通 道 0ADC_CH1 通 道 1ADC_CH2 通 道 2ADC_CH3 通 道 3ADC_CH4 通 道 4ADC_CH5 通 道 5ADC_CH6 通 道 6ADC_CH7 通 道 7A/D 中 断 :ADC_INT_ON 允 许 中 断ADC_INT_OFF 禁 止 中 断说 明 : 该 函 数 把 A/D 外 设 复 位 到 上 电 复 位 (POR) 状 态 , 且 根 据 指 定 的 选 择 ,配 置 与 A/D 相 关 的 特 殊 功 能 寄 存 器 (SFR)。文 件 名 :adcopen.c代 码 示 例 : OpenADC( ADC_FOSC_32 &ADC_RIGHT_JUST &ADC_1ANA_0REF,ADC_CH0 &ADC_INT_OFF );© 2004 Microchip Technology Inc. DS51297C_CN 第 13 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库OpenADCPI<strong>C18</strong>C658/858, PI<strong>C18</strong>C601/801,PI<strong>C18</strong>F6X20, PI<strong>C18</strong>F8X20功 能 : 配 置 A/D 转 换 器 。包 含 头 文 件 : adc.h原 型 :void OpenADC( unsigned char config,unsigned char config2 );参 数 :config从 下 面 所 列 出 各 类 型 中 分 别 取 一 个 值 并 相 与 (‘&’) 所 得 的 值 。 这 些 值 在文 件 adc.h 定 义 。A/D 时 钟 源 :ADC_FOSC_2 FOSC / 2ADC_FOSC_4 FOSC / 4ADC_FOSC_8 FOSC / 8ADC_FOSC_16 FOSC / 16ADC_FOSC_32 FOSC / 32ADC_FOSC_64 FOSC / 64ADC_FOSC_RC 内 部 RC 振 荡 器A/D 结 果 对 齐 :ADC_RIGHT_JUST 结 果 向 最 低 有 效 位 对 齐 ( 右 对 齐 )ADC_LEFT_JUST 结 果 向 最 高 有 效 位 对 齐 ( 左 对 齐 )A/D 端 口 配 置 :ADC_0ANA 所 有 端 口 都 是 数 字 端 口ADC_1ANA 模 拟 端 口 :AN0 数 字 端 口 :AN1-AN15ADC_2ANA 模 拟 端 口 :AN0-AN1 数 字 端 口 :AN2-AN15ADC_3ANA 模 拟 端 口 :AN0-AN2 数 字 端 口 :AN3-AN15ADC_4ANA 模 拟 端 口 :AN0-AN3 数 字 端 口 :AN4-AN15ADC_5ANA 模 拟 端 口 :AN0-AN4 数 字 端 口 :AN5-AN15ADC_6ANA 模 拟 端 口 :AN0-AN5 数 字 端 口 :AN6-AN15ADC_7ANA 模 拟 端 口 :AN0-AN6 数 字 端 口 :AN7-AN15ADC_8ANA 模 拟 端 口 :AN0-AN7 数 字 端 口 :AN8-AN15ADC_9ANA 模 拟 端 口 :AN0-AN8 数 字 端 口 :AN9-AN15ADC_10ANA 模 拟 端 口 :AN0-AN9 数 字 端 口 :AN10-AN15ADC_11ANA 模 拟 端 口 :AN0-AN10 数 字 端 口 :AN11-AN15ADC_12ANA 模 拟 端 口 :AN0-AN11 数 字 端 口 :AN12-AN15ADC_13ANA 模 拟 端 口 :AN0-AN12 数 字 端 口 :AN13-AN15ADC_14ANA 模 拟 端 口 :AN0-AN13 数 字 端 口 :AN14-AN15ADC_15ANA 所 有 端 口 都 是 模 拟 端 口config2从 下 面 所 列 出 各 类 型 中 分 别 取 一 个 值 并 相 与 (‘&’) 所 得 的 值 。 这 些 值 在文 件 adc.h 定 义 。DS51297C_CN 第 14 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数OpenADCPI<strong>C18</strong>C658/858, PI<strong>C18</strong>C601/801,PI<strong>C18</strong>F6X20, PI<strong>C18</strong>F8X20 ( 续 )通 道 :ADC_CH0 通 道 0ADC_CH1 通 道 1ADC_CH2 通 道 2ADC_CH3 通 道 3ADC_CH4 通 道 4ADC_CH5 通 道 5ADC_CH6 通 道 6ADC_CH7 通 道 7ADC_CH8 通 道 8ADC_CH9 通 道 9ADC_CH10 通 道 10ADC_CH11 通 道 11ADC_CH12 通 道 12ADC_CH13 通 道 13ADC_CH14 通 道 14ADC_CH15 通 道 15A/D 中 断 :ADC_INT_ON 允 许 中 断ADC_INT_OFF 禁 止 中 断A/D 电 压 配 置 :ADC_VREFPLUS_VDD VREF+ = AVDDADC_VREFPLUS_EXT VREF+ = 外 接ADC_VREFMINUS_VDD VREF- = AVDDADC_VREFMINUS_EXT VREF- = 外 接说 明 :该 函 数 把 与 A/D 相 关 的 寄 存 器 复 位 到 POR 状 态 , 然 后 配 置 时 钟 、 结 果格 式 、 参 考 电 压 、 端 口 和 通 道 。文 件 名 :adcopen.c代 码 示 例 : OpenADC( ADC_FOSC_32 &ADC_RIGHT_JUST &ADC_14ANA,ADC_CH0 &ADC_INT_OFF );© 2004 Microchip Technology Inc. DS51297C_CN 第 15 页


MPLAB ® <strong>C18</strong> 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 FOSC / 2ADC_FOSC_4 FOSC / 4ADC_FOSC_8 FOSC / 8ADC_FOSC_16 FOSC / 16ADC_FOSC_32 FOSC / 32ADC_FOSC_64 FOSC / 64ADC_FOSC_RC 内 部 RC 振 荡 器A/D 结 果 对 齐 :ADC_RIGHT_JUST 结 果 向 最 低 有 效 位 对 齐 ( 右 对 齐 )ADC_LEFT_JUST 结 果 向 最 高 有 效 位 对 齐 ( 左 对 齐 )A/D 采 集 时 间 选 择 :ADC_0_TAD 0 TadADC_2_TAD 2 TadADC_4_TAD 4 TadADC_6_TAD 6 TadADC_8_TAD 8 TadADC_12_TAD 12 TadADC_16_TAD 16 TadADC_20_TAD 20 Tadconfig2从 下 面 所 列 出 各 类 型 中 分 别 取 一 个 值 并 相 与 (‘&’) 所 得 的 值 。 这 些 值 在文 件 adc.h 定 义 。通 道 :ADC_CH0 通 道 0ADC_CH1 通 道 1ADC_CH2 通 道 2ADC_CH3 通 道 3ADC_CH4 通 道 4ADC_CH5 通 道 5ADC_CH6 通 道 6ADC_CH7 通 道 7ADC_CH8 通 道 8ADC_CH9 通 道 9ADC_CH10 通 道 10ADC_CH11 通 道 11ADC_CH12 通 道 12ADC_CH13 通 道 13ADC_CH14 通 道 14ADC_CH15 通 道 15DS51297C_CN 第 16 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数OpenADC所 有 其 它 处 理 器 ( 续 )A/D 中 断 :ADC_INT_ON 允 许 中 断ADC_INT_OFF 禁 止 中 断A/D 电 压 配 置 :ADC_VREFPLUS_VDD VREF+ = AVDDADC_VREFPLUS_EXT VREF+ = 外 接ADC_VREFMINUS_VDD VREF- = AVDDADC_VREFMINUS_EXT VREF- = 外 接portconfig对 于 PI<strong>C18</strong>F1220/1320, portconfig 的 取 值 范 围 是 0 到 127 之 间 ; 对 于PI<strong>C18</strong>F2220/2320/4220/4320, portconfig 的 取 值 范 围 是 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© 2004 Microchip Technology Inc. DS51297C_CN 第 17 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库SetChanADC功 能 : 选 择 用 作 A/D 转 换 器 输 入 的 通 道 。包 含 头 文 件 : adc.h原 型 : void SetChanADC( unsigned char channel );参 数 :channel下 列 值 之 一 ( 在 adc.h 中 定 义 ):ADC_CH0 通 道 0ADC_CH1 通 道 1ADC_CH2 通 道 2ADC_CH3 通 道 3ADC_CH4 通 道 4ADC_CH5 通 道 5ADC_CH6 通 道 6ADC_CH7 通 道 7ADC_CH8 通 道 8ADC_CH9 通 道 9ADC_CH10 通 道 10ADC_CH11 通 道 11说 明 : 选 择 用 作 A/D 转 换 器 输 入 的 引 脚 。文 件 名 :adcsetch.c代 码 示 例 : SetChanADC( ADC_CH0 );2.2.2 使 用 A/D 转 换 器 函 数 的 例 子#include #include #include #include int result;void main( void ){// configure A/D convertorOpenADC( 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 converterDS51297C_CN 第 18 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数2.3 输 入 捕 捉 函 数下 列 函 数 支 持 捕 捉 外 设 。表 2-2:函 数输 入 捕 捉 函 数描 述CloseCapturex 禁 止 捕 捉 外 设 x。OpenCapturex 配 置 捕 捉 外 设 x。ReadCapturex 从 捕 捉 外 设 x 读 取 值 。CloseECapturex (1)禁 止 增 强 型 捕 捉 外 设 x。OpenECapturex (1)配 置 增 强 型 捕 捉 外 设 x。ReadECapturex (1)从 增 强 型 捕 捉 外 设 x 读 取 值 。注 1: 仅 带 有 ECCPxCONT 寄 存 器 的 器 件 具 有 增 强 捕 捉 功 能 。2.3.1 函 数 描 述CloseCapture1CloseCapture2CloseCapture3CloseCapture4CloseCapture5CloseECapture1功 能 : 禁 止 输 入 捕 捉 x。包 含 头 文 件 : capture.h原 型 : void CloseCapture1( void );void CloseCapture2( void );void CloseCapture3( void );void CloseCapture4( void );void CloseCapture5( void );void CloseECapture1( void );说 明 : 该 函 数 禁 止 与 指 定 输 入 捕 捉 相 对 应 的 中 断 。文 件 名 :cp1close.ccp2close.ccp3close.ccp4close.ccp5close.cep1close.c© 2004 Microchip Technology Inc. DS51297C_CN 第 19 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库OpenCapture1OpenCapture2OpenCapture3OpenCapture4OpenCapture5OpenECapture1功 能 : 配 置 并 使 能 输 入 捕 捉 x。包 含 头 文 件 : capture.h原 型 : void OpenCapture1( unsigned char config );void OpenCapture2( unsigned char config );void OpenCapture3( unsigned char config );void OpenCapture4( unsigned char config );void OpenCapture5( unsigned char config );void 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, 包 含 如 下 位 域 :Cap1OVFCap2OVFCap3OVFCap4OVFCap5OVFECap1OVF在 任 何 捕 捉 工 作 之 前 , 不 仅 要 配 置 和 使 能 捕 捉 模 块 , 还 要 使 能 相 应 的 定时 器 模 块 。 参 见 2.9 节 “ 定 时 器 函 数 ”, 获 得 有 关 使 用 定 时 器 运 行 时 库 函数 的 信 息 。DS51297C_CN 第 20 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数OpenCapture1OpenCapture2OpenCapture3OpenCapture4OpenCapture5OpenECapture1 ( 续 )文 件 名 :代 码 示 例 :cp1open.ccp2open.ccp3open.ccp4open.ccp5open.cep1open.cOpenCapture1( CAPTURE_INT_ON &C1_EVERY_4_RISE_EDGE );ReadCapture1ReadCapture2ReadCapture3ReadCapture4ReadCapture5ReadECapture1功 能 : 从 指 定 的 输 入 捕 捉 中 读 取 捕 捉 事 件 的 结 果 。包 含 头 文 件 : capture.h原 型 : unsigned int ReadCapture1( void );unsigned int ReadCapture2( void );unsigned int ReadCapture3( void );unsigned int ReadCapture4( void );unsigned int ReadCapture5( void );unsigned int ReadECapture1( void );说 明 : 该 函 数 读 取 各 个 输 入 捕 捉 特 殊 功 能 寄 存 器 的 值 。返 回 值 : 该 函 数 返 回 捕 捉 事 件 的 结 果 。文 件 名 :cp1read.ccp2read.ccp3read.ccp4read.ccp5read.cep1read.c© 2004 Microchip Technology Inc. DS51297C_CN 第 21 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库2.3.2 使 用 输 入 捕 捉 函 数 的 例 子该 示 例 说 明 在 “ 查 询 ”( 非 中 断 驱 动 ) 环 境 下 如 何 使 用 捕 捉 库 函 数 。#include #include #include #include #include void main(void){unsigned int result;char str[7];}// Configure Capture1OpenCapture1( C1_EVERY_4_RISE_EDGE &CAPTURE_INT_OFF );// Configure Timer3OpenTimer3( TIMER_INT_OFF &T3_SOURCE_INT );// Configure USARTOpenUSART( USART_TX_INT_OFF &USART_RX_INT_OFF &USART_ASYNCH_MODE &USART_EIGHT_BIT &USART_CONT_RX,25 );while(!PIR1bits.CCP1IF); // Wait for eventresult = ReadCapture1(); // read resultultoa(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 upCloseCapture1();CloseTimer3();CloseUSART();DS51297C_CN 第 22 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数2.4 I²C 函 数下 列 函 数 支 持 I 2 C 外 设 :表 2-3:函 数I 2 C 函 数描 述AckI2C 产 生 I 2 C 总 线 应 答 条 件 。CloseI2C 禁 止 SSP 模 块 。DataRdyI2C I 2 C 缓 冲 区 中 是 否 有 数 据 ?getcI2C 从 I 2 C 总 线 读 取 一 个 字 节 。getsI2C 从 工 作 在 主 I 2 C 模 式 的 I 2 C 总 线 读 取 一 个 数 据 串 。IdleI2C 循 环 直 到 I 2 C 总 线 空 闲 。NotAckI2C 产 生 I 2 C 总 线 无 应 答 条 件 。OpenI2C 配 置 SSP 模 块 。putcI2C 向 I 2 C 总 线 写 一 个 字 节 。putsI2C 向 工 作 在 主 模 式 或 从 模 式 的 I 2 C 总 线 写 一 个 数 据 串 。ReadI2C 从 I 2 C 总 线 上 读 取 一 个 字 节 。RestartI2C 产 生 I 2 C 总 线 重 复 启 动 条 件 。StartI2C 产 生 I 2 C 总 线 启 动 条 件 。StopI2C 产 生 I 2 C 总 线 停 止 条 件 。WriteI2C 向 I 2 C 总 线 写 一 个 字 节 。还 提 供 了 下 列 函 数 , 用 于 与 使 用 I 2 C 接 口 的 电 可 擦 除 (EE) 存 储 器 ( 如 Microchip 的24LC01B) 接 口 :表 2-4:函 数电 可 擦 除 存 储 器 接 口 函 数描 述EEAckPolling 产 生 应 答 查 询 序 列 。EEByteWrite 写 入 一 个 字 节 。EECurrentAddRead 从 下 一 个 地 址 读 取 一 个 字 节 。EEPageWrite 写 入 一 个 数 据 串 。EERandomRead 从 任 意 地 址 读 取 一 个 字 节 。EESequentialRead 读 取 一 个 数 据 串 。2.4.1 函 数 描 述AckI2CFunction: 产 生 I 2 C 总 线 应 答 条 件 。Include:i2c.hPrototype: void AckI2C( void );Remarks: 该 函 数 产 生 I 2 C 总 线 应 答 条 件 。File Name:acki2c.c© 2004 Microchip Technology Inc. DS51297C_CN 第 23 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库CloseI2C功 能 : 禁 止 SSP 模 块 。包 含 头 文 件 : i2c.h原 型 : void CloseI2C( void );说 明 : 该 函 数 禁 止 SSP 模 块 。文 件 名 :closei2c.cDataRdyI2C功 能 : I 2 C 缓 冲 区 中 是 否 有 数 据 ?包 含 头 文 件 : i2c.h原 型 : unsigned char DataRdyI2C( void );说 明 : 确 定 SSP 缓 冲 区 中 是 否 有 数 据 可 读 。返 回 值 : 如 果 SSP 缓 冲 区 中 有 数 据 , 为 1 ;如 果 SSP 缓 冲 区 中 没 有 数 据 , 则 为 0。文 件 名 :代 码 示 例 :dtrdyi2c.cif (DataRdyI2C()){var = getcI2C();}getcI2C参 见 ReadI2C。getsI2C功 能 : 从 工 作 在 主 I 2 C 模 式 的 I 2 C 总 线 上 读 取 一 个 固 定 长 度 的 数 据 串 。包 含 头 文 件 :原 型 :参 数 :i2c.hunsigned char getsI2C(unsigned char * rdptr,unsigned char length );rdptr指 向 用 于 存 储 从 I 2 C 器 件 所 读 取 数 据 的 PICmicro RAM 的 字 符 型 指 针 。length从 I 2 C 器 件 读 取 的 字 节 数 。说 明 : 该 函 数 从 I 2 C 总 线 上 读 取 一 个 预 定 义 长 度 的 数 据 串 。返 回 值 : 如 果 所 有 字 节 都 发 送 完 毕 , 为 0 ;如 果 发 生 总 线 冲 突 , 则 为 -1 。文 件 名 :代 码 示 例 :getsi2c.cunsigned char string[15];getsI2C(string, 15);DS51297C_CN 第 24 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数IdleI2C功 能 : 循 环 直 到 I 2 C 总 线 空 闲 。包 含 头 文 件 : i2c.h原 型 : void IdleI2C( void );说 明 :该 函 数 检 查 I 2 C 外 设 的 状 态 并 且 等 待 总 线 变 为 空 闲 。 由 于 硬 件 I 2 C 外 设不 允 许 队 列 缓 冲 总 线 序 列 , 所 以 需 要 函 数 IdleI2C。 在 开 始 I 2 C 操 作或 者 产 生 写 冲 突 之 前 , I 2 C 外 设 必 须 处 于 空 闲 状 态 。文 件 名 :idlei2c.cNotAckI2C功 能 : 产 生 I 2 C 总 线 无 应 答 条 件 。包 含 头 文 件 : i2c.h原 型 : void NotAckI2C( void );说 明 : 该 函 数 产 生 I 2 C 总 线 无 应 答 条 件 。文 件 名 :noacki2c.cOpenI2C功 能 : 配 置 SSP 模 块 。包 含 头 文 件 : i2c.h原 型 :void OpenI2C( unsigned char sync_mode,unsigned char slew );参 数 :sync_mode在 i2c.h 中 定 义 的 下 列 值 之 一 :SLAVE_7 I 2 C 从 模 式 , 7 位 地 址SLAVE_10 I 2 C 从 模 式 , 10 位 地 址MASTER I 2 C 主 模 式slew在 i2c.h 中 定 义 的 下 列 值 之 一 :SLEW_OFF 在 100 kHz 模 式 下 禁 止 压 摆 率 。SLEW_ON 在 400 kHz 模 式 下 使 能 压 摆 率 。说 明 :OpenI2C 函 数 把 SSP 模 块 复 位 到 POR 状 态 , 然 后 将 模 块 配 置 为 主 / 从 模式 及 选 择 的 压 摆 率 。文 件 名 :openi2c.c代 码 示 例 :OpenI2C(MASTER, SLEW_ON);putcI2C参 见 WriteI2C。© 2004 Microchip Technology Inc. DS51297C_CN 第 25 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库putsI2C功 能 : 向 工 作 在 主 模 式 或 从 模 式 的 I 2 C 总 线 写 一 个 数 据 串 。包 含 头 文 件 :原 型 :参 数 :说 明 :i2c.hunsigned char putsI2C(unsigned char *wrptr );wrptr指 向 要 写 到 I 2 C 总 线 的 数 据 的 指 针 。该 函 数 向 I 2 C 总 线 写 一 个 数 据 串 , 直 到 出 现 空 字 符 为 止 。 不 传 送 空 字 符本 身 。 该 函 数 可 以 工 作 在 主 模 式 或 从 模 式 。返 回 值 : 主 I 2 C 模 式 :如 果 在 数 据 串 中 遇 到 空 字 符 , 为 0 ;如 果 从 I 2 C 器 件 响 应 一 个 无 应 答 Not Ack 信 号 , 为 -2 ;如 果 发 生 写 冲 突 , 则 为 -3 。从 I 2 C 模 式 :如 果 在 数 据 串 中 遇 到 空 字 符 , 为 0 ;如 果 主 I 2 C 器 件 响 应 一 个 终 止 数 据 传 送 的 无 应 答 Not Ack 信 号 , 为 -2 。文 件 名 :putsi2c.c代 码 示 例 :unsigned char string[] = “data to send”;putsI2C(string);ReadI2CgetcI2C功 能 : 从 I 2 C 总 线 读 取 一 个 字 节 。包 含 头 文 件 :原 型 :i2c.hunsigned char ReadI2C (void);说 明 : 该 函 数 从 I 2 C 总 线 上 读 入 一 个 字 节 。返 回 值 : 从 I 2 C 总 线 上 读 取 的 数 据 字 节 。文 件 名 :代 码 示 例 :readi2c.cunsigned char value;value = ReadI2C();RestartI2C功 能 : 产 生 I 2 C 总 线 重 复 启 动 条 件 。包 含 头 文 件 : i2c.h原 型 : void RestartI2C( void );说 明 : 该 函 数 产 生 I 2 C 总 线 重 复 启 动 条 件 。文 件 名 :rstrti2c.cDS51297C_CN 第 26 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数StartI2C功 能 : 产 生 I 2 C 总 线 启 动 条 件 。包 含 头 文 件 : i2c.h原 型 : void StartI2C( void );说 明 : 该 函 数 产 生 I 2 C 总 线 启 动 条 件 。文 件 名 :starti2c.cStopI2C功 能 : 产 生 I 2 C 总 线 停 止 条 件 。包 含 头 文 件 : i2c.h原 型 : void StopI2C( void );说 明 : 该 函 数 产 生 I 2 C 总 线 停 止 条 件 。文 件 名 :stopi2c.cWriteI2CputcI2C功 能 : 向 I 2 C 总 线 器 件 写 一 个 字 节 。包 含 头 文 件 :原 型 :参 数 :i2c.hunsigned char WriteI2C(unsigned char data_out );data_out要 写 到 I 2 C 总 线 器 件 的 一 字 节 数 据 。说 明 : 该 函 数 向 I 2 C 总 线 器 件 写 一 字 节 数 据 。返 回 值 : 如 果 写 入 成 功 , 为 0 ;如 果 发 生 写 冲 突 , 则 为 -1。文 件 名 :代 码 示 例 :writei2c.cWriteI2C(‘a’);© 2004 Microchip Technology Inc. DS51297C_CN 第 27 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库2.4.2 电 可 擦 除 存 储 器 件 接 口 函 数 描 述EEAckPolling功 能 : 为 Microchip 的 电 可 擦 除 I 2 C 存 储 器 件 产 生 应 答 查 询 序 列 。包 含 头 文 件 :原 型 :参 数 :i2c.hunsigned char EEAckPolling(unsigned char control );controlEEPROM 控 制 / 总 线 器 件 的 地 址 选 择 字 节 。说 明 : 该 函 数 为 利 用 应 答 查 询 的 电 可 擦 除 I 2 C 存 储 器 件 产 生 应 答 查 询 序 列 。返 回 值 : 如 果 没 有 发 生 错 误 , 为 0 ;如 果 发 生 总 线 冲 突 错 误 , 为 -1 ;如 果 发 生 写 冲 突 错 误 , 则 为 -3。文 件 名 :i2ceeap.c代 码 示 例 :temp = EEAckPolling(0xA0);EEByteWrite功 能 : 向 I 2 C 总 线 写 一 个 字 节 。包 含 头 文 件 : i2c.h原 型 :unsigned char EEByteWrite(unsigned char control,unsigned char address,unsigned char data );参 数 :controlEEPROM 控 制 / 总 线 器 件 的 地 址 选 择 字 节 。addressEEPROM 的 内 部 地 址 单 元 。data要 写 到 EEPROM 中 函 数 地 址 参 数 所 指 定 地 址 的 数 据 。说 明 :该 函 数 把 一 字 节 数 据 写 到 I 2 C 总 线 , 也 适 用 于 仅 需 单 字 节 地 址 信 息 的 任何 Microchip I 2 C 电 可 擦 除 存 储 器 件 。返 回 值 : 如 果 没 有 发 生 任 何 错 误 , 为 0 ;如 果 发 生 总 线 冲 突 错 误 , 为 -1 ;如 果 发 生 无 应 答 错 误 , 为 -2 ;如 果 发 生 写 冲 突 错 误 , 则 为 -3 。文 件 名 :i2ceebw.c代 码 示 例 :temp = EEByteWrite(0xA0, 0x30, 0xA5);DS51297C_CN 第 28 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数EECurrentAddRead功 能 : 从 I 2 C 总 线 上 读 取 一 个 字 节 。包 含 头 文 件 :原 型 :参 数 :说 明 :i2c.hunsigned int EECurrentAddRead(unsigned char control );controlEEPROM 控 制 / 总 线 器 件 的 地 址 选 择 字 节 。该 函 数 从 I 2 C 总 线 上 读 取 一 个 字 节 。 要 读 取 的 数 据 位 于 I 2 C 电 可 擦 除 存储 器 件 中 当 前 指 针 所 指 向 的 地 址 。 存 储 器 件 包 含 一 个 地 址 计 数 器 , 它 保持 最 后 访 问 的 字 的 地 址 , 并 且 以 1 为 幅 度 递 增 。返 回 值 : 如 果 发 生 总 线 冲 突 错 误 , 为 -1 ;如 果 发 生 无 应 答 错 误 , 为 -2 ;如 果 发 生 写 冲 突 错 误 , 则 为 -3。另 外 , 该 函 数 返 回 的 结 果 为 无 符 号 的 16 位 数 据 。 因 为 缓 冲 区 本 身 只 有8 位 宽 , 这 就 意 味 着 最 高 有 效 字 节 为 0, 最 低 有 效 字 节 将 包 含 读 缓 冲 区的 内 容 。文 件 名 :i2ceecar.c代 码 示 例 :temp = EECurrentAddRead(0xA1);EEPageWrite功 能 : 从 I 2 C 总 线 写 一 个 数 据 串 到 电 可 擦 除 存 储 器 件 中 。包 含 头 文 件 : i2c.h原 型 :unsigned char EEPageWrite(unsigned char control,unsigned char address,unsigned char * wrptr );参 数 :controlEEPROM 控 制 / 总 线 器 件 的 地 址 选 择 字 节 。addressEEPROM 的 内 部 地 址 单 元 。wrptrPICmicro RAM 的 字 符 类 型 指 针 。 wrptr 指 向 的 数 据 对 象 将 会 被 写 到 电可 擦 除 存 储 器 件 。说 明 :该 函 数 把 一 个 以 空 字 符 终 止 的 数 据 串 写 到 I 2 C 电 可 擦 除 存 储 器 件 , 而 空字 符 本 身 不 会 被 传 送 。返 回 值 ; 如 果 没 有 发 生 错 误 , 为 0 ;如 果 发 生 总 线 冲 突 错 误 , 为 -1 ;如 果 发 生 无 应 答 错 误 , 为 -2 ;如 果 发 生 写 冲 突 错 误 , 则 为 -3 。文 件 名 :i2ceepw.c代 码 示 例 :temp = EEPageWrite(0xA0, 0x70, wrptr);© 2004 Microchip Technology Inc. DS51297C_CN 第 29 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库EERandomRead功 能 : 从 I 2 C 总 线 读 取 一 个 字 节 。包 含 头 文 件 :原 型 :参 数 :说 明 :返 回 值 :文 件 名 :代 码 示 例 :i2c.hunsigned int EERandomRead(unsigned char control,unsigned char address );controlEEPROM 控 制 / 总 线 器 件 的 地 址 选 择 字 节 。addressEEPROM 的 内 部 地 址 单 元 。该 函 数 从 I 2 C 总 线 上 读 取 一 个 字 节 , 也 适 用 于 仅 需 单 字 节 地 址 信 息 的Microchip I 2 C 电 可 擦 除 存 储 器 件 。返 回 值 由 两 部 分 构 成 : 一 部 分 为 在 最 低 有 效 字 节 中 读 的 值 , 另 一 部 分 为最 高 有 效 字 节 中 的 错 误 条 件 。 错 误 条 件 为 :如 果 发 生 总 线 冲 突 错 误 , 为 -1 ;如 果 发 生 无 应 答 错 误 , 为 -2 ;如 果 发 生 写 冲 突 错 误 , 则 为 -3。i2ceerr.cunsigned int temp;temp = EERandomRead(0xA0,0x30);EESequentialRead功 能 : 从 I 2 C 总 线 上 读 取 一 个 数 据 串 。包 含 头 文 件 : i2c.h原 型 :unsigned char EESequentialRead(unsigned char control,unsigned char address,unsigned char * rdptr,unsigned char length );参 数 :controlEEPROM 控 制 / 总 线 器 件 的 地 址 选 择 字 节 。addressEEPROM 的 内 部 地 址 单 元 。rdptr指 向 存 放 从 EEPROM 器 件 中 所 读 出 数 据 的 PICmicro RAM 区 的 字 符 型指 针 。length从 EEPROM 器 件 中 读 出 的 字 节 数 。说 明 :该 函 数 从 I 2 C 总 线 上 读 取 一 个 预 定 义 长 度 的 数 据 串 , 也 适 用 于 仅 需 单 字节 地 址 信 息 的 Microchip I 2 C 电 可 擦 除 存 储 器 件 。返 回 值 : 如 果 没 有 发 生 错 误 , 为 0 ;如 果 发 生 总 线 冲 突 错 误 , 为 -1 ;如 果 发 生 无 应 答 错 误 , 为 -2 ;如 果 发 生 写 冲 突 错 误 , 则 为 -3。文 件 名 :i2ceesr.c代 码 示 例 :unsigned char err;err = EESequentialRead(0xA0,0x70,rdptr,15);DS51297C_CN 第 30 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数2.4.3 使 用 示 例下 面 是 一 个 简 单 的 代 码 示 例 , 该 程 序 举 例 说 明 了 配 置 为 I 2 C 主 通 讯 的 SSP 模 块 , 及 其和 Microchip 24LC01B I 2 C 电 可 擦 除 存 储 器 之 间 的 I 2 C 通 讯 。#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 moduleSSPADD = 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);}© 2004 Microchip Technology Inc. DS51297C_CN 第 31 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库2.5 I/O 口 函 数下 列 函 数 支 持 PORTB。表 2-5:函 数I/O 口 函 数描 述ClosePORTB 禁 止 PORTB 的 中 断 和 内 部 上 拉 电 阻 。CloseRBxINT 禁 止 PORTB 引 脚 x 的 中 断 。DisablePullups 禁 止 PORTB 的 内 部 上 拉 电 阻 。EnablePullups 使 能 PORTB 的 内 部 上 拉 电 阻 。OpenPORTB 配 置 PORTB 的 中 断 和 内 部 上 拉 电 阻 。OpenRBxINT 使 能 PORTB 引 脚 x 的 中 断 。2.5.1 函 数 描 述ClosePORTB函 数 : 禁 止 PORTB 的 中 断 和 内 部 上 拉 电 阻 。包 含 头 文 件 : portb.h原 型 : void ClosePORTB( void );说 明 : 该 函 数 禁 止 PORTB 的 电 平 变 化 中 断 和 内 部 上 拉 电 阻 。文 件 名 :pbclose.cCloseRB0INTCloseRB1INTCloseRB2INT功 能 : 禁 止 PORTB 指 定 引 脚 的 中 断 。包 含 头 文 件 : portb.h原 型 : void CloseRB0INT( void );void CloseRB1INT( void );void CloseRB2INT( void );说 明 : 该 函 数 禁 止 PORTB 指 定 引 脚 的 电 平 变 化 中 断 。文 件 名 :rb0close.crb1close.crb2close.cDisablePullups功 能 : 禁 止 PORTB 的 内 部 上 拉 电 阻 。包 含 头 文 件 : portb.h原 型 : void DisablePullups( void );说 明 : 该 函 数 禁 止 PORTB 的 内 部 上 拉 电 阻 。文 件 名 :pulldis.cDS51297C_CN 第 32 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数EnablePullups功 能 : 使 能 PORTB 的 内 部 上 拉 电 阻 。包 含 头 文 件 : portb.h原 型 : void EnablePullups( void );说 明 : 该 函 数 使 能 PORTB 的 内 部 上 拉 电 阻 。文 件 名 :pullen.cOpenPORTB功 能 : 配 置 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);OpenRB0INTOpenRB1INTOpenRB2INT功 能 : 允 许 指 定 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 的 中 断 和 内 部 上 拉 电 阻 。© 2004 Microchip Technology Inc. DS51297C_CN 第 33 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库OpenRB0INTOpenRB1INTOpenRB2INT ( 续 )文 件 名 :代 码 示 例 :rb0open.crb1open.crb2open.cOpenRB0INT( PORTB_CHANGE_INT_ON &PORTB_CHANGE_INT_ON & RISING_EDGE_INT &PORTB_PULLUPS_ON);2.6 MICROWIRE ® 函 数下 列 函 数 支 持 Microwire 通 讯 :表 2-6:函 数MICROWIRE 函 数描 述CloseMwire 禁 止 用 于 Microwire 通 讯 的 SSP 模 块 。DataRdyMwire 表 明 是 否 完 成 内 部 写 循 环 。getcMwire 从 Microwire 器 件 读 取 一 个 字 节 。getsMwire 从 Microwire 器 件 读 取 一 个 数 据 串 。OpenMwire 配 置 用 于 Microwire 通 讯 的 SSP 模 块 。putcMwire 写 一 个 字 节 到 Microwire 器 件 。ReadMwire 从 Microwire 器 件 读 取 一 个 字 节 。WriteMwire 写 一 个 字 节 到 Microwire 器 件 。2.6.1 函 数 描 述CloseMwire功 能 : 禁 止 SSP 模 块 。包 含 头 文 件 : mwire.h原 型 : void CloseMwire( void );说 明 :相 关 引 脚 恢 复 为 普 通 I/O 口 功 能 。 由 TRISC 和 LATC 负 责 实 现 I/O 控制 。文 件 名 :closmwir.cDataRdyMwire功 能 : 表 明 Microwire 器 件 是 否 已 经 完 成 内 部 写 循 环 。包 含 头 文 件 : mwire.h原 型 : unsigned char DataRdyMwire( void );说 明 : 确 定 Microwire 器 件 是 否 已 准 备 就 绪 。返 回 值 : 如 果 Microwire 器 件 已 经 就 绪 , 为 1 ;如 果 内 部 写 循 环 尚 未 完 成 或 者 发 生 总 线 错 误 , 则 为 0。文 件 名 :drdymwir.c代 码 示 例 :while (!DataRdyMwire());DS51297C_CN 第 34 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数getcMwire参 见 ReadMwire。getsMwire功 能 : 从 Microwire 器 件 读 取 一 个 数 据 串 。包 含 头 文 件 : mwire.h原 型 :void getsMwire( unsigned char * rdptr,unsigned char length);参 数 :rdptr指 向 存 放 从 Microwire 器 件 所 读 取 数 据 的 PICmicro RAM 的 指 针 。length从 Microwire 器 件 读 取 的 字 节 数 。说 明 :该 函 数 用 于 从 Microwire 器 件 读 取 一 个 预 定 义 长 度 的 数 据 串 。 在 使 用 此函 数 前 , 必 须 向 正 确 的 地 址 发 出 一 个 读 命 令 。文 件 名 :getsmwir.c代 码 示 例 :unsigned char arryrd[LENGTH];putcMwire(READ);putcMwire(address);getsMwire(arrayrd, LENGTH);OpenMwire功 能 : 配 置 SSP 模 块 。包 含 头 文 件 : mwire.h原 型 :void OpenMwire(unsigned char sync_mode );参 数 :sync_mode在 mwire.h 中 定 义 的 下 列 值 之 一 :MWIRE_FOSC_4clock = FOSC/4MWIRE_FOSC_16clock = FOSC/16MWIRE_FOSC_64clock = FOSC/64MWIRE_FOSC_TMR2clock = TMR2 output/2说 明 :OpenMwire 函 数 把 SSP 模 块 复 位 到 POR 状 态 , 然 后 为 Microwire 通 讯 配置 该 模 块 。文 件 名 :openmwir.c代 码 示 例 :OpenMwire(MWIRE_FOSC_16);putcMwire参 见 WriteMwire。© 2004 Microchip Technology Inc. DS51297C_CN 第 35 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库ReadMwiregetcMwire功 能 : 从 Microwire 器 件 读 取 一 个 字 节 。包 含 头 文 件 : mwire.h原 型 :unsigned char ReadMwire(unsigned char high_byte,unsigned char low_byte );参 数 :high_byte16 位 指 令 字 的 第 一 个 字 节 。low_byte16 位 指 令 字 的 第 二 个 字 节 。说 明 :该 函 数 从 Microwire 器 件 读 取 一 个 字 节 。 启 动 位 、 操 作 码 和 地 址 组 成 传递 给 此 函 数 的 高 字 节 和 低 字 节 。返 回 值 : 返 回 值 是 从 Microwire 器 件 读 取 的 单 字 节 数 据 。文 件 名 :readmwir.c代 码 示 例 :ReadMwire(0x03, 0x00);WriteMwireputcMwire功 能 : 该 函 数 用 于 写 一 字 节 ( 一 个 字 符 ) 数 据 到 Microwire 器 件 。包 含 头 文 件 : mwire.h原 型 :unsigned char WriteMwire(unsigned char data_out );参 数 :data_out要 写 到 Microwire 器 件 的 单 字 节 数 据 。说 明 : 该 函 数 利 用 SSP 模 块 将 一 字 节 数 据 写 到 Microwire 器 件 。返 回 值 : 如 果 写 入 成 功 , 为 0 ;如 果 发 生 写 冲 突 , 则 为 -1。文 件 名 :writmwir.c代 码 示 例 :WriteMwire(0x55);DS51297C_CN 第 36 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数2.6.2 使 用 示 例下 面 是 一 个 简 单 的 代 码 示 例 , 举 例 说 明 了 SSP 模 块 与 Microchip 93LC66 Microwire 电可 擦 除 存 储 器 之 间 的 通 讯 。#include "p18cxxx.h"#include "mwire.h"// 93LC66 x 8// FUNCTION Prototypesvoid 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 Definitionsunsigned 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.LATC2void main(void){TRISCbits.TRISC2 = 0;W_CS = 0;//ensure CS is negatedOpenMwire(MWIRE_FOSC_16); //enable SSP peripheralew_enable();//send erase/write enablewrite_byte(0x13, 0x34); //write byte (address, data)busy_poll();Nop();byte_read(0x13); //read single byte (address)read_mult(0x10, arrayrd, 10); //read multiple byteserase_all();//erase entire arrayCloseMwire();//disable SSP peripheral}© 2004 Microchip Technology Inc. DS51297C_CN 第 37 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库void ew_enable(void){W_CS = 1;//assert chip selectputcMwire(EWEN1); //enable write command byte 1putcMwire(EWEN2); //enable write command byte 2W_CS = 0;//negate chip select}void busy_poll(void){W_CS = 1;while(! DataRdyMwire() );W_CS = 0;}void write_byte(unsigned char address,unsigned char data){W_CS = 1;putcMwire(WRITE); //write commandputcMwire(address); //addressputcMwire(data); //write single byteW_CS = 0;}void byte_read(unsigned char address){W_CS = 1;getcMwire(READ,address); //read one byteW_CS = 0;}void read_mult(unsigned char address,unsigned char *rdptr,unsigned char length){W_CS = 1;putcMwire(READ);//read commandputcMwire(address); //address (A7 - A0)getsMwire(rdptr, length); //read multiple bytesW_CS = 0;}void erase_all(void){W_CS = 1;putcMwire(ERAL1); //erase all command byte 1putcMwire(ERAL2); //erase all command byte 2W_CS = 0;}DS51297C_CN 第 38 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数2.7 脉 宽 调 制 函 数下 列 函 数 支 持 PWM 外 设 :表 2-7:函 数PWM 函 数描 述ClosePWMx 禁 止 PWM 通 道 x。OpenPWMx 配 置 PWM 通 道 x。SetDCPWMx 向 PWM 通 道 x 写 入 一 个 新 的 占 空 比 值 。SetOutputPWMx 设 置 ECCP x 的 PWM 输 出 配 置 位 。CloseEPWMx (1) 禁 止 增 强 型 PWM 通 道 x。OpenEPWMx (1) 配 置 增 强 型 PWM 通 道 x。SetDCEPWMx (1) 写 一 个 新 的 占 空 比 值 到 增 强 型 PWM 通 道 x。SetOutputEPWMx (1) 设 置 ECCP x 的 增 强 型 PWM 输 出 配 置 位 。注 1: 增 强 型 PWM 函 数 仅 可 用 于 带 有 ECCPxCON 寄 存 器 的 器 件 。2.7.1 函 数 描 述ClosePWM1ClosePWM2CloseEPWM1功 能 : 禁 止 PWM 通 道 。包 含 :pwm.h原 型 : void ClosePWM1( void );void ClosePWM2( void );void CloseEPWM1( void );说 明 : 该 函 数 禁 止 指 定 的 PWM 通 道 。文 件 名 :pw1close.cpw2close.cew1close.cOpenPWM1OpenPWM2OpenEPWM1功 能 : 配 置 PWM 通 道 。包 含 :pwm.h原 型 : void OpenPWM1( char period );void OpenPWM2( char period );void OpenEPWM1( char period );参 数 :period可 以 是 0x00 到 0xff 之 间 的 任 何 值 , 通 过 使 用 下 面 的 公 式 , 这 个 值 可 确定 PWM 频 率 :PWM 周 期 =[(period ) + 1] x 4 x TOSC x TMR2 预 分 频 比© 2004 Microchip Technology Inc. DS51297C_CN 第 39 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库OpenPWM1OpenPWM2OpenEPWM1 ( 续 )说 明 :文 件 名 :代 码 示 例 :该 函 数 配 置 指 定 PWM 通 道 的 周 期 和 时 基 。 PWM 只 使 用 Timer2。在 PWM 工 作 之 前 , 除 了 要 配 置 PWM 通 道 外 , 还 要 用OpenTimer2(...) 语 句 配 置 Timer2 。pw1open.cpw2open.cew1open.cOpenPWM1(0xff);SetDCPWM1SetDCPWM2SetDCEPWM1功 能 : 向 指 定 PWM 通 道 的 占 空 比 寄 存 器 写 入 新 的 占 空 比 值 。包 含 头 文 件 : pwm.h原 型 : void SetDCPWM1( unsigned int dutycycle );void SetDCPWM2( unsigned int dutycycle );void SetDCEPWM1( unsigned int dutycycle );参 数 :dutycycledutycycle 的 值 可 以 是 任 何 一 个 10 位 数 。 只 有 dutycycle 的 低 10 位 写 入 到占 空 比 寄 存 器 。 占 空 比 , 或 者 更 具 体 地 说 是 PWM 波 形 的 高 电 平 时 间 ,可 以 通 过 下 面 的 公 式 计 算 出 来 :PWM x 占 空 比 = (DCx) x TOSC其 中 , DCx 是 调 用 该 函 数 时 指 定 的 10 位 值 。说 明 : 该 函 数 向 指 定 PWM 通 道 的 占 空 比 寄 存 器 写 入 新 的 占 空 比 值 。PWM 波 形 的 最 大 分 辨 率 可 以 使 用 下 面 的 公 式 、 通 过 周 期 计 算 出 来 :分 辨 率 ( 位 )= log(FOSC/Fpwm) / log(2)文 件 名 :pw1setdc.cpw2setdc.cew1setdc.c代 码 示 例 :SetDCPWM1(0);DS51297C_CN 第 40 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数SetOutputPWM1SetOutputEPWM1功 能 : 设 置 ECCP 的 PWM 输 出 配 置 位 。包 含 头 文 件 : pwm.h原 型 :void SetOutputPWM1 (unsigned charoutputconfig, unsigned char outputmode);void SetOutputEPWM1 (unsigned charoutputconfig, unsigned char outputmode);参 数 :outputconfigoutputconfig 的 值 可 以 是 下 列 值 ( 在 pwm.h 中 定 义 ) 之 一 :SINGLE_OUT单 端 输 出FULL_OUT_FWD全 桥 正 向 输 出HALF_OUT半 桥 输 出FULL_OUT_REV全 桥 反 向 输 出outputmodeoutputmode 的 值 可 以 是 下 列 值 ( 在 pwm.h 中 定 义 ) 之 一 :PWM_MODE_1P1A 和 P1C 高 电 平 有 效P1B 和 P1D 高 电 平 有 效PWM_MODE_2P1A 和 P1C 高 电 平 有 效P1B 和 P1D 低 电 平 有 效PWM_MODE_3P1A 和 P1C 低 电 平 有 效P1B 和 P1D 高 电 平 有 效PWM_MODE_4P1A 和 P1C 低 电 平 有 效P1B 和 P1D 低 电 平 有 效说 明 : 仅 适 用 于 带 扩 展 型 或 增 强 型 CCP (ECCP) 的 器 件 。文 件 名 :pw1setoc.cew1setoc.c代 码 示 例 :SetOutputPWM1 (SINGLE_OUT, PWM_MODE_1);© 2004 Microchip Technology Inc. DS51297C_CN 第 41 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库2.8 SPI 函 数下 列 函 数 支 持 SPI 通 讯 :表 2-8:函 数SPI 函 数描 述CloseSPI 禁 止 用 于 SPI 通 讯 的 SSP 模 块 。DataRdySPI 确 定 SPI 缓 冲 区 中 是 否 有 新 值 。getcSPI 从 SPI 总 线 上 读 取 一 个 字 节 。getsSPI 从 SPI 总 线 上 读 取 一 个 数 据 串 。OpenSPI 初 始 化 用 于 SPI 通 讯 的 SSP 模 块 。putcSPI 向 SPI 总 线 写 入 一 个 字 节 。putsSPI 向 SPI 总 线 写 入 一 个 数 据 串 。ReadSPI 从 SPI 总 线 上 读 取 一 个 字 节 。WriteSPI 向 SPI 总 线 写 入 一 个 字 节 。2.8.1 函 数 描 述CloseSPI功 能 : 禁 止 SSP 模 块 。包 含 头 文 件 : spi.h原 型 : void CloseSPI( void );说 明 :该 函 数 禁 止 SSP 模 块 。 相 关 引 脚 恢 复 为 普 通 I/O 口 功 能 。 由 TRISC 和LATC 负 责 实 现 I/O 控 制 。文 件 名 :closespi.cDataRdySPI功 能 : 确 定 SSPBUF 中 是 否 有 数 据 。包 含 头 文 件 : spi.h原 型 : unsigned char DataRdySPI( void );说 明 : 该 函 数 确 定 SSPBUF 寄 存 器 中 是 否 有 数 据 字 节 可 读 。返 回 值 : 如 果 SSPBUF 寄 存 器 中 没 有 数 据 , 为 0 ;如 果 SSPBUF 寄 存 器 中 有 数 据 , 则 为 1。文 件 名 :代 码 示 例 :dtrdyspi.cwhile (!DataRdySPI());getcSPI参 见 ReadSPI。DS51297C_CN 第 42 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数getsSPI功 能 : 从 SPI 总 线 读 取 一 个 数 据 串 。包 含 头 文 件 : spi.h原 型 :void getsSPI( unsigned char *rdptr,unsigned char length );参 数 :rdptr指 向 存 放 从 SPI 器 件 中 读 取 数 据 的 地 址 的 指 针 。length要 从 SPI 器 件 中 读 取 数 据 的 字 节 数 。说 明 : 该 函 数 从 SPI 总 线 读 取 一 个 预 定 义 长 度 的 数 据 串 。文 件 名 :getsspi.c代 码 示 例 :unsigned char wrptr(10);getsSPI(wrptr, 10);OpenSPI功 能 : 初 始 化 SSP 模 块 。包 含 头 文 件 : spi.h原 型 :void OpenSPI( unsigned char sync_mode,unsigned char bus_mode,unsigned char smp_phase);参 数 :sync_mode取 下 列 值 之 一 , 在 spi.h 中 定 义 :SPI_FOSC_4 SPI 主 模 式 , clock = FOSC/4SPI_FOSC_16 SPI 主 模 式 , clock = FOSC/16SPI_FOSC_64 SPI 主 模 式 , clock = FOSC/64SPI_FOSC_TMR2 SPI 主 模 式 , clock = TMR2 输 出 /2SLV_SSONSPI 从 模 式 , 使 能 /SS 引 脚 控 制SLV_SSOFFSPI 从 模 式 , 禁 止 /SS 引 脚 控 制bus_mode取 下 列 值 之 一 , 在 spi.h 中 定 义 :MODE_00 设 置 SPI 总 线 为 模 式 0,0MODE_01 设 置 SPI 总 线 为 模 式 0,1MODE_10 设 置 SPI 总 线 为 模 式 1,0MODE_11 设 置 SPI 总 线 为 模 式 1,1smp_phase取 下 列 值 之 一 , 在 spi.h 中 定 义 :SMPEND在 输 出 数 据 的 末 端 进 行 输 入 数 据 采 样SMPMID在 输 出 数 据 的 中 间 进 行 输 入 数 据 采 样说 明 : 该 函 数 设 置 供 SPI 总 线 器 件 使 用 的 SSP 模 块 。文 件 名 :openspi.c代 码 示 例 :OpenSPI(SPI_FOSC_16, MODE_00, SMPEND);putcSPI参 见 WriteSPI。© 2004 Microchip Technology Inc. DS51297C_CN 第 43 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库putsSPI功 能 : 向 SPI 总 线 写 一 个 数 据 串 。包 含 头 文 件 : spi.h原 型 : void putsSPI( unsigned char *wrptr );参 数 :wrptr指 向 要 写 到 SPI 总 线 的 值 的 指 针 。说 明 :文 件 名 :代 码 示 例 :该 函 数 向 SPI 总 线 器 件 写 一 个 数 据 串 。 当 在 数 据 串 中 读 到 一 个 空 字 符 时函 数 终 止 ( 空 字 符 不 会 写 到 总 线 )。putsspi.cunsigned char wrptr[] = “Hello!”;putsSPI(wrptr);ReadSPIgetcSPI功 能 : 从 SPI 总 线 上 读 取 一 个 字 节 。包 含 头 文 件 : spi.h原 型 : unsigned char ReadSPI( void );说 明 : 该 函 数 启 动 一 个 SPI 总 线 周 期 , 来 采 集 一 字 节 数 据 。返 回 值 : 该 函 数 返 回 在 SPI 读 周 期 内 读 取 的 一 字 节 数 据 。文 件 名 :readspi.c代 码 示 例 : char x;x = ReadSPI();WriteSPIputcSPI功 能 : 向 SPI 总 线 写 一 个 字 节 。包 含 头 文 件 :原 型 :参 数 :spi.hunsigned char WriteSPI(unsigned char data_out );data_out要 写 到 SPI 总 线 的 值 。说 明 : 该 函 数 写 一 个 字 节 的 数 据 , 然 后 检 查 是 否 有 写 冲 突 。返 回 值 : 如 果 没 有 发 生 写 冲 突 , 为 0 ;如 果 发 生 写 冲 突 , 则 为 -1。文 件 名 :代 码 示 例 :writespi.cWriteSPI(‘a’);DS51297C_CN 第 44 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数2.8.2 使 用 示 例下 面 的 例 子 说 明 了 如 何 使 用 SSP 模 块 与 Microchip 的 25C080 SPI 电 可 擦 除 存 储 器 进行 通 讯 。#include #include // FUNCTION Prototypesvoid 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 Definitionsunsigned char arraywr[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,0};//25C040/080/160 page write sizeunsigned 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 resetOpenSPI(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();© 2004 Microchip Technology Inc. DS51297C_CN 第 45 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库}CloseSPI();while(1);void set_wren(void){SPI_CS = 0;//assert chip selectvar = putcSPI(SPI_WREN); //send write enable commandSPI_CS = 1;//negate chip select}void page_write (unsigned char addhigh,unsigned char addlow,unsigned char *wrptr){SPI_CS = 0;//assert chip selectvar = putcSPI(SPI_WRITE); //send write commandvar = putcSPI(addhigh); //send high byte of addressvar = putcSPI(addlow); //send low byte of addressputsSPI(wrptr);//send data byteSPI_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 selectvar = putcSPI(SPI_READ); //send read commandvar = putcSPI(addhigh); //send high byte of addressvar = putcSPI(addlow); //send low byte of addressgetsSPI(rdptr, count); //read multiple bytesSPI_CS = 1;}void byte_write (unsigned char addhigh,unsigned char addlow,unsigned char data){SPI_CS = 0;//assert chip selectvar = putcSPI(SPI_WRITE); //send write commandvar = putcSPI(addhigh); //send high byte of addressvar = putcSPI(addlow); //send low byte of addressvar = putcSPI(data); //send data byteSPI_CS = 1;//negate chip select}unsigned char byte_read (unsigned char addhigh,unsigned char addlow){SPI_CS = 0;//assert chip selectvar = putcSPI(SPI_READ); //send read commandvar = putcSPI(addhigh); //send high byte of addressvar = putcSPI(addlow); //send low byte of addressvar = getcSPI();//read single byteSPI_CS = 1;return (var);}DS51297C_CN 第 46 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数unsigned char status_read (void){SPI_CS = 0;//assert chip selectvar = putcSPI(SPI_RDSR); //send read status commandvar = getcSPI();//read data byteSPI_CS = 1;//negate chip selectreturn (var);}void status_write (unsigned char data){SPI_CS = 0;var = putcSPI(SPI_WRSR); //write status commandvar = putcSPI(data); //status byte to writeSPI_CS = 1;//negate chip select}void busy_polling (void){do{SPI_CS = 0;//assert chip selectvar = putcSPI(SPI_RDSR); //send read status commandvar = getcSPI();//read data byteSPI_CS = 1;//negate chip select} while (var & 0x01); //stay in loop until !busy}© 2004 Microchip Technology Inc. DS51297C_CN 第 47 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库2.9 定 时 器 函 数下 列 函 数 支 持 定 时 器 外 设 :表 2-9: 定 时 器 函 数函 数CloseTimerx 禁 止 定 时 器 x。OpenTimerx 配 置 定 时 器 x。ReadTimerx 读 取 定 时 器 x 的 值 。WriteTimerx 向 定 时 器 x 写 入 一 个 值 。描 述2.9.1 函 数 描 述CloseTimer0CloseTimer1CloseTimer2CloseTimer3CloseTimer4功 能 : 禁 止 指 定 的 定 时 器 。包 含 头 文 件 : timers.h原 型 : void CloseTimer0( void );void CloseTimer1( void );void CloseTimer2( void );void CloseTimer3( void );void CloseTimer4( void );说 明 : 该 函 数 禁 止 中 断 和 指 定 的 定 时 器 。文 件 名 :t0close.ct1close.ct2close.ct3close.ct4close.cOpenTimer0功 能 :配 置 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 外 部 时 钟 上 升 沿DS51297C_CN 第 48 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数OpenTimer0 ( 续 )预 分 频 值 :T0_PS_1_1 1:1 预 分 频T0_PS_1_2 1:2 预 分 频T0_PS_1_4 1:4 预 分 频T0_PS_1_8 1:8 预 分 频T0_PS_1_16 1:16 预 分 频T0_PS_1_32 1:32 预 分 频T0_PS_1_64 1:64 预 分 频T0_PS_1_128 1:128 预 分 频T0_PS_1_256 1:256 预 分 频说 明 : 该 函 数 按 照 指 定 的 选 项 配 置 timer0 。文 件 名 :t0open.c代 码 示 例 :OpenTimer0( TIMER_INT_OFF &T0_8BIT &T0_SOURCE_INT &T0_PS_1_32 );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 不 同 步 外 部 时 钟 输 入说 明 :该 函 数 按 照 指 定 的 选 项 配 置 timer1。© 2004 Microchip Technology Inc. DS51297C_CN 第 49 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库OpenTimer1 ( 续 )文 件 名 :t1open.c代 码 示 例 : OpenTimer1( TIMER_INT_ON &T1_8BIT_RW &T1_SOURCE_EXT &T1_PS_1_1 &T1_OSC1EN_OFF &T1_SYNC_EXT_OFF &T1_SOURCE_CCP );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 后 分 频说 明 :该 函 数 按 照 指 定 的 选 项 配 置 timer2。文 件 名 :t2open.c代 码 示 例 :OpenTimer2( TIMER_INT_OFF &T2_PS_1_1 &T2_POST_1_8 );DS51297C_CN 第 50 页© 2004 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 8 位 模 式T3_16BIT_RW 16 位 模 式时 钟 源 :T3_SOURCE_EXT 外 部 时 钟 源 (I/O 引 脚 )T3_SOURCE_INT 内 部 时 钟 源 (TOSC)预 分 频 值 :T3_PS_1_1 1:1 预 分 频T3_PS_1_2 1:2 预 分 频T3_PS_1_4 1:4 预 分 频T3_PS_1_8 1:8 预 分 频同 步 时 钟 输 入 :T3_SYNC_EXT_ON 同 步 外 部 时 钟 输 入T3_SYNC_EXT_OFF 不 同 步 外 部 时 钟 输 入供 CCP 使 用 :T1_SOURCE_CCP Timer1 作 为 两 个 CCP 的 时 钟 源T3_SOURCE_CCP Timer3 作 为 两 个 CCP 的 时 钟 源T1_CCP1_T3_CCP2 Timer1 作 为 CCP1 的 时 钟 源 ,Timer3 作 为 CCP2 的 时 钟 源说 明 :该 函 数 按 照 指 定 的 选 项 配 置 timer3。文 件 名 :t3open.c代 码 示 例 : OpenTimer3( TIMER_INT_ON &T3_8BIT_RW &T3_SOURCE_EXT &T3_PS_1_1 &T3_OSC1EN_OFF &T3_SYNC_EXT_OFF &T3_SOURCE_CCP );© 2004 Microchip Technology Inc. DS51297C_CN 第 51 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库OpenTimer4功 能 :配 置 timer4。包 含 头 文 件 : timers.h原 型 : void OpenTimer4( unsigned char config );参 数 :config从 下 面 所 列 出 各 类 型 中 分 别 取 一 个 值 并 相 与 (‘&’) 所 得 的 值 。 这 些 值 在文 件 timers.h 中 定 义 。允 许 Timer4 中 断 :TIMER_INT_ON 允 许 中 断TIMER_INT_OFF 禁 止 中 断预 分 频 值 :T4_PS_1_1 1:1 预 分 频T4_PS_1_4 1:4 预 分 频T4_PS_1_16 1:16 预 分 频后 分 频 值 :T4_POST_1_1 1:1 后 分 频T4_POST_1_2 1:2 后 分 频: :T4_POST_1_15 1:15 后 分 频T4_POST_1_16 1:16 后 分 频说 明 :该 函 数 按 照 指 定 的 选 项 配 置 timer4。文 件 名 :t4open.c代 码 示 例 :OpenTimer4( TIMER_INT_OFF &T4_PS_1_1 &T4_POST_1_8 );DS51297C_CN 第 52 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数ReadTimer0ReadTimer1ReadTimer2ReadTimer3ReadTimer4功 能 : 读 取 指 定 定 时 器 的 值 。包 含 头 文 件 : timers.h原 型 : unsigned int ReadTimer0( void );unsigned int ReadTimer1( void );unsigned char ReadTimer2( void );unsigned int ReadTimer3( void );unsigned char ReadTimer4( void );说 明 : 这 些 函 数 读 取 各 个 定 时 器 寄 存 器 的 值 。Timer0: TMR0L,TMR0HTimer1: TMR1L,TMR1HTimer2: TMR2Timer3: TMR3L,TMR3HTimer4: 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.ct1read.ct2read.ct3read.ct4read.c© 2004 Microchip Technology Inc. DS51297C_CN 第 53 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库WriteTimer0WriteTimer1WriteTimer2WriteTimer3WriteTimer4功 能 : 向 指 定 的 定 时 器 写 入 一 个 值 。包 含 头 文 件 : timers.h原 型 : void WriteTimer0( unsigned int timer );void WriteTimer1( unsigned int timer );void WriteTimer2( unsigned char timer );void WriteTimer3( unsigned int timer );void WriteTimer4( unsigned char timer );参 数 :timer将 加 载 到 指 定 定 时 器 的 值 。说 明 : 这 些 函 数 将 值 写 入 到 相 应 的 定 时 器 寄 存 器 :Timer0: TMR0L,TMR0HTimer1: TMR1L,TMR1HTimer2: TMR2Timer3: TMR3L,TMR3HTimer4: TMR4文 件 名 :t0read.ct1read.ct2read.ct3read.ct4read.c代 码 示 例 : WriteTimer0( 10000 );DS51297C_CN 第 54 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数2.9.2 使 用 示 例#include #include #include #include void main( void ){int result;char str[7];// configure timer0OpenTimer0( TIMER_INT_OFF &T0_SOURCE_INT &T0_PS_1_32 );// configure USARTOpenUSART( 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 highresult = ReadTimer0(); // read timerif( result > 0xc000 ) // exit loop if valuebreak; // is out of range}WriteTimer0( 0 );ultoa( result, str );putsUSART( str );// restart timer// convert timer to string// print stringCloseTimer0();CloseUSART();}// close modules© 2004 Microchip Technology Inc. DS51297C_CN 第 55 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库2.10 USART 函 数下 列 子 程 序 支 持 带 有 单 个 USART 外 设 的 器 件 :表 2-10: 单 个 USART 外 设 函 数函 数描 述BusyUSART USART 是 否 正 在 发 送 ?CloseUSART禁 止 USART。DataRdyUSART USART 读 缓 冲 区 中 是 否 有 数 据 ?getcUSART 从 USART 读 取 一 个 字 节 。getsUSART 从 USART 上 读 取 一 个 数 据 串 。OpenUSART配 置 USART。putcUSART 向 USART 写 入 一 个 字 节 。putsUSART把 数 据 存 储 器 中 的 字 符 串 写 到 USART。putrsUSART把 程 序 存 储 器 中 的 字 符 串 写 到 USART。ReadUSART 从 USART 上 读 取 一 个 字 节 。WriteUSART写 一 个 字 节 到 USART。baudUSART 设 置 增 强 型 USART 的 波 特 率 配 置 位 。下 列 子 程 序 支 持 带 有 多 个 USART 外 设 的 器 件 :表 2-11: 多 个 USART 外 设 函 数函 数描 述BusyxUSART USART x 是 否 正 在 发 送 ?ClosexUSART 禁 止 USART x。DataRdyxUSART USART x 读 缓 冲 区 中 是 否 有 数 据 ?getcxUSART 从 USART x 读 取 一 个 字 节 。getsxUSART 从 USART x 读 取 一 个 字 符 串 。OpenxUSART 配 置 USART x。putcxUSART 向 USART x 写 入 一 个 字 节 。putsxUSART 把 数 据 存 储 器 中 的 字 符 串 写 到 USART x。putrsxUSART 把 程 序 存 储 器 中 的 字 符 串 写 到 USART x。ReadxUSART 从 USART x 读 取 一 个 字 节 。WritexUSART 写 一 个 字 节 到 USART x。baudxUSART 设 置 增 强 型 USART x 的 波 特 率 配 置 位 。DS51297C_CN 第 56 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数2.10.1 函 数 描 述BusyUSARTBusy1USARTBusy2USART功 能 : USART 是 否 正 在 发 送 ?包 含 头 文 件 : usart.h原 型 : char BusyUSART( void );char Busy1USART( void );char Busy2USART( void );说 明 :返 回 值 表 明 USART 发 送 器 现 在 是 否 正 忙 。 应 该 在 开 始 新 的 发 送 之 前 使用 该 函 数 。当 器 件 仅 有 一 个 USART 外 设 时 使 用 BusyUSART , 而 当 器 件 有 多 个USART 外 设 时 , 使 用 Busy1USART 和 Busy2USART。返 回 值 : 如 果 USART 发 送 器 空 闲 , 为 0 ;如 果 USART 发 送 器 正 在 使 用 , 则 为 1。文 件 名 :ubusy.cu1busy.cu2busy.c代 码 示 例 :while (BusyUSART());CloseUSARTClose1USARTClose2USART功 能 :禁 止 指 定 的 USART。包 含 头 文 件 : usart.h原 型 : void CloseUSART( void );void Close1USART( void );void Close2USART( void );说 明 : 该 函 数 禁 止 指 定 USART 的 中 断 、 发 送 器 和 接 收 器 。当 器 件 仅 有 一 个 USART 外 设 时 使 用 CloseUSART , 而 当 器 件 有 多 个USART 外 设 时 , 使 用 Close1USART 和 Close2USART。文 件 名 :uclose.cu1close.cu2close.c© 2004 Microchip Technology Inc. DS51297C_CN 第 57 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库DataRdyUSARTDataRdy1USARTDataRdy2USART功 能 : 读 缓 冲 区 中 是 否 有 数 据 ?包 含 头 文 件 : usart.h原 型 : char DataRdyUSART( void );char DataRdy1USART( void );char DataRdy2USART( void );说 明 : 该 函 数 返 回 PIR 寄 存 器 中 RCI 标 志 位 的 状 态 。当 器 件 仅 有 一 个 USART 外 设 时 使 用 DataRdyUSART , 而 当 器 件 有 多个 USART 外 设 时 , 使 用 DataRdy1USART 和 DataRdy2USART。返 回 值 : 如 果 有 数 据 , 为 1 ;如 果 没 有 数 据 , 则 为 0 。文 件 名 :代 码 示 例 :udrdy.cu1drdy.cu2drdy.cwhile (!DataRdyUSART());getcUSARTgetc1USARTgetc2USART参 见 ReadUSART。getsUSARTgets1USARTgets2USART功 能 : 从 指 定 的 USART 中 读 取 一 个 固 定 长 度 的 字 符 串 。包 含 头 文 件 :原 型 :参 数 :说 明 :文 件 名 :代 码 示 例 :usart.hvoid getsUSART ( char * buffer,unsigned char len );void gets1USART ( char * buffer,unsigned char len );void gets2USART ( char * buffer,unsigned char len );buffer指 向 存 储 读 取 字 符 的 地 址 的 指 针 。len要 从 USART 读 取 的 字 符 数 。该 函 数 将 等 待 到 从 指 定 USART 中 读 出 len 个 字 符 为 止 。 当 等 待 字 符 到达 时 , 不 会 出 现 超 时 。当 器 件 仅 有 一 个 USART 外 设 时 使 用 getsUSART, 而 当 器 件 有 多 个USART 外 设 时 , 使 用 gets1USART 和 gets2USART。ugets.cu1gets.cu2gets.cchar inputstr[10];getsUSART( inputstr, 5 );DS51297C_CN 第 58 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数OpenUSARTOpen1USARTOpen2USART功 能 : 配 置 指 定 的 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.cu1open.cu2open.c© 2004 Microchip Technology Inc. DS51297C_CN 第 59 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库OpenUSARTOpen1USARTOpen2USART ( 续 )代 码 示 例 :OpenUSART1( USART_TX_INT_OFF &USART_RX_INT_OFF &USART_ASYNCH_MODE &USART_EIGHT_BIT &USART_CONT_RX &USART_BRGH_HIGH,25 );putcUSARTputc1USARTputc2USART参 见 WriteUSART。putsUSARTputs1USARTputs2USARTputrsUSARTputrs1USARTputrs2USART功 能 : 向 USART 写 入 一 个 包 含 空 字 符 的 字 符 串 。包 含 头 文 件 : usart.h原 型 : void putsUSART( char *data );void puts1USART( char *data );void puts2USART( char *data );void putrsUSART( const rom char *data );void putrs1USART( const rom char *data );void putrs2USART( const rom char *data );参 数 :data指 向 以 空 字 符 结 尾 的 数 据 串 的 指 针 。说 明 : 该 函 数 向 USART 写 入 一 个 包 含 空 字 符 的 字 符 串 。对 于 位 于 数 据 存 储 器 中 的 字 符 串 , 应 该 使 用 这 些 函 数 的 “puts” 形 式 。对 于 位 于 程 序 存 储 器 中 的 字 符 串 , 其 中 包 括 字 符 串 常 量 , 应 该 使 用 这 些函 数 的 “putrs” 形 式 。当 器 件 仅 有 一 个 USART 外 设 时 使 用 putsUSART 和 putrsUSART, 而当 器 件 有 多 个 USART 外 设 时 , 使 用 其 它 函 数 。文 件 名 :uputs.cu1puts.cu2puts.cuputrs.cu1putrs.cu2putrs.c代 码 示 例 : putrsUSART( “Hello World!” );DS51297C_CN 第 60 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数ReadUSARTRead1USARTRead2USARTgetcUSARTgetc1USARTgetc2USART函 数 :从 USART 接 收 缓 冲 区 读 取 一 个 字 节 ( 一 个 字 符 ), 包 括 第 9 位 ( 如 果使 能 了 9 位 模 式 的 话 )。包 含 头 文 件 : usart.h原 型 : char getcUSART( void );char getc1USART( void );char getc2USART( void );char ReadUSART( void );char Read1USART( void );char Read2USART( 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.cu1read.cu2read.cint result;result = ReadUSART();result |= (unsigned int)USART_Status.RX_NINE


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库WriteUSARTWrite1USARTWrite2USARTputcUSARTputc1USARTputc2USART函 数 :写 一 个 字 节 ( 一 个 字 符 ) 到 USART 发 送 缓 冲 区 , 包 括 第 9 位 ( 如 果使 能 了 9 位 模 式 的 话 )。包 含 头 文 件 : usart.h原 型 : void putcUSART( char data );void putc1USART( char data );void putc2USART( char data );void WriteUSART( char data );void Write1USART( char data );void Write2USART( 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 和 Write-USART 函 数 , Status 寄 存 器 名 为 USART_Status, 其 类 型 为 上 述 的USART 联 合 。对 于 带 有 多 个 USART 外 设 的 器 件 , 应 该 使 用 putcxUSART 和WritexUSART 函 数 , Status 寄 存 器 名 为 USARTx_Status, 其 类 型 为上 述 的 USART 联 合 。uwrite.cu1write.cu2write.cunsigned int outval;USART1_Status.TX_NINE = (outval & 0x0100)>> 8;WriteUSART( (char) outval );DS51297C_CN 第 62 页© 2004 Microchip Technology Inc.


硬 件 外 设 函 数baudUSARTbaud1USARTbaud2USART函 数 : 为 增 强 型 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.cu1baud.cu2baud.c代 码 示 例 :baudUSART (BAUD_IDLE_CLK_HIGH &BAUD_16_BIT_RATE &BAUD_WAKEUP_ON &BAUD_AUTO_ON);© 2004 Microchip Technology Inc. DS51297C_CN 第 63 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库2.10.2 使 用 示 例#include #include void main(void){// configure USARTOpenUSART( 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 ); //wait for RA0 highWriteUSART( PORTD );//write value of PORTD}if(PORTD == 0x80)// check for terminationbreak; // valueCloseUSART();}DS51297C_CN 第 64 页© 2004 Microchip Technology Inc.


第 3 章 软 件 外 设 函 数 库MPLAB ® <strong>C18</strong> C 编 译 器函 数 库3.1 简 介本 章 讲 述 软 件 外 设 库 函 数 。 所 有 这 些 函 数 的 源 代 码 可 以 在 MPLAB <strong>C18</strong> 编 译 器 安 装 目录 的 src\traditional\pmc 和 src\extended\pmc 子 目 录 下 找 到 。请 参 阅 MPASM User's Guide with MPLINK 和 MPLIB (DS33014), 获 得 更 多有 关 创 建 函 数 库 的 信 息 。MPLAB <strong>C18</strong> 库 函 数 支 持 下 列 外 设 :• 外 部 LCD 函 数 (3.2 节 “ 外 部 LCD 函 数 ”)• 外 部 CAN2510 函 数 (3.3 节 “ 外 部 CAN2510 函 数 ”)• 软 件 I 2 C 函 数 (3.4 节 “ 软 件 I²C 函 数 ”)• 软 件 SPI 函 数 (3.5 节 “ 软 件 SPI ® 函 数 ”)• 软 件 UART 函 数 (3.6 节 “ 软 件 UART 函 数 ”)3.2 外 部 LCD 函 数设 计 这 些 函 数 , 旨 在 使 用 PI<strong>C18</strong> 单 片 机 的 I/O 引 脚 控 制 Hitachi 的 HD44780 LCD 控 制器 。 所 提 供 函 数 见 下 表 :表 3-1:函 数外 部 LCD 函 数描 述BusyXLCD LCD 控 制 器 是 否 正 忙 ?OpenXLCD 配 置 用 于 控 制 LCD 的 I/O 线 , 并 初 始 化 LCD 。putcXLCD 向 LCD 控 制 器 写 一 个 字 节 。putsXLCD 从 数 据 存 储 器 写 一 个 字 符 串 到 LCD 。putrsXLCD 从 程 序 存 储 器 写 一 个 字 符 串 到 LCD 。ReadAddrXLCD 从 LCD 控 制 器 中 读 出 地 址 字 节 。ReadDataXLCD 从 LCD 控 制 器 中 读 取 一 字 节 数 据 。SetCGRamAddr 设 置 字 符 发 生 器 的 地 址 。SetDDRamAddr 设 置 显 示 数 据 地 址 。WriteCmdXLCD 写 一 个 命 令 到 LCD 控 制 器 。WriteDataXLCD 写 一 字 节 数 据 到 LCD 控 制 器 。这 些 函 数 的 预 编 译 形 式 使 用 默 认 的 引 脚 分 配 。 通 过 在 文 件 xlcd.h 中 重 新 定 义 下 列 宏 ,可 以 改 变 引 脚 的 分 配 , xlcd.h 文 件 在 编 译 器 安 装 目 录 的 h 子 目 录 下 。© 2004 Microchip Technology Inc. DS51297C_CN 第 65 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库表 3-2:LCD控 制 器 线选 择 LCD 引 脚 分 配 的 宏宏 默 认 值 用 途E 引 脚E_PINPORTBbits.RB4用 于 E 线 的 引 脚 。TRIS_EDDRBbits.RB4控 制 与 E 线 有 关 引 脚 的 方 向 的 位 。RS 引 脚RS_PINPORTBbits.RB5用 于 RS 线 的 引 脚 。TRIS_RSDDRBbits.RB5控 制 与 RS 线 有 关 引 脚 的 方 向 的位 。用 于 RW 线 的 引 脚 。RW 引 脚RW_PINPORTBbits.RB6TRIS_RWDDRBbits.RB6控 制 与 RW 线 有 关 引 脚 的 方 向 的位 。数 据 线DATA_PORTPORTB用 于 数 据 线 的 引 脚 。 这 些 函 数 假 设所 有 引 脚 都 在 一 个 端 口 上 。TRIS_DATA_PORTDDRB和 数 据 线 有 关 的 数 据 方 向 寄 存 器 。所 提 供 的 函 数 库 可 工 作 在 4 位 模 式 或 8 位 模 式 。 工 作 在 8 位 模 式 时 , 使 用 一 个 端 口 的所 有 引 脚 。 当 工 作 在 4 位 模 式 时 , 只 使 用 一 个 端 口 的 低 4 位 或 者 高 4 位 。 下 表 列 出 了用 于 选 择 4 位 或 8 位 模 式 的 宏 , 以 及 用 于 选 择 工 作 在 4 位 模 式 时 使 用 端 口 哪 些 位 的宏 。表 3-3:选 择 4 位 或 8 位 模 式 的 宏宏 默 认 值 用 途BIT8 未 定 义 如 果 创 建 库 函 数 时 定 义 了 此 值 , 库 函 数 将 工 作 在 8 位 传输 模 式 ; 否 则 , 将 工 作 在 4 位 传 输 模 式 。UPPER 未 定 义 当 未 定 义 BIT8 时 , 该 值 将 决 定 使 用 DATA_PORT 的 哪 一个 4 位 组 来 传 输 数 据 。如 果 定 义 了 UPPER, 使 用 DATA_PORT 的 高 4 位(4:7)。如 果 没 有 定 义 UPPER, 则 使 用 DATA_PORT 的 低 4 位(0:3)。完 成 上 述 定 义 后 , 用 户 必 须 重 新 编 译 XLCD 子 程 序 , 然 后 在 项 目 中 包 含 更 新 过 的 文件 。 这 可 通 过 把 XLCD 源 文 件 添 加 到 项 目 中 , 或 者 使 用 提 供 的 批 处 理 文 件 重 新 编 译 库文 件 来 完 成 。XLCD 函 数 库 还 需 要 用 户 定 义 下 列 函 数 , 以 提 供 适 当 的 延 时 :表 3-4:XLCD 延 时 函 数函 数功 能DelayFor18TCY 延 时 18 个 周 期 。DelayPORXLCD延 时 15 ms。DelayXLCD延 时 5 ms。DS51297C_CN 第 66 页© 2004 Microchip Technology Inc.


软 件 外 设 函 数 库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 控 制 器 的 PI<strong>C18</strong> I/O 引 脚 ,并 初 始 化 LCD 控 制 器 。文 件 名 :openxlcd.c代 码 示 例 : OpenXLCD( EIGHT_BIT & LINES_5X7 );putcXLCD参 见 WriteDataXLCD。© 2004 Microchip Technology Inc. DS51297C_CN 第 67 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库putsXLCDputrsXLCD功 能 : 向 Hitachi HD44780 LCD 控 制 器 写 入 一 个 字 符 串 。包 含 头 文 件 : xlcd.h原 型 : void putsXLCD( char *buffer );void putrsXLCD( const rom char *buffer );参 数 :buffer指 向 要 写 入 LCD 控 制 器 的 字 符 的 指 针 。说 明 :该 函 数 把 buffer 中 的 字 符 串 写 到 Hitachi HD44780 LCD 控 制 器 。 当遇 到 空 字 符 时 会 停 止 传 输 , 不 传 输 空 字 符 。对 于 位 于 数 据 存 储 器 中 的 字 符 串 , 应 该 使 用 这 些 函 数 的 “puts” 形 式 。对 于 位 于 程 序 存 储 器 中 的 字 符 串 , 包 括 字 符 串 常 量 , 应 该 使 用 这 些 函 数的 “putrs” 形 式 。文 件 名 :putsxlcd.cputrxlcd.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.cchar addr;while ( BusyXLCD() );addr = ReadAddrXLCD();DS51297C_CN 第 68 页© 2004 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 );© 2004 Microchip Technology Inc. DS51297C_CN 第 69 页


MPLAB ® <strong>C18</strong> 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_BIT4 位 数 据 接 口 模 式EIGHT_BIT8 位 数 据 接 口 模 式显 示 类 型 :LINE_5X75x7 个 字 符 , 单 行 显 示LINE_5X105x10 个 字 符 显 示LINES_5X75x7 个 字 符 , 多 行 显 示说 明 :该 函 数 把 命 令 字 节 写 入 到 Hitachi HD44780 LCD 控 制 器 。 执 行 此 操 作 时LCD 控 制 器 不 能 处 于 忙 状 态 — 这 可 以 通 过 使 用 BusyXLCD 函 数 来 校验 。文 件 名 :wcmdxlcd.c代 码 示 例 : while( BusyXLCD() );WriteCmdXLCD( EIGHT_BIT & LINES_5X7 );WriteCmdXLCD( BLINK_ON );WriteCmdXLCD( SHIFT_DISP_LEFT );putcXLCDWriteDataXLCD功 能 把 一 字 节 数 据 写 入 到 Hitachi HD44780 LCD 控 制 器 。包 含 头 文 件 : xlcd.h原 型 : void WriteDataXLCD( char data );参 数 :datadata 的 值 可 以 是 任 意 8 位 的 值 , 但 是 应 该 和 HD44780 LCD 控 制 器 的 字 符RAM 表 相 对 应 。说 明 :该 函 数 把 一 字 节 数 据 写 入 到 Hitachi HD44780 LCD 控 制 器 。 当 执 行 此 操作 时 , LCD 控 制 器 不 能 处 于 忙 状 态 — 这 可 通 过 BusyXLCD 函 数 来 校验 。从 控 制 器 中 读 出 的 数 据 是 字 符 发 生 器 RAM 的 数 据 还 是 显 示 数 据 RAM的 数 据 , 取 决 于 以 前 调 用 的 Set??RamAddr 函 数 。文 件 名 :writdata.cDS51297C_CN 第 70 页© 2004 Microchip Technology Inc.


软 件 外 设 函 数 库3.2.2 使 用 示 例#include #include #include #include void DelayFor18TCY( void ){Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();}void DelayPORXLCD( void ){Delay1KTCYx(60); //Delay of 15msreturn;}void DelayXLCD( void ){Delay1KTCYx(20); //Delay of 5msreturn;}void main( void ){char data;// configure external LCDOpenXLCD( EIGHT_BIT & LINES_5X7 );// configure USARTOpenUSART( USART_TX_INT_OFF & USART_RX_INT_OFF &USART_ASYNCH_MODE & USART_EIGHT_BIT &USART_CONT_RX,25);while(1){while(!DataRdyUSART()); //wait for datadata = ReadUSART(); //read dataWriteDataXLCD(data); //write to LCDif(data=='Q')break;}CloseUSART();}© 2004 Microchip Technology Inc. DS51297C_CN 第 71 页


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


软 件 外 设 函 数 库表 3-5: 外 部 CAN2510 函 数 ( 续 )函 数描 述CAN2510SetMsgFilterStd 为 标 准 报 文 配 置 某 个 接 收 缓 冲 区 的 所 有 过 滤 器 和 屏 蔽 器 。CAN2510SetMsgFilterXtd 为 扩 展 报 文 配 置 某 个 接 收 缓 冲 区 的 所 有 过 滤 器 和 屏 蔽 器 。CAN2510SetSingleFilterStd 为 标 准 (Std) 报 文 配 置 指 定 的 接 收 过 滤 器 。CAN2510SetSingleFilterXtd 为 扩 展 (Xtd) 报 文 配 置 指 定 的 接 收 过 滤 器 。CAN2510SetSingleMaskStd 为 标 准 (Std) 格 式 报 文 配 置 指 定 接 收 缓 冲 区 的 屏 蔽 器 。CAN2510SetSingleMaskXtd 为 扩 展 (Xtd) 报 文 配 置 指 定 接 收 缓 冲 区 的 屏 蔽 器 。CAN2510WriteStd使 用 第 一 个 可 用 的 发 送 缓 冲 区 , 将 标 准 格 式 报 文 写 到 CAN总 线 。CAN2510WriteXtd使 用 第 一 个 可 用 的 发 送 缓 冲 区 , 将 扩 展 格 式 报 文 写 到 CAN总 线 。注 1: 在 下 列 情 况 下 , 函 数 CAN2510Enable 和 CAN2510Disable 需 要 重 新 编 译 :- PICmicro 单 片 机 CS 引 脚 的 分 配 做 了 修 改 , 不 和 RC2 相 连- 需 要 修 改 器 件 的 头 文 件3.3.1 函 数 描 述CAN2510BitModify功 能 : 将 一 个 寄 存 器 中 的 指 定 位 修 改 为 新 值 。所 要 求 的 CAN 模 式 : 所 有 模 式 均 可包 含 头 文 件 : can2510.h原 型 :void CAN2510BitModify(unsigned char addrunsigned char maskunsigned char data );参 数 :addraddr 的 值 指 定 要 修 改 的 MCP2510 寄 存 器 的 地 址 。maskmask 的 值 指 定 将 被 修 改 的 位 。datadata 的 值 指 定 各 位 的 新 状 态 。说 明 :文 件 名 :该 函 数 修 改 地 址 指 定 的 寄 存 器 的 内 容 , mask 指 定 哪 些 位 要 修 改 , data指 定 要 加 载 到 这 些 位 的 新 值 。 只 能 对 某 些 特 定 寄 存 器 使 用 位 修 改 命 令 。canbmod.c© 2004 Microchip Technology Inc. DS51297C_CN 第 73 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库CAN2510ByteRead功 能 : 读 取 由 地 址 指 定 的 MCP2510 寄 存 器 。要 求 的 CAN 模 式 :包 含 头 文 件 :原 型 :参 数 :所 有 模 式 均 可can2510.hunsigned char CAN2510ByteRead(unsigned char address );address要 从 中 读 取 数 据 的 MCP2510 寄 存 器 的 地 址 。说 明 : 该 函 数 按 照 指 定 地 址 从 MCP2510 读 取 一 字 节 数 据 。返 回 值 : 指 定 地 址 的 内 容 。文 件 名 :readbyte.cCAN2510ByteWrite功 能 : 写 一 个 值 到 由 地 址 指 定 的 MCP2510 寄 存 器 。要 求 的 CAN 模 式 : 所 有 模 式 均 可包 含 头 文 件 : can2510.h原 型 :void CAN2510ByteWrite(unsigned char address,unsigned char value );参 数 :address要 写 入 数 据 的 MCP2510 的 地 址 。value要 写 入 的 值 。说 明 : 该 函 数 向 由 地 址 指 定 的 MCP2510 寄 存 器 写 入 一 字 节 数 据 。文 件 名 :wrtbyte.cCAN2510DataRead功 能 : 从 指 定 的 接 收 缓 冲 区 中 读 取 报 文 。要 求 的 CAN 模 式 :包 含 头 文 件 :原 型 :参 数 :除 配 置 模 式 外 的 所 有 模 式can2510.hunsigned char CAN2510DataRead(unsigned char bufferNum,unsigned long *msgId,unsigned char *numBytes,unsigned char *data );bufferNum要 从 中 读 取 报 文 的 接 收 缓 冲 区 , 取 下 列 值 之 一 :CAN2510_RXB0 读 取 接 收 缓 冲 区 0CAN2510_RXB1 读 取 接 收 缓 冲 区 1msgId指 向 将 被 函 数 修 改 、 保 存 CAN 标 准 报 文 标 识 符 的 地 址 。DS51297C_CN 第 74 页© 2004 Microchip Technology Inc.


软 件 外 设 函 数 库CAN2510DataRead ( 续 )numBytes指 向 将 被 函 数 修 改 、 保 存 此 报 文 中 字 节 数 的 地 址 。data指 向 将 被 该 函 数 修 改 、 保 存 报 文 数 据 的 数 组 。 此 数 组 应 该 至 少 8 个 字 节长 , 因 为 这 是 报 文 数 据 的 最 大 长 度 。说 明 :该 函 数 确 定 报 文 是 标 准 报 文 还 是 扩 展 报 文 , 将 ID 和 报 文 长 度 解 码 , 并 用适 当 的 信 息 来 填 充 用 户 提 供 的 地 址 。 应 该 使 用 CAN2510DataReady 函数 来 确 定 指 定 的 缓 冲 区 是 否 有 数 据 可 读 。返 回 值 : 函 数 返 回 下 列 值 之 一 :CAN2510_XTDMSG 扩 展 格 式 报 文CAN2510_STDMSG 标 准 格 式 报 文CAN2510_XTDRTR 远 程 发 送 请 求(XTD 报 文 )CAN2510_STDRTR 远 程 发 送 请 求(STD 报 文 )文 件 名 :canread.cCAN2510DataReady功 能 : 确 定 指 定 的 接 收 缓 冲 区 中 是 否 有 数 据 可 读 。要 求 的 CAN 模 式 : 除 配 置 模 式 外 的 所 有 模 式包 含 头 文 件 : can2510.h原 型 :unsigned char CAN2510DataReady(unsigned char bufferNum );参 数 :bufferNum要 检 查 其 中 是 否 有 等 待 报 文 的 接 收 缓 冲 区 , 其 值 为 :CAN2510_RXB0 检 查 接 收 缓 冲 区 0CAN2510_RXB1 检 查 接 收 缓 冲 区 1CAN2510_RXBX 检 查 接 收 缓 冲 区 0 和 接 收 缓 冲 区 1说 明 : 该 函 数 检 测 CANINTF 寄 存 器 中 相 应 的 RXnIF 位 。返 回 值 :如 果 没 有 检 测 到 任 何 报 文 , 返 回 0 ; 若 检 测 到 报 文 , 则 返 回 一 个 非 0 的值 。1 = 缓 冲 区 02 = 缓 冲 区 13 = 缓 冲 区 0 和 缓 冲 区 1文 件 名 :canready.c© 2004 Microchip Technology Inc. DS51297C_CN 第 75 页


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


软 件 外 设 函 数 库CAN2510ErrorState功 能 : 读 CAN 总 线 的 当 前 错 误 状 态 。要 求 的 CAN 模 式 : 正 常 模 式 、 环 回 测 试 模 式 、 监 听 模 式( 在 配 置 模 式 中 复 位 错 误 计 数 器 )包 含 头 文 件 : can2510.h原 型 : unsigned char CAN2510ErrorState( void );说 明 :该 函 数 返 回 CAN 总 线 的 错 误 状 态 。 错 误 状 态 取 决 于 TEC 寄 存 器 和 REC寄 存 器 中 的 值 。返 回 值 : 函 数 返 回 下 列 值 之 一 :CAN2510_BUS_OFF TEC > 255CAN2510_ERROR_PASSIVE_TX TEC > 127CAN2510_ERROR_PASSIVE_RX REC > 127CAN2510_ERROR_ACTIVE_WITH_TXWARN TEC > 95CAN2510_ERROR_ACTIVE_WITH_RXWARN REC > 95CAN2510_ERROR_ACTIVE TEC ≤ 95 且 REC ≤ 95文 件 名 :canerrst.cCAN2510Init功 能 :要 求 的 CAN 模 式 :包 含 头 文 件 :原 型 :初 始 化 PI<strong>C18</strong>CXXX 的 SPI 口 以 与 MCP2510 进 行 通 讯 , 然 后 配 置MCP2510 寄 存 器 以 与 CAN 总 线 接 口 。配 置 模 式can2510.hunsigned 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 中 定 义 。BufferConfigBufferConfig 的 值 是 下 列 选 项 的 位 与 (‘&’) 操 作 得 到 的 。 每 组 功 能 中 只能 选 择 一 项 , 用 粗 体 字 标 出 的 选 项 是 默 认 值 。复 位 MCP2510指 定 是 否 要 发 送 MCP2510 复 位 命 令 。 这 并 不 和 MCP2510 寄 存 器 中 的一 位 相 对 应 。CAN2510_NORESET不 复 位 MCP2510CAN2510_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 接 收 所 有 报 文 , 不 使 用 过 滤 器© 2004 Microchip Technology Inc. DS51297C_CN 第 77 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库CAN2510Init ( 续 )接 收 缓 冲 区 0 向 接 收 缓 冲 区 1 转 存由 BUKT 位 (RXB0CTRL 寄 存 器 ) 控 制CAN2510_RXB0_ROLL 如 果 接 收 缓 冲 区 0 已 满 , 则 报 文 会 转 存到 接 收 缓 冲 区 1CAN2510_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 引 脚 处 于 高 阻 态CAN2510_RX0BF_INT RX0BF 引 脚 为 输 出 , 表 明 接 收 缓 冲 区 0装 入 数 据 , 也 可 用 作 中 断 信 号 。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 / 8CAN2510_CLKOUT_4 CLKOUT = FOSC / 4CAN2510_CLKOUT_2 CLKOUT = FOSC / 2CAN2510_CLKOUT_1 CLKOUT = FOSCCAN2510_CLKOUT_OFF 禁 止 CLKOUTDS51297C_CN 第 78 页© 2004 Microchip Technology Inc.


软 件 外 设 函 数 库CAN2510Init ( 续 )BitTimeConfigBitTimeConfig 的 值 是 下 列 值 的 位 与 (‘&’)。 每 组 功 能 中 只 可 选 择 一 个 选项 , 用 粗 体 字 标 出 的 选 项 是 默 认 值 。波 特 率 预 分 频 器 (BRP)通 过 BRP5:BRP0 位 (CNF1 寄 存 器 ) 控 制CAN2510_BRG_1XTQ = 1 x (2TOSC): :CAN2510_BRG_64X TQ = 64 x (2TOSC)同 步 跳 转 宽 度 (SJW)通 过 SJW1:SJW0 位 (CNF1 寄 存 器 ) 控 制CAN2510_SJW_1TQ SJW 长 度 = 1 TQCAN2510_SJW_2TQ SJW 长 度 = 2 TQCAN2510_SJW_3TQ SJW 长 度 = 3 TQCAN2510_SJW_4TQ SJW 长 度 = 4 TQ相 位 缓 冲 段 2 宽 度通 过 PH2SEG2:PH2SEG0 位 (CNF3 寄 存 器 ) 控 制CAN2510_PH2SEG_2TQ长 度 = 2 TQCAN2510_PH2SEG_3TQ长 度 = 3 TQCAN2510_PH2SEG_4TQ长 度 = 4 TQCAN2510_PH2SEG_5TQ长 度 = 5 TQCAN2510_PH2SEG_6TQ长 度 = 6 TQCAN2510_PH2SEG_7TQ长 度 = 7 TQCAN2510_PH2SEG_8TQ长 度 = 8 TQ相 位 缓 冲 段 1 宽 度通 过 PH1SEG2:PH1SEG0 位 (CNF2 寄 存 器 ) 控 制CAN2510_PH1SEG_1TQ长 度 = 1 TQCAN2510_PH1SEG_2TQ长 度 = 2 TQCAN2510_PH1SEG_3TQ长 度 = 3 TQCAN2510_PH1SEG_4TQ长 度 = 4 TQCAN2510_PH1SEG_5TQ长 度 = 5 TQCAN2510_PH1SEG_6TQ长 度 = 6 TQCAN2510_PH1SEG_7TQ长 度 = 7 TQCAN2510_PH1SEG_8TQ长 度 = 8 TQ传 播 段 宽 度通 过 PRSEG2:PRSEG0 位 (CNF2 寄 存 器 ) 控 制CAN2510_PROPSEG_1TQ 长 度 = 1 TQCAN2510_PROPSEG_2TQ 长 度 = 2 TQCAN2510_PROPSEG_3TQ 长 度 = 3 TQCAN2510_PROPSEG_4TQ 长 度 = 4 TQCAN2510_PROPSEG_5TQ 长 度 = 5 TQCAN2510_PROPSEG_6TQ 长 度 = 6 TQCAN2510_PROPSEG_7TQ 长 度 = 7 TQCAN2510_PROPSEG_8TQ 长 度 = 8 TQ相 位 段 2 的 源通 过 BTLMODE 位 (CNF2 寄 存 器 ) 控 制 。 该 值 将 确 定 相 位 段 2 的 长 度是 由 PH2SEG2:PH2SEG0 位 决 定 , 还 是 由 PH1SEG2:PH1SEG0 位 和(2TQ) 中 的 较 大 者 来 决 定 。CAN2510_PH2SOURCE_PH2CAN2510_PH2SOURCE_PH1长 度 = PH2SEG2:PH2SEG0长 度 = PH1SEG2:PH1SEG0 和 2TQ中 的 较 大 者位 采 样 点 频 度通 过 SAM 位 (CNF2 寄 存 器 ) 来 控 制 。 它 将 确 定 在 采 样 点 上 此 位 被 采 样1 次 还 是 被 采 样 3 次 。CAN2510_SAMPLE_1x只 采 样 1 次CAN2510_SAMPLE_3x采 样 3 次© 2004 Microchip Technology Inc. DS51297C_CN 第 79 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库CAN2510Init ( 续 )休 眠 模 式 下 RX 引 脚 噪 声 滤 波由 WAKFIL 位 (CNF3 寄 存 器 ) 控 制 。 这 将 确 定 当 器 件 处 于 休 眠 模 式时 , RX 引 脚 是 否 使 用 滤 波 器 来 抑 制 噪 声 。CAN2510_RX_FILTER休 眠 模 式 时 在 RX 引 脚 上 滤 波CAN2510_RX_NOFILTER 休 眠 模 式 时 不 在 RX 引 脚 上 滤 波interruptEnablesinterruptEnables 的 值 是 下 列 值 的 位 与 (‘&’)。 其 中 用 粗 体 字 标 出 的选 项 是 默 认 值 。 通 过 CANINTE 寄 存 器 的 所 有 位 来 控 制 。CAN2510_NONE_EN不 允 许 任 何 中 断CAN2510_MSGERR_EN在 报 文 接 收 或 发 送 过 程 中 出 现 错 误时 产 生 中 断CAN2510_WAKEUP_EN在 CAN 总 线 工 作 时 产 生 中 断CAN2510_ERROR_EN在 EFLG 错 误 条 件 改 变 时 产 生 中 断CAN2510_TXB2_EN在 发 送 缓 冲 区 2 为 空 时 产 生 中 断CAN2510_TXB1_EN在 发 送 缓 冲 区 1 为 空 时 产 生 中 断CAN2510_TXB0_EN在 发 送 缓 冲 区 0 为 空 时 产 生 中 断CAN2510_RXB1_EN当 接 收 缓 冲 区 1 收 到 报 文 时 产 生 中 断CAN2510_RXB0_EN当 接 收 缓 冲 区 0 收 到 报 文 时 产 生 中 断SPI_syncMode指 定 PI<strong>C18</strong>CXXX SPI 同 步 频 率 :CAN2510_SPI_FOSC4以 FOSC/4 频 率 通 讯CAN2510_SPI_FOSC16以 FOSC/16 频 率 通 讯CAN2510_SPI_FOSC64以 FOSC/64 频 率 通 讯CAN2510_SPI_FOSCTMR2 以 TMR2/2 频 率 通 讯SPI_busMode指 定 PI<strong>C18</strong>CXXX SPI 总 线 模 式 :CAN2510_SPI_MODE00使 用 SPI 00 模 式 进 行 通 讯CAN2510_SPI_MODE01使 用 SPI 01 模 式 进 行 通 讯SPI_smpPhase指 定 PI<strong>C18</strong>CXXX SPI 采 样 点 位 置 :CAN2510_SPI_SMPMID在 SPI 位 的 中 间 采 样CAN2510_SPI_SMPEND在 SPI 位 的 末 端 采 样说 明 :该 函 数 初 始 化 PI<strong>C18</strong>CXXX SPI 模 块 , 复 位 MCP2510 器 件 ( 如 果 需要 ), 并 配 置 MCP2510 寄 存 器 。注 : 该 函 数 执 行 完 后 ,MCP2510 处 于 配 置 模 式 。返 回 值 : 表 明 MCP2510 是 否 完 成 初 始 化 。如 果 初 始 化 完 成 , 返 回 0 ;如 果 没 有 完 成 , 则 返 回 -1。文 件 名 :caninit.cDS51297C_CN 第 80 页© 2004 Microchip Technology Inc.


软 件 外 设 函 数 库CAN2510InterruptEnable功 能 : 将 CAN2510 的 中 断 允 许 位 (CANINTE 寄 存 器 ) 修 改 为 新 值 。所 要 求 的 CAN 模 式 : 所 有 模 式 均 可包 含 头 文 件 : can2510.h,spi_can.h原 型 :void CAN2510InterruptEnable(unsigned char interruptEnables );参 数 :interruptEnablesinterruptEnable 的 值 是 下 列 值 的 位 与 (‘&’)。 由 粗 体 标 出 的 选 项 是默 认 值 。 通 过 CANINTE 寄 存 器 的 所 有 位 来 控 制 。说 明 :文 件 名 :CAN2510_NONE_EN 不 允 许 任 何 中 断 (00000000)CAN2510_MSGERR_EN 在 报 文 接 收 或 发 送 过 程 中 出 现 错 误 时 产 生中 断(10000000)CAN2510_WAKEUP_EN 在 CAN 总 线 工 作 时 产 生 中 断(01000000)CAN2510_ERROR_EN EFLG 错 误 条 件 变 化 时 产 生 中 断(00100000)CAN2510_TXB2_EN 在 发 送 缓 冲 区 2 为 空 时 产 生 中 断(00010000)CAN2510_TXB1_EN 在 发 送 缓 冲 区 1 为 空 时 产 生 中 断(00001000)CAN2510_TXB0_EN 在 发 送 缓 冲 区 0 为 空 时 产 生 中 断(00000100)CAN2510_RXB1_EN 当 接 收 缓 冲 区 1 收 到 报 文 时 产 生 中 断(00000010)CAN2510_RXB0_EN 当 接 收 缓 冲 区 0 收 到 报 文 时 产 生 中 断(00000001)该 函 数 用 对 所 期 望 中 断 源 进 行 位 与 操 作 所 得 的 值 来 更 新 CANINTE 寄 存器 。caninte.c© 2004 Microchip Technology Inc. DS51297C_CN 第 81 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库CAN2510InterruptStatus功 能 : 指 明 CAN2510 的 中 断 源 。要 求 的 CAN 模 式 : 所 有 模 式 均 可包 含 头 文 件 : can2510.h,spi_can.h原 型 :unsigned char CAN2510InterruptStatus(void );说 明 :该 函 数 读 取 CANSTAT 寄 存 器 , 并 且 指 定 由 ICODE2:ICODE0 位 的 状 态所 决 定 的 数 码 。返 回 值 : 函 数 返 回 下 列 值 之 一 :CAN2510_NO_INTS 没 有 中 断 产 生CAN2510_WAKEUP_INT CAN 总 线 工 作 时 产 生 中 断CAN2510_ERROR_INT EFLG 错 误 条 件 改 变 时 产 生 中 断CAN2510_TXB2_INT 发 送 缓 冲 区 2 为 空 时 产 生 中 断CAN2510_TXB1_INT 发 送 缓 冲 区 1 为 空 时 产 生 中 断CAN2510_TXB0_INT 发 送 缓 冲 区 0 为 空 时 产 生 中 断CAN2510_RXB1_INT 接 收 缓 冲 区 1 接 收 到 报 文 时 产 生 中 断CAN2510_RXB0_INT 接 收 缓 冲 区 0 接 收 到 报 文 时 产 生 中 断文 件 名 :canints.cCAN2510LoadBufferStd功 能 : 把 标 准 数 据 帧 装 入 指 定 的 发 送 缓 冲 区 。要 求 的 CAN 模 式 : 所 有 模 式 均 可包 含 头 文 件 : can2510.h原 型 :void CAN2510LoadBufferStd(unsigned char bufferNum,unsigned int msgId,unsigned char numBytes,unsigned char *data );参 数 :bufferNum指 定 要 装 入 报 文 的 缓 冲 区 , 取 下 列 值 之 一 :CAN2510_TXB0 发 送 缓 冲 区 0CAN2510_TXB1 发 送 缓 冲 区 1CAN2510_TXB2 发 送 缓 冲 区 2msgIdCAN 报 文 标 识 符 。 对 于 标 准 报 文 , 标 识 符 可 达 11 位 。numBytes要 发 送 的 数 据 的 字 节 数 , 取 值 为 0 到 8。 如 果 值 大 于 8, 则 只 存 储 前 8 个字 节 。data要 装 入 的 数 组 。 此 数 组 长 度 必 须 大 于 等 于 numBytes 中 规 定 的 值 。DS51297C_CN 第 82 页© 2004 Microchip Technology Inc.


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


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库CAN2510LoadRTRStd功 能 : 把 标 准 远 程 帧 装 入 指 定 的 发 送 缓 冲 区 。要 求 的 CAN 模 式 : 所 有 模 式 均 可包 含 头 文 件 : can2510.h原 型 :void CAN2510LoadBufferStd(unsigned char bufferNum,unsigned int msgId,unsigned char numBytes,unsigned char *data );参 数 :bufferNum指 定 要 装 入 报 文 的 缓 冲 区 , 取 下 列 值 之 一 :CAN2510_TXB0 发 送 缓 冲 区 0CAN2510_TXB1 发 送 缓 冲 区 1CAN2510_TXB2 发 送 缓 冲 区 2msgIdCAN 报 文 标 识 符 , 对 于 标 准 报 文 可 达 11 位 。numBytes要 发 送 的 数 据 的 字 节 数 , 取 值 为 从 0 到 8。 如 果 此 值 大 于 8, 则 只 存 储 数据 的 前 8 个 字 节 。data要 装 入 的 数 组 。 此 数 组 长 度 必 须 至 少 等 于 numBytes 中 规 定 的 值 。说 明 : 该 函 数 仅 装 入 报 文 , 而 不 发 送 报 文 。可 使 用 函 数 CAN2510WriteBuffer() 将 报 文 写 到 CAN 总 线 。该 函 数 不 设 置 缓 冲 区 的 优 先 级 。 可 使 用 函 数CAN2510SetBufferPriority() 来 设 置 缓 冲 区 的 优 先 级 。文 件 名 :canlrtrs.cCAN2510LoadRTRXtd功 能 : 把 扩 展 远 程 帧 装 入 指 定 的 发 送 缓 冲 区 。要 求 的 CAN 模 式 : 所 有 模 式 均 可包 含 头 文 件 : can2510.h原 型 :void CAN2510LoadBufferXtd(unsigned char bufferNum,unsigned long msgId,unsigned char numBytes,unsigned char *data );参 数 :bufferNum指 定 要 装 入 报 文 的 缓 冲 区 , 取 下 列 值 之 一 :CAN2510_TXB0 发 送 缓 冲 区 0CAN2510_TXB1 发 送 缓 冲 区 1CAN2510_TXB2 发 送 缓 冲 区 2msgIdCAN 报 文 标 识 符 , 对 于 扩 展 报 文 可 达 29 位 。numBytes要 发 送 的 数 据 的 字 节 数 , 取 值 为 从 0 到 8。 如 果 此 值 大 于 8, 则 只 存 储 数据 的 前 8 个 字 节 。DS51297C_CN 第 84 页© 2004 Microchip Technology Inc.


软 件 外 设 函 数 库CAN2510LoadRTRXtd ( 续 )data要 装 入 的 数 组 。 此 数 组 长 度 必 须 至 少 等 于 numBytes 中 规 定 的 值 。说 明 : 该 函 数 仅 装 入 报 文 , 而 不 发 送 报 文 。可 使 用 函 数 CAN2510WriteBuffer() 将 报 文 写 到 CAN 总 线 。该 函 数 不 设 置 缓 冲 区 的 优 先 级 。 可 使 用 函 数CAN2510SetBufferPriority() 来 设 置 缓 冲 区 的 优 先 级 。文 件 名 :canlrtrx.cCAN2510ReadMode功 能 : 读 取 MCP2510 的 当 前 工 作 模 式 。要 求 的 CAN 模 式 : 所 有 模 式 均 可包 含 头 文 件 : can2510.h原 型 : unsigned char CAN2510ReadMode( void );说 明 : 该 函 数 读 取 当 前 的 工 作 模 式 。 对 于 新 模 式 , 可 能 有 等 待 请 求 。返 回 值 :modemode 的 值 可 以 为 下 列 值 之 一 ( 在 文 件 can2510.h 中 定 义 )。 由OPMODE2:OPMODE0 位 (CANSTAT 寄 存 器 ) 指 定 。 取 值 如 下 :CAN2510_MODE_CONFIG 可 修 改 配 置 寄 存 器CAN2510_MODE_NORMAL 正 常 ( 发 送 和 接 收 报 文 )CAN2510_MODE_SLEEP 等 待 中 断CAN2510_MODE_LISTEN 仅 监 听 , 不 发 送CAN2510_MODE_LOOPBACK 用 于 测 试 , 自 发 自 收文 件 名 :canmoder.cCAN2510ReadStatus功 能 : 读 取 MCP2510 发 送 缓 冲 区 和 接 收 缓 冲 区 的 状 态 。所 要 求 的 CAN 模 式 : 所 有 模 式 均 可包 含 头 文 件 : can2510.h原 型 : unsigned char CAN2510ReadStatus( void );说 明 : 该 函 数 读 取 发 送 缓 冲 区 和 接 收 缓 冲 区 的 当 前 状 态 。返 回 值 :statusstatus ( 一 个 无 符 号 字 节 ) 的 值 有 下 列 格 式 :bit 7TXB2IFbit 6TXB2REQbit 5TXB1IFbit 4TXB1REQbit 3TXB0IFbit 2TXB0REQbit 1RXB1IFbit 0RXB0IF文 件 名 :canstats.c© 2004 Microchip Technology Inc. DS51297C_CN 第 85 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库CAN2510Reset功 能 :要 求 的 CAN 模 式 :包 含 头 文 件 :复 位 MCP2510。所 有 模 式 均 可can2510.hspi_can.hspi.h原 型 : void CAN2510Reset( void );说 明 :该 函 数 复 位 MCP2510。文 件 名 :canreset.cCAN2510SendBuffer功 能 : 请 求 发 送 指 定 发 送 缓 冲 区 中 的 报 文 。要 求 的 CAN 模 式 : 正 常 模 式包 含 头 文 件 : can2510.h原 型 :void CAN2510WriteBuffer( unsigned char bufferNum );参 数 :bufferNum指 定 请 求 发 送 哪 些 ( 个 ) 缓 冲 区 中 的 报 文 , 取 下 列 值 之 一 :CAN2510_TXB0 发 送 缓 冲 区 0CAN2510_TXB1 发 送 缓 冲 区 1CAN2510_TXB2 发 送 缓 冲 区 2CAN2510_TXB0_B1 发 送 缓 冲 区 0 和 发 送 缓 冲 区 1CAN2510_TXB0_B2 发 送 缓 冲 区 0 和 发 送 缓 冲 区 2CAN2510_TXB1_B2 发 送 缓 冲 区 1 和 发 送 缓 冲 区 2CAN2510_TXB0_B1_B2 发 送 缓 冲 区 0、 发 送 缓 冲 区 1 和 发 送 缓 冲 区2说 明 : 该 函 数 请 求 发 送 先 前 装 入 、 存 储 在 指 定 缓 冲 区 中 的 报 文 。 要 装 入 报 文 ,使 用 函 数 CAN2510LoadBufferStd()或 CAN2510LoadBufferXtd()。文 件 名 :cansend.cCAN2510SequentialRead功 能 :要 求 的 CAN 模 式 :包 含 头 文 件 :原 型 :参 数 :从 MCP2510 中 , 自 指 定 地 址 开 始 连 续 读 取 指 定 的 字 节 数 。 这 些 值 存 储 在DataArray 中 。所 有 模 式 均 可can2510.hvoid CAN2510SequentialRead(unsigned char *DataArrayunsigned char CAN2510addrunsigned char numbytes );DataArray存 储 连 续 读 取 数 据 的 数 据 数 组 的 首 地 址 。CAN2510addrMCP2510 中 开 始 连 续 读 取 处 的 地 址 。numbytes连 续 读 取 的 字 节 数 。DS51297C_CN 第 86 页© 2004 Microchip Technology Inc.


软 件 外 设 函 数 库CAN2510SequentialRead ( 续 )说 明 :文 件 名 :该 函 数 从 MCP2510 中 , 自 指 定 的 地 址 开 始 读 取 连 续 的 字 节 。 这 些 值 存储 到 自 指 定 数 组 首 地 址 开 始 的 地 址 。readseq.cCAN2510SequentialWrite功 能 :要 求 的 CAN 模 式 :包 含 头 文 件 :原 型 :参 数 :说 明 :文 件 名 :自 指 定 地 址 开 始 , 向 MCP2510 连 续 写 入 指 定 的 字 节 数 。 这 些 值 来 自 于DataArray。所 有 模 式 均 可can2510.hvoid CAN2510SequentialWrite(unsigned char *DataArrayunsigned char CAN2510addrunsigned char numbytes );DataArray包 含 连 续 写 数 据 的 数 组 的 首 地 址 。CAN2510addrMCP2510 中 连 续 写 数 据 开 始 处 的 地 址 。numbytes要 连 续 写 的 字 节 数 。该 函 数 自 指 定 的 地 址 开 始 , 将 连 续 的 字 节 写 入 MCP2510。 这 些 值 来 自 于自 指 定 数 组 首 地 址 开 始 的 地 址 。wrtseq.cCAN2510SetBufferPriority功 能 : 为 指 定 的 发 送 缓 冲 区 装 入 指 定 的 优 先 级 。要 求 的 CAN 模 式 : 所 有 模 式 均 可包 含 头 文 件 : can2510.h原 型 :void CAN2510SetBufferPriority(unsigned char bufferNum,unsigned char bufferPriority );参 数 :bufferNum指 定 要 配 置 优 先 级 的 缓 冲 区 , 取 下 列 值 之 一 :CAN2510_TXB0 发 送 缓 冲 区 0CAN2510_TXB1 发 送 缓 冲 区 1CAN2510_TXB2 发 送 缓 冲 区 2bufferPriority缓 冲 区 的 优 先 级 , 取 下 列 值 之 一 :CAN2510_PRI_HIGHEST 最 高 的 报 文 优 先 级CAN2510_PRI_HIGH 高 报 文 优 先 级CAN2510_PRI_LOW 低 报 文 优 先 级CAN2510_PRI_LOWEST 最 低 的 报 文 优 先 级说 明 : 该 函 数 为 指 定 的 缓 冲 区 装 入 指 定 的 优 先 级 。文 件 名 :cansetpr.c© 2004 Microchip Technology Inc. DS51297C_CN 第 87 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库CAN2510SetMode功 能 : 配 置 MCP2510 的 工 作 模 式 。要 求 的 CAN 模 式 : 所 有 模 式 均 可包 含 头 文 件 : can2510.h原 型 : void CAN2510SetMode( unsigned char mode );参 数 :modemode 的 值 可 以 是 下 列 值 之 一 ( 在 can2510.h 中 定 义 )。 由REQOP2:REQOP0 位 (CANCTRL 寄 存 器 ) 控 制 。CAN2510_MODE_CONFIG 可 修 改 配 置 寄 存 器CAN2510_MODE_NORMAL 正 常 ( 发 送 和 接 收 报 文 )CAN2510_MODE_SLEEP 等 待 中 断CAN2510_MODE_LISTEN 仅 监 听 , 不 发 送CAN2510_MODE_LOOPBACK 用 于 测 试 , 自 发 自 收说 明 :该 函 数 配 置 指 定 的 模 式 。 直 到 所 有 等 待 发 送 的 报 文 都 发 送 完 , 模 式 才 会改 变 。文 件 名 :canmodes.cCAN2510SetMsgFilterStd功 能 : 为 标 准 报 文 配 置 某 个 接 收 缓 冲 区 的 所 有 过 滤 器 和 屏 蔽 器 。要 求 的 CAN 模 式 :配 置 模 式包 含 头 文 件 : can2510.h原 型 :unsigned char CAN2510SetMsgFilterStd(unsigned char bufferNum,unsigned int mask,unsigned int *filters );参 数 :bufferNum指 定 要 配 置 过 滤 器 和 屏 蔽 器 的 接 收 缓 冲 区 , 取 下 列 值 之 一 :CAN2510_RXB0 配 置 RXM0、 RXF0 和 RXF1CAN2510_RXB1 配 置 RXM1、 RXF2、 RXF3、 RXF4 和 RXF5mask屏 蔽 器 设 定 值filters过 滤 器 设 定 值 。对 于 缓 冲 区 0:标 准 长 度 的 报 文 :2 个 无 符 号 整 数 组 成 的 数 组对 于 缓 冲 区 1:标 准 长 度 的 报 文 :4 个 无 符 号 整 数 组 成 的 数 组说 明 :该 函 数 将 MCP2510 配 置 为 配 置 模 式 , 然 后 将 屏 蔽 器 设 定 值 和 过 滤 器 设定 值 写 到 相 应 的 寄 存 器 。 在 返 回 前 , 将 MCP2510 配 置 为 原 来 的 模 式 。返 回 值 : 表 明 能 否 正 确 修 改 MCP2510 的 模 式 。如 果 工 作 模 式 的 初 始 化 和 恢 复 完 成 , 返 回 0 ;如 果 工 作 模 式 的 初 始 化 和 恢 复 未 完 成 , 则 返 回 -1 。文 件 名 :canfms.cDS51297C_CN 第 88 页© 2004 Microchip Technology Inc.


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


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库CAN2510SetSingleFilterStd功 能 : 为 标 准 (Std) 报 文 配 置 指 定 的 接 收 过 滤 器 。要 求 的 CAN 模 式 :包 含 头 文 件 :原 型 :参 数 :说 明 :文 件 名 :配 置 模 式can2510.hvoid CAN2510SetSingleFilterStd(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必 须 处 于 配 置 模 式 。canfilts.cCAN2510SetSingleFilterXtd功 能 : 为 扩 展 (Xtd) 报 文 配 置 指 定 的 接 收 过 滤 器 。要 求 的 CAN 模 式 :包 含 头 文 件 :原 型 :参 数 :说 明 :文 件 名 :配 置 模 式can2510.hvoid CAN2510SetSingleFilterXtd(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必 须 处 于 配 置 模 式 。canfiltx.cDS51297C_CN 第 90 页© 2004 Microchip Technology Inc.


软 件 外 设 函 数 库CAN2510SetSingleMaskStd功 能 : 为 标 准 (Std) 格 式 报 文 配 置 指 定 接 收 缓 冲 区 的 屏 蔽 器 。要 求 的 CAN 模 式 :包 含 头 文 件 :原 型 :参 数 :说 明 :文 件 名 :配 置 模 式can2510.hunsigned char CAN2510SetSingleMaskStd(unsigned char maskNum,unsigned int mask );maskNum指 定 要 配 置 的 接 收 屏 蔽 器 序 号 , 取 下 列 值 之 一 :CAN2510_RXM0 配 置 RXM0 ( 用 于 RXB0)CAN2510_RXM1 配 置 RXM1 ( 用 于 RXB1)mask屏 蔽 器 设 定 值 。该 函 数 将 屏 蔽 器 设 定 值 写 到 相 应 的 寄 存 器 。 在 执 行 该 函 数 前 MCP2510必 须 处 于 配 置 模 式 。canmasks.cCAN2510SetSingleMaskXtd功 能 : 为 扩 展 (Xtd) 报 文 配 置 指 定 接 收 缓 冲 区 的 屏 蔽 器 。要 求 的 CAN 模 式 :包 含 头 文 件 :原 型 :参 数 :说 明 :文 件 名 :配 置 模 式can2510.hunsigned char CAN2510SetSingleMaskXtd(unsigned char maskNum,unsigned long mask );maskNum指 定 要 配 置 的 接 收 屏 蔽 器 序 号 , 取 下 列 值 之 一 :CAN2510_RXM0 配 置 RXM0 ( 用 于 RXB0)CAN2510_RXM1 配 置 RXM1 ( 用 于 RXB1)mask屏 蔽 器 设 定 值 。该 函 数 将 屏 蔽 器 设 定 值 写 到 相 应 的 寄 存 器 。 在 执 行 该 函 数 前 MCP2510必 须 处 于 配 置 模 式 。canmaskx.c© 2004 Microchip Technology Inc. DS51297C_CN 第 91 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库CAN2510WriteStd功 能 : 使 用 第 一 个 可 用 的 发 送 缓 冲 区 , 将 标 准 格 式 报 文 写 到 CAN 总 线 。要 求 的 CAN 模 式 : 正 常 模 式包 含 头 文 件 : can2510.h原 型 :unsigned char CAN2510WriteStd(unsigned int msgId,unsigned char msgPriority,unsigned char numBytes,unsigned char *data );参 数 :msgIdCAN 报 文 标 识 符 , 标 准 报 文 有 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.cDS51297C_CN 第 92 页© 2004 Microchip Technology Inc.


软 件 外 设 函 数 库CAN2510WriteXtd功 能 : 使 用 第 一 个 可 用 的 发 送 缓 冲 区 , 将 扩 展 格 式 报 文 写 到 CAN 总 线 。要 求 的 CAN 模 式 : 正 常 模 式包 含 头 文 件 : can2510.h原 型 :unsigned char CAN2510WriteXtd(unsigned long msgId,unsigned char msgPriority,unsigned char numBytes,unsigned char *data );参 数 :msgIdCAN 报 文 标 识 符 , 对 于 扩 展 报 文 有 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© 2004 Microchip Technology Inc. DS51297C_CN 第 93 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库3.4 软 件 I²C 函 数设 计 这 些 函 数 , 旨 在 使 用 PI<strong>C18</strong> 单 片 机 的 I/O 引 脚 来 实 现 I 2 C 总 线 , 具 体 函 数 见 下表 :表 3-6:I 2 C 软 件 函 数函 数描 述Clock_test 为 延 长 从 时 钟 低 电 平 时 间 产 生 延 时 。SWAckI2C 产 生 I 2 C 总 线 应 答 条 件 。SWGetcI2C 从 I 2 C 总 线 读 取 一 个 字 节 。SWGetsI2C 读 取 一 个 数 据 串 。SWNotAckI2C 产 生 I 2 C 总 线 无 应 答 条 件 。SWPutI2C 将 一 个 字 节 写 到 I 2 C 总 线 。SWPutsI2C 将 一 个 数 据 串 写 到 I 2 C 总 线 。SWReadI2C 从 I 2 C 总 线 读 取 一 个 字 节 。SWRestartI2C 产 生 I 2 C 总 线 重 复 启 动 条 件 。SWStartI2C 产 生 2 C 总 线 启 动 条 件 。SWStopI2C 产 生 I 2 C 总 线 停 止 条 件 。SWWriteI2C 将 一 个 字 节 写 到 I 2 C 总 线 。这 些 函 数 的 预 编 译 形 式 使 用 默 认 的 引 脚 分 配 。 通 过 在 文 件 sw_i2c.h ( 在 编 译 器 安 装 目录 的 h 子 目 录 下 ) 中 重 新 定 义 下 列 宏 , 可 以 改 变 引 脚 的 分 配 :表 3-7:选 择 I 2 C 引 脚 分 配 的 宏I 2 C 线 宏 默 认 值 用 途DATA 引 脚DATA_PINPORTBbits.RB4用 于 数 据 (DATA) 线 的 引 脚 。DATA_LATLATBbits.RB4与 DATA 引 脚 有 关 的 锁 存 器 。DATA_LOWTRISBbits.TRISB4 = 0;将 DATA 引 脚 配 置 为 输 出 的 语句 。DATA_HITRISBbits.TRISB4 = 1;将 DATA 引 脚 配 置 为 输 入 的 语句 。CLOCK 引脚SCLK_PINSCLK_LATPORTBbits.RB3LATBbits.LATB3用 于 时 钟 (CLOCK) 线 的 引 脚 。与 CLOCK 引 脚 有 关 的 锁 存 器 。CLOCK_LOWTRISBbits.TRISB3 = 0;将 CLOCK 引 脚 配 置 为 输 出的 语 句 。CLOCK_HITRISBbits.TRISB3 = 1;将 CLOCK 引 脚 配 置 为 输 入 的 语句 。完 成 这 些 定 义 后 , 用 户 必 须 重 新 编 译 I 2 C 子 程 序 , 然 后 在 项 目 中 使 用 更 新 过 的 文 件 。这 可 通 过 把 库 源 文 件 添 加 到 项 目 中 , 或 者 使 用 提 供 的 批 处 理 文 件 重 新 编 译 库 文 件 来 完成 。DS51297C_CN 第 94 页© 2004 Microchip Technology Inc.


软 件 外 设 函 数 库3.4.1 函 数 描 述Clock_test功 能 : 为 延 长 从 时 钟 低 电 平 时 间 产 生 延 时 。包 含 头 文 件 : sw_i2c.h原 型 : unsigned char Clock_test( void );说 明 :调 用 该 函 数 可 延 长 从 时 钟 低 电 平 时 间 。 可 能 需 要 根 据 应 用 的 要 求 调 节 延时 时 间 。 如 果 在 延 时 周 期 结 束 时 , 时 钟 线 为 低 电 平 , 则 返 回 一 个 表 明 时钟 错 误 的 值 。返 回 值 : 如 果 没 有 出 现 时 钟 错 误 , 返 回 0 ;如 果 出 现 时 钟 错 误 , 则 返 回 -2。文 件 名 :swckti2c.cSWAckI2CSWNotAckI2C功 能 : 产 生 I 2 C 总 线 应 答 条 件 。包 含 头 文 件 : sw_i2c.h原 型 : unsigned char SWAckI2C( void );unsigned char SWNotAckI2C( void );说 明 : 调 用 该 函 数 将 产 生 I 2 C 总 线 应 答 序 列 。返 回 值 : 如 果 从 机 应 答 , 返 回 0 ;如 果 从 机 无 应 答 , 则 返 回 -1。文 件 名 :swacki2c.cSWGetcI2C参 见 SWReadI2C。SWGetsI2C功 能 : 从 I 2 C 总 线 读 取 一 个 数 据 串 。包 含 头 文 件 : sw_i2c.h原 型 :unsigned char SWGetsI2C(unsigned char *rdptr,unsigned char length );参 数 :rdptr存 储 从 I 2 C 总 线 上 读 取 的 数 据 的 地 址 。length要 读 取 的 字 节 数 。说 明 : 该 函 数 读 取 一 个 预 先 确 定 长 度 的 数 据 串 。返 回 值 :如 果 主 机 在 所 有 字 节 接 收 完 前 产 生 一 个 无 应 答 (NOT ACK) 总 线 条件 , 返 回 -1 ;否 则 , 返 回 0。文 件 名 :swgtsi2c.c代 码 示 例 :char x[10];SWGetsI2C( x,5 );© 2004 Microchip Technology Inc. DS51297C_CN 第 95 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库SWNotAckI2C参 见 SWAckI2C。SWPutcI2C参 见 SWWriteI2C。SWPutsI2C功 能 : 写 一 个 数 据 串 到 I 2 C 总 线 。包 含 头 文 件 :原 型 :参 数 :sw_i2c.hunsigned char SWPutsI2C(unsigned char *wrdptr );wrdptr指 向 要 写 到 I 2 C 总 线 的 数 据 的 指 针 。说 明 : 该 函 数 将 写 入 一 个 数 据 串 , 直 到 ( 但 不 包 括 ) 空 字 符 为 止 。返 回 值 : 如 果 写 到 I 2 C 总 线 时 有 错 误 , 返 回 -1 ;否 则 , 返 回 0。文 件 名 :swptsi2c.c代 码 示 例 : char mybuff [20];SWPutsI2C(mybuff);SWReadI2CSWGetcI2C功 能 : 从 I 2 C 总 线 上 读 取 一 个 字 节 。包 含 头 文 件 : sw_i2c.h原 型 : unsigned char SWReadI2C( void );说 明 :该 函 数 通 过 在 预 先 确 定 的 I 2 C 时 钟 线 上 产 生 适 当 的 信 号 , 来 读 取 一 个 数据 字 节 。返 回 值 : 该 函 数 返 回 已 读 取 的 I 2 C 数 据 字 节 。如 果 该 函 数 出 现 错 误 , 则 返 回 -1。文 件 名 :swgtci2c.cSWRestartI2C功 能 : 产 生 I 2 C 总 线 重 复 启 动 条 件 。包 含 头 文 件 : sw_i2c.h原 型 : void SWRestartI2C( void );说 明 : 调 用 该 函 数 , 可 产 生 I 2 C 总 线 重 复 启 动 条 件 。文 件 名 :swrsti2c.cDS51297C_CN 第 96 页© 2004 Microchip Technology Inc.


软 件 外 设 函 数 库SWStartI2C功 能 : 产 生 I 2 C 总 线 启 动 条 件 。包 含 头 文 件 : sw_i2c.h原 型 : void SWStartI2C( void );说 明 : 调 用 该 函 数 来 产 生 I 2 C 总 线 启 动 条 件 。文 件 名 :swstri2c.cSWStopI2C功 能 : 产 生 I 2 C 总 线 停 止 条 件 。包 含 头 文 件 : sw_i2c.h原 型 : void SWStopI2C( void );说 明 : 调 用 该 函 数 来 产 生 I 2 C 总 线 停 止 条 件 。文 件 名 :swstpi2c.cSWWriteI2CSWPutcI2C功 能 : 写 一 个 字 节 到 I 2 C 总 线 。包 含 头 文 件 :原 型 :参 数 :sw_i2c.hunsigned char SWWriteI2C(unsigned char data_out );data_out要 写 到 I 2 C 器 件 的 一 个 数 据 字 节 。说 明 : 该 函 数 将 一 个 数 据 字 节 写 到 预 先 定 义 的 数 据 引 脚 。返 回 值 : 如 果 写 入 成 功 , 返 回 0 ;如 果 出 现 错 误 , 返 回 -1。文 件 名 :代 码 示 例swptci2c.cif(SWWriteI2C(0x80)){errorHandler();}© 2004 Microchip Technology Inc. DS51297C_CN 第 97 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库3.4.2 使 用 示 例下 面 是 一 个 简 单 的 代 码 示 例 , 举 例 说 明 了 与 Microchip 24LC01B I 2 C 电 可 擦 除 存 储 器 进行 I 2 C 通 讯 的 软 件 实 现 。#include #include #include // FUNCTION Prototypevoid 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 byteSWAckI2C();var = SWPutcI2C(0x10); // word addressSWAckI2C();var = SWPutcI2C(0x66); // dataSWAckI2C();SWStopI2C();}void page_write( void ){SWStartI2C();var = SWPutcI2C(0xA0); // control byteSWAckI2C();var = SWPutcI2C(0x20); // word addressSWAckI2C();var = SWPutsI2C(wrptr); // dataSWStopI2C();}DS51297C_CN 第 98 页© 2004 Microchip Technology Inc.


软 件 外 设 函 数 库void sequential_read( void ){SWStartI2C();var = SWPutcI2C( 0xA0 ); // control byteSWAckI2C();var = SWPutcI2C( 0x00 ); // address to read fromSWAckI2C();SWRestartI2C();var = SWPutcI2C( 0xA1 );SWAckI2C();var = SWGetsI2C( rdptr, 9 );SWStopI2C();}void current_address( void ){SWStartI2C();SWPutcI2C( 0xA1 ); // control byteSWAckI2C();SWGetcI2C(); // word addressSWNotAckI2C();SWStopI2C();}void ack_poll( void ){SWStartI2C();var = SWPutcI2C( 0xA0 ); // control bytewhile( SWAckI2C() ){SWRestartI2C();var = SWPutcI2C(0xA0); // data}SWStopI2C();}© 2004 Microchip Technology Inc. DS51297C_CN 第 99 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库3.5 软 件 SPI ® 函 数设 计 这 些 函 数 , 旨 在 使 用 PI<strong>C18</strong> 单 片 机 的 I/O 引 脚 来 实 现 SPI 。 具 体 函 数 见 下 表 :表 3-8:软 件 SPI 函 数函 数描 述ClearSWCSSPI 将 片 选 (CS) 引 脚 清 零 。OpenSWSPI 配 置 用 于 SPI 的 I/O 引 脚 。putcSWSPI 向 软 件 SPI 写 一 字 节 数 据 。SetSWCSSPI 置 位 片 选 (CS) 引 脚 。WriteSWSPI 向 软 件 SPI 总 线 写 一 字 节 数 据 。这 些 函 数 的 预 编 译 形 式 使 用 默 认 的 引 脚 分 配 。 通 过 在 文 件 sw_spi.h ( 在 编 译 器 安 装目 录 的 h 子 目 录 下 ) 中 重 新 定 义 下 列 宏 , 可 以 改 变 引 脚 分 配 :表 3-9:LCD控 制 器线CS 引 脚选 择 SPI 引 脚 分 配 的 宏宏 默 认 值 用 途SW_CS_PINPORTBbits.RB2 用 于 片 选 (CS) 线 的 引 脚 。TRIS_SW_CS_PINTRISBbits.TRISB2控 制 与 CS 线 相 连 引 脚 的 方 向 的位 。DIN 引 脚SW_DIN_PINPORTBbits.RB3用 于 DIN 线 的 引 脚 。TRIS_SW_DIN_PINTRISBbits.TRISB3控 制 与 DIN 线 相 连 引 脚 的 方 向的 位 。DOUT引 脚SW_DOUT_PINTRIS_SW_DOUT_PINPORTBbits.RB7TRISBbits.TRISB7用 于 DOUT 线 的 引 脚 。控 制 与 DOUT 线 相 连 引 脚 的 方向 的 位 。SCK 引 脚SW_SCK_PINPORTBbits.RB6用 于 SCK 线 的 引 脚 。TRIS_SW_SCK_PINTRISBbits.TRISB6控 制 与 SCK 线 相 连 引 脚 的 方 向的 位 。所 提 供 的 函 数 库 能 在 四 种 模 式 之 一 下 工 作 。 下 表 列 出 了 用 于 在 这 些 模 式 之 间 进 行 选 择的 宏 。 在 重 建 软 件 SPI 函 数 库 时 , 必 须 要 定 义 其 中 一 种 宏 。DS51297C_CN 第 100 页© 2004 Microchip Technology Inc.


软 件 外 设 函 数 库表 3-10:用 于 选 择 模 式 的 宏宏 默 认 值 含 义MODE0 已 定 义 CKP = 0CKE = 0MODE1 未 定 义 CKP = 1CKE = 0MODE2 未 定 义 CKP = 0CKE = 1MODE3 未 定 义 CKP = 1CKE = 1完 成 这 些 定 义 后 , 用 户 必 须 重 新 编 译 软 件 SPI 函 数 , 然 后 在 项 目 中 包 含 更 新 过 的 文件 。 这 可 通 过 将 软 件 SPI 源 文 件 添 加 到 项 目 中 , 或 者 使 用 所 提 供 的 批 处 理 文 件 重 新 编译 库 文 件 来 完 成 。3.5.1 函 数 描 述ClearSWCSSPI功 能 : 将 头 文 件 sw_spi.h 中 指 定 的 片 选 (CS) 引 脚 清 零 。包 含 头 文 件 :sw_spi.h原 型 : void ClearSWCSSPI( void );说 明 :文 件 名 :该 函 数 将 头 文 件 sw_spi.h 中 指 定 用 于 软 件 SPI 片 选 (CS) 引 脚 的I/O 引 脚 清 零 。clrcsspi.cOpenSWSPI功 能 : 配 置 用 于 软 件 SPI 的 I/O 引 脚 。包 含 头 文 件 : sw_spi.h原 型 : void OpenSWSPI( void );说 明 :该 函 数 将 用 于 软 件 SPI 的 I/O 引 脚 配 置 为 正 确 的 输 入 或 输 出 状 态 和 逻 辑电 平 。文 件 名 :opensspi.cputcSWSPI参 见 WriteSWSPI。SetSWCSSPI功 能 : 将 头 文 件 sw_spi.h 中 指 定 的 片 选 (CS) 引 脚 置 位 。包 含 头 文 件 :sw_spi.h原 型 : void SetSWCSSPI( void );说 明 :文 件 名 :该 函 数 将 头 文 件 sw_spi.h 中 指 定 用 于 软 件 SPI 片 选 (CS) 引 脚 的I/O 引 脚 置 位 。setcsspi.c© 2004 Microchip Technology Inc. DS51297C_CN 第 101 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库WriteSWSPIputcSWSPI功 能 : 向 软 件 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 #include #include void main( void ){char address;// configure software SPIOpenSWSPI();}for( address=0; address


软 件 外 设 函 数 库3.6 软 件 UART 函 数设 计 这 些 函 数 , 旨 在 使 用 PI<strong>C18</strong> 单 片 机 的 I/O 引 脚 来 实 现 UART 。 具 体 函 数 见 下 表 :表 3-11:函 数软 件 UART 函 数描 述getcUART 从 软 件 UART 中 读 取 一 字 节 。getsUART 从 软 件 UART 中 读 取 一 个 字 符 串 。OpenUART 配 置 用 于 UART 的 I/O 引 脚 。putcUART写 一 个 字 节 到 软 件 UART。putsUART写 一 个 字 符 串 到 软 件 UART。ReadUART 从 软 件 UART 中 读 取 一 个 字 节 。WriteUART写 一 个 字 节 到 软 件 UART。这 些 函 数 的 预 编 译 形 式 使 用 默 认 的 引 脚 分 配 。 通 过 重 新 定 义 文 件 writuart.asm、readuart.asm 和 openuart.asm 中 的 equate (equ) 语 句 , 可 以 改 变 引 脚 分 配 。 这 些文 件 包 含 在 编 译 器 安 装 目 录 的 src/traditional/pmc/sw_uart 或scr/extended/pmc/sw_uart 子 目 录 中 。表 3-12:LCD控 制 器线TX 引 脚用 于 选 择 UART 引 脚 分 配 的 宏定 义 默 认 值 用 途SWTXDPORTB 用 于 发 送 线 的 端 口 。SWTXDpin4SWTXD 端 口 中 用 于 TX 线 的 位 。TRIS_SWTXDTRISB与 用 于 TX 线 的 端 口 相 关 的 数 据 方 向 寄 存器 。RX 引 脚SWRXDPORTB用 于 接 收 线 的 端 口 。SWRXDpin5SWTXD 端 口 中 用 于 RX 线 的 位 。TRIS_SWRXDTRISB与 用 于 RX 线 的 端 口 相 关 的 数 据 方 向 寄 存器 。更 改 这 些 定 义 后 , 用 户 必 须 重 新 编 译 软 件 UART 子 程 序 , 然 后 在 项 目 中 包 含 更 新 过 的文 件 。 这 可 通 过 把 软 件 UART 源 文 件 添 加 到 项 目 中 , 或 使 用 MPLAB <strong>C18</strong> 编 译 器 安 装目 录 中 提 供 的 批 处 理 文 件 重 新 编 译 库 文 件 来 完 成 。UART 函 数 库 还 要 求 用 户 定 义 下 列 函 数 , 以 提 供 适 当 的 延 时 :表 3-13:软 件 UART 延 时 函 数函 数功 能DelayTXBitUART 延 时 :((((2*FOSC) / (4*baud)) + 1) / 2) - 12 周 期DelayRXHalfBitUART 延 时 :((((2*FOSC) / (8*baud)) + 1) / 2) - 9 周 期DelayRXBitUART 延 时 :((((2*FOSC) / (4*baud)) + 1) / 2) - 14 周 期© 2004 Microchip Technology Inc. DS51297C_CN 第 103 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库3.6.1 函 数 描 述getcUART参 见 ReadUART。getsUART功 能 : 从 软 件 UART 中 读 取 一 个 字 符 串 。包 含 头 文 件 :原 型 :参 数 :说 明 :文 件 名 :代 码 示 例 :sw_uart.hvoid getsUART( char * buffer,unsigned char len);buffer指 向 从 软 件 UART 中 读 取 字 符 串 的 指 针 。len要 从 软 件 UART 中 读 取 的 字 符 数 。该 函 数 从 软 件 UART 中 读 取 len 个 字 符 , 并 放 入 buffer。getsuart.cchar 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 [20];putsUART( mybuff );DS51297C_CN 第 104 页© 2004 Microchip Technology Inc.


软 件 外 设 函 数 库ReadUARTgetcUART功 能 : 从 软 件 UART 读 取 一 个 字 节 。包 含 头 文 件 : sw_uart.h原 型 : char ReadUART( void );说 明 : 该 函 数 从 软 件 UART 读 取 一 个 数 据 字 节 。返 回 值 : 返 回 从 软 件 UART 的 接 收 数 据 (RXD) 引 脚 读 取 的 数 据 字 节 。文 件 名 :readuart.asm代 码 示 例 : char x;x = ReadUART();WriteUARTputcUART功 能 :写 一 个 字 节 到 软 件 UART。包 含 头 文 件 : sw_uart.h原 型 : void WriteUART( char data );参 数 ׸½¨: data要 写 到 软 件 UART 的 数 据 字 节 。说 明 :该 函 数 将 指 定 的 数 据 字 节 写 到 软 件 UART。文 件 名 :writuart.asm代 码 示 例 :char x = ‘H’;WriteUART( x );3.6.2 使 用 示 例#include #include void main( void ){char data// configure software UARTOpenUART();}while( 1 ){data = ReadUART();WriteUART( data );}//read a byte//bounce it back© 2004 Microchip Technology Inc. DS51297C_CN 第 105 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库注 :DS51297C_CN 第 106 页© 2004 Microchip Technology Inc.


第 4 章 通 用 软 件 函 数 库MPLAB ® <strong>C18</strong> C 编 译 器函 数 库4.1 简 介本 章 讲 述 预 编 译 标 准 C 库 文 件 中 的 通 用 软 件 库 函 数 。 所 有 这 些 函 数 的 源 代 码 都 包 含 在MPLAB <strong>C18</strong> 编 译 器 安 装 目 录 的 如 下 子 目 录 中 :• src\traditional\stdlib• src\extended\stdlib• src\traditional\delays• src\extended\delaysMPLAB <strong>C18</strong> 函 数 库 支 持 如 下 函 数 类 别 :• 字 符 分 类 函 数• 数 据 转 换 函 数• 延 时 函 数• 存 储 器 和 字 符 串 操 作 函 数4.2 字 符 分 类 函 数这 些 函 数 与 ANSI 1989 标 准 C 库 函 数 中 的 同 名 函 数 是 一 致 的 , 见 下 表 :表 4-1:函 数字 符 分 类 函 数描 述isalnum 确 定 字 符 是 否 为 字 母 数 字 。isalpha 确 定 字 符 是 否 为 字 母 。iscntrl 确 定 字 符 是 否 为 控 制 字 符 。isdigit 确 定 字 符 是 否 为 十 进 制 数 字 。isgraph 确 定 字 符 是 否 为 图 形 字 符 。islower 确 定 字 符 是 否 为 小 写 字 母 。isprint 确 定 字 符 是 否 为 可 打 印 字 符 。ispunct 确 定 字 符 是 否 为 标 点 字 符 。isspace 确 定 字 符 是 否 为 空 白 字 符 。isupper 确 定 字 符 是 否 为 大 写 字 母 。isxdigit 确 定 字 符 是 否 为 十 六 进 制 数 字 。© 2004 Microchip Technology Inc. DS51297C_CN 第 107 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库4.2.1 函 数 描 述isalnum功 能 : 确 定 字 符 是 否 为 字 母 数 字 。包 含 头 文 件 : ctype.h原 型 : unsigned char isalnum( unsigned char ch );参 数 :ch要 检 查 的 字 符 。说 明 :如 果 字 符 在 “A” 到 “Z”,“a” 到 “z” 或 者 “0” 到 “9” 的 范 围内 , 就 认 为 它 是 字 母 数 字 。返 回 值 : 如 果 是 字 母 数 字 , 返 回 非 0 ;否 则 , 返 回 0。文 件 名 :isalnum.cisalpha功 能 : 确 定 字 符 是 否 为 字 母 。包 含 头 文 件 : ctype.h原 型 : unsigned char isalpha( unsigned char ch );参 数 :ch要 检 查 的 字 符 。说 明 :如 果 字 符 在 “A” 到 “Z” 或 者 “a” 到 “z” 的 范 围 内 , 就 认 为 它 是 字母 。返 回 值 : 如 果 字 符 是 字 母 , 返 回 非 0 ;否 则 , 返 回 0。文 件 名 :isalpha.ciscntrl功 能 : 确 定 字 符 是 否 为 控 制 字 符 。包 含 头 文 件 : ctype.h原 型 : unsigned char iscntrl( unsigned char ch );参 数 :ch要 检 查 的 字 符 。说 明 :如 果 字 符 不 是 由 isprint() 定 义 的 可 打 印 字 符 , 则 认 为 它 是 控 制 字符 。返 回 值 : 如 果 字 符 为 控 制 符 , 返 回 非 0 ;否 则 , 返 回 0。文 件 名 :iscntrl.cDS51297C_CN 第 108 页© 2004 Microchip Technology Inc.


通 用 软 件 函 数 库isdigit功 能 : 确 定 字 符 是 否 为 十 进 制 数 字 。包 含 头 文 件 : ctype.h原 型 : unsigned char isdigit( unsigned char ch );参 数 :ch要 检 查 的 字 符 。说 明 : 如 果 字 符 在 “0” 到 “9” 范 围 内 , 就 认 为 它 是 十 进 制 数 字 。返 回 值 : 如 果 字 符 是 十 进 制 数 字 , 返 回 非 0 ;否 则 , 返 回 0。文 件 名 :isdigit.cisgraph功 能 : 确 定 字 符 是 否 为 图 形 字 符 。包 含 头 文 件 : ctype.h原 型 : unsigned char isgraph( unsigned char ch );参 数 :ch要 检 查 的 字 符 。说 明 : 如 果 字 符 是 除 空 格 外 的 任 何 可 打 印 字 符 , 就 认 为 它 是 图 形 字 符 。返 回 值 : 如 果 字 符 是 图 形 字 符 , 返 回 非 0 ;否 则 , 返 回 0。文 件 名 :isgraph.cislower功 能 : 确 定 字 符 是 否 为 小 写 字 母 。包 含 头 文 件 : ctype.h原 型 : unsigned char islower( unsigned char ch );参 数 :ch要 检 查 的 字 符 。说 明 : 如 果 字 符 在 “a” 到 “z” 范 围 内 , 就 认 为 它 是 小 写 字 母 。返 回 值 : 如 果 字 符 是 小 写 字 母 , 返 回 非 0 ;否 则 , 返 回 0。文 件 名 :islower.c© 2004 Microchip Technology Inc. DS51297C_CN 第 109 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库isprint功 能 : 确 定 字 符 是 否 为 可 打 印 字 符 。包 含 头 文 件 : ctype.h原 型 : unsigned char isprint( unsigned char ch );参 数 :ch要 检 查 的 字 符 。说 明 :如 果 字 符 是 在 0x20 至 0x7e ( 包 括 0x20 和 0x7e) 范 围 内 , 就 认 为 它是 可 打 印 字 符 。返 回 值 : 如 果 字 符 是 可 打 印 字 符 , 返 回 非 0 ;否 则 , 返 回 0。文 件 名 :isprint.cispunct功 能 : 确 定 字 符 是 否 为 标 点 字 符 。包 含 头 文 件 : ctype.h原 型 : unsigned char ispunct( unsigned char ch );参 数 :ch要 检 查 的 字 符 。说 明 :如 果 字 符 是 可 打 印 字 符 , 且 既 不 是 空 格 , 也 不 是 字 母 数 字 字 符 , 则 认 为它 是 标 点 字 符 。返 回 值 : 如 果 字 符 是 标 点 字 符 , 返 回 非 0 ;否 则 , 返 回 0。文 件 名 :ispunct.cisspace功 能 : 确 定 字 符 是 否 为 空 白 字 符 。包 含 头 文 件 : ctype.h原 型 :unsigned char isspace (unsigned char ch);参 数 :ch要 检 查 的 字 符 。说 明 :如 果 字 符 属 于 下 列 一 种 : 空 格 (“ ”)、 制 表 符 (“\t”)、 回 车 符(“\r”)、 换 行 符 (“\n”)、 换 页 符 (“\f”) 或 者 垂 直 制 表 符(“\v”), 则 认 为 它 是 空 白 字 符 。返 回 值 : 如 果 字 符 是 空 白 字 符 , 返 回 非 0 ;否 则 , 返 回 0。文 件 名 :isspace.cDS51297C_CN 第 110 页© 2004 Microchip Technology Inc.


通 用 软 件 函 数 库isupper功 能 : 确 定 字 符 是 否 为 大 写 字 母 。包 含 头 文 件 : ctype.h原 型 :unsigned char isupper (unsigned char ch);参 数 :ch要 检 查 的 字 符 。说 明 : 如 果 字 符 在 “A” 到 “Z” 范 围 内 , 就 认 为 它 是 大 写 字 母 字 符 。返 回 值 : 如 果 字 符 是 大 写 字 母 字 符 , 返 回 非 0 ;否 则 , 返 回 0。文 件 名 :isupper.cisxdigit功 能 : 确 定 字 符 是 否 为 十 六 进 制 数 字 。包 含 头 文 件 : ctype.h原 型 : unsigned char isxdigit( unsigned char ch );参 数 :ch要 检 查 的 字 符 。说 明 :如 果 字 符 在 “0” 到 “9”, “a” 到 “f” 或 ” “A” 到 “F” 范 围内 , 就 认 为 它 是 十 六 进 制 数 字 字 符 。返 回 值 : 如 果 字 符 是 十 六 进 制 数 字 字 符 , 返 回 非 0 ;否 则 , 返 回 0。文 件 名 :isxdig.c© 2004 Microchip Technology Inc. DS51297C_CN 第 111 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库4.3 数 据 转 换 函 数除 非 在 函 数 描 述 中 另 有 注 明 , 这 些 函 数 和 ANSI 1989 标 准 C 库 函 数 中 的 同 名 函 数 是 一致 的 。 具 体 函 数 见 下 表 :表 4-2:函 数数 据 转 换 函 数描 述atob 将 一 个 字 符 串 转 换 为 8 位 有 符 号 数 。atof 将 一 个 字 符 串 转 换 为 浮 点 数 。atoi 将 一 个 字 符 串 转 换 为 16 位 有 符 号 整 型 。atol 将 一 个 字 符 串 转 换 为 长 整 型 。btoa 将 一 个 8 位 有 符 号 数 转 换 为 字 符 串 。itoa 将 一 个 16 位 有 符 号 整 型 转 换 为 字 符 串 。ltoa 将 有 符 号 长 整 型 转 换 为 字 符 串 。rand 生 成 一 个 伪 随 机 整 数 。srand 设 置 伪 随 机 数 字 发 生 器 的 种 子 ( 初 始 值 )。tolower 将 字 符 转 换 为 小 写 字 母 的 ASCII 字 符 。toupper 将 字 符 转 换 为 大 写 字 母 的 ASCII 字 符 。ultoa 将 无 符 号 长 整 型 转 换 为 字 符 串 。4.3.1 函 数 描 述atob功 能 : 将 一 个 字 符 串 转 换 为 一 个 8 位 有 符 号 数 。包 含 头 文 件 : stdlib.h原 型 : signed char atob( const char * s );参 数 :s指 向 要 转 换 的 ASCII 字 符 串 的 指 针 。说 明 :该 函 数 将 ASCII 字 符 串 s 转 换 为 8 位 有 符 号 数 (-128 到 127)。 输 入的 字 符 串 必 须 以 10 为 基 数 ( 十 进 制 ), 且 可 以 字 符 指 示 符 号 (“+” 或“-”) 开 始 。 溢 出 结 果 未 定 义 。 该 函 数 是 MPLAB <strong>C18</strong> 对 ANSI 标 准 函数 库 的 扩 展 。返 回 值 : -128 到 127 范 围 内 所 有 字 符 串 的 8 位 有 符 号 数 。文 件 名 :atob.asmatof功 能 : 将 一 个 字 符 串 转 换 为 浮 点 数 。包 含 头 文 件 : stdlib.h原 型 : double atof ( const char * s );参 数 :s指 向 要 转 换 的 ASCII 字 符 串 的 指 针 。说 明 :该 函 数 将 ASCII 字 符 串 s 转 换 为 浮 点 数 。 以 下 是 可 识 别 的 浮 点 字 符 串 示例 :-3.14151.0E21.0E+21.0E-2返 回 值 : 函 数 返 回 转 换 的 结 果 。文 件 名 :atof.cDS51297C_CN 第 112 页© 2004 Microchip Technology Inc.


通 用 软 件 函 数 库atoi功 能 : 将 一 个 字 符 串 转 换 为 16 位 有 符 号 整 数 。包 含 头 文 件 : stdlib.h原 型 : int atoi( const char * s );参 数 :s指 向 要 转 换 的 ASCII 字 符 串 的 指 针 。说 明 :返 回 值 :文 件 名 :该 函 数 将 ASCII 字 符 串 s 转 换 为 16 位 有 符 号 整 型 (-32768 到32767)。 输 入 的 字 符 串 必 须 以 10 为 基 数 ( 十 进 制 ), 且 可 以 指 示 符 号(“+” 或 “-”) 开 始 。 溢 出 结 果 未 定 义 。 该 函 数 是 MPLAB <strong>C18</strong> 对ANSI 标 准 函 数 库 的 扩 展 。在 -32768 到 32767 范 围 内 所 有 字 符 串 的 16 位 有 符 号 整 型atoi.asmatol功 能 : 将 一 个 字 符 串 转 换 为 长 整 型 表 示 。包 含 头 文 件 : stdlib.h原 型 : long atol( const char * s );参 数 :s指 向 要 转 换 的 ASCII 字 符 串 的 指 针 。说 明 :该 函 数 将 ASCII 字 符 串 s 转 换 为 长 整 型 。 输 入 的 字 符 串 必 须 以 10 为 基数 ( 十 进 制 ), 且 可 以 指 示 符 号 (“+” 或 “-”) 开 始 。 溢 出 结 果 未 定义 。 该 函 数 是 MPLAB <strong>C18</strong> 对 ANSI 标 准 函 数 库 的 扩 展 。返 回 值 : 返 回 转 换 的 结 果 。文 件 名 :atol.asmbtoa功 能 : 将 一 个 8 位 有 符 号 数 转 换 为 字 符 串 。包 含 头 文 件 :原 型 :参 数 :stdlib.hchar * btoa( signed char value,char * string );value8 位 有 符 号 数 。string指 向 保 存 结 果 的 ASCII 字 符 串 的 指 针 。 string 必 须 足 够 长 才 能 保 存ASCII 表 示 , 包 括 负 值 的 符 号 字 符 和 结 尾 的 空 字 符 。说 明 : 该 函 数 将 参 数 value 中 的 8 位 有 符 号 数 转 换 为 ASCII 字 符 串 。该 函 数 是 MPLAB <strong>C18</strong> 对 ANSI 所 需 函 数 库 的 扩 展 。返 回 值 : 指 向 结 果 string 的 指 针 。文 件 名 :btoa.asm© 2004 Microchip Technology Inc. DS51297C_CN 第 113 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库itoa功 能 : 将 16 位 有 符 号 整 型 转 换 为 字 符 串 。包 含 头 文 件 :原 型 :参 数 :stdlib.hchar * itoa( int value,char * string );value16 位 有 符 号 整 型 。string指 向 保 存 结 果 的 ASCII 字 符 串 的 指 针 。 string 必 须 足 够 长 才 能 保 存ASCII 表 示 , 包 括 负 值 的 符 号 字 符 和 结 尾 的 空 字 符 。说 明 : 该 函 数 将 参 数 value 中 的 16 位 有 符 号 整 型 转 换 为 ASCII 字 符 串 表 示 。该 函 数 是 MPLAB <strong>C18</strong> 对 ANSI 所 需 函 数 库 的 扩 展 。返 回 值 : 指 向 结 果 string 的 指 针 。文 件 名 :itoa.asm功 能 : 将 16 位 有 符 号 整 型 转 换 为 字 符 串 。ltoa功 能 : 将 有 符 号 长 整 型 转 换 为 字 符 串 。包 含 头 文 件 : stdlib.h原 型 :char * ltoa( long value,char * string );参 数 :value要 转 换 的 有 符 号 长 整 型 。string指 向 保 存 结 果 的 ASCII 字 符 串 的 指 针 。说 明 : 该 函 数 将 参 数 value 中 的 有 符 号 长 整 型 转 换 为 ASCII 字 符 串 。string 必 须 足 够 长 才 能 保 存 ASCII 表 示 , 包 括 负 值 的 符 号 字 符 和 结 尾 的空 字 符 。 该 函 数 是 MPLAB <strong>C18</strong> 对 ANSI 所 需 函 数 库 的 扩 展 。返 回 值 : 指 向 结 果 string 指 针 。文 件 名 :ltoa.asmrand功 能 : 生 成 一 个 伪 随 机 整 型 。包 含 头 文 件 : stdlib.h原 型 : int rand( void );说 明 :调 用 该 函 数 会 返 回 [0,32767] 范 围 内 的 一 个 伪 随 机 整 数 。 为 了 有 效 使 用该 函 数 , 必 须 使 用 srand() 函 数 来 设 置 随 机 数 字 发 生 器 的 初 始 值 。 当使 用 相 同 的 初 始 值 时 , 该 函 数 总 会 返 回 相 同 的 整 数 序 列 。返 回 值 : 一 个 伪 随 机 整 数 。文 件 名 :rand.asmDS51297C_CN 第 114 页© 2004 Microchip Technology Inc.


通 用 软 件 函 数 库srand功 能 : 为 伪 随 机 数 字 序 列 设 置 初 始 值 。包 含 头 文 件 : stdlib.h原 型 : void srand( unsigned int seed );参 数 :seed伪 随 机 数 字 序 列 的 初 始 值 。说 明 :该 函 数 为 rand() 函 数 生 成 的 伪 随 机 数 字 序 列 设 置 初 始 值 。 当 使 用 相 同的 初 始 值 时 , rand() 函 数 总 会 返 回 相 同 的 整 数 序 列 。 如 果 在 调 用rand() 以 前 , 未 调 用 srand(), 则 生 成 的 数 字 序 列 与 以 初 始 值 1 调 用 了srand() 函 数 时 相 同 。文 件 名 :rand.asmtolower功 能 : 将 字 符 转 换 为 小 写 字 母 ASCII 字 符 。包 含 头 文 件 : ctype.h原 型 : char tolower( char ch );参 数 :ch要 转 换 的 字 符 。说 明 :假 如 参 数 是 有 效 大 写 字 母 字 符 , 则 该 函 数 会 将 ch 转 换 为 小 写 字 母ASCII 字 符 。返 回 值 : 如 果 参 数 是 大 写 字 母 字 符 , 则 返 回 小 写 字 符 ; 否 则 返 回 原 字 符 。文 件 名 :tolower.ctoupper功 能 : 将 字 符 转 换 为 大 写 字 母 ASCII 字 符 。包 含 头 文 件 : ctype.h原 型 : char toupper( char ch );参 数 :ch要 转 换 的 字 符 。说 明 :假 如 参 数 是 有 效 的 小 写 字 母 字 符 , 则 该 函 数 会 将 ch 转 换 为 大 写 字 母ASCII 字 符 。返 回 值 : 如 果 参 数 是 大 写 字 母 字 符 , 则 返 回 小 写 字 符 ; 否 则 返 回 原 字 符 。文 件 名 :toupper.c© 2004 Microchip Technology Inc. DS51297C_CN 第 115 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库ultoa功 能 : 将 无 符 号 长 整 型 转 换 为 字 符 串 。包 含 头 文 件 : stdlib.h原 型 :char * ultoa( unsigned long value,char * string);参 数 :value要 转 换 的 无 符 号 长 整 型 。string指 向 保 存 结 果 的 ASCII 字 符 串 的 指 针 。说 明 : 该 函 数 将 参 数 value 中 的 无 符 号 长 整 型 转 换 为 ASCII 字 符 串 表 示 。string 必 须 足 够 长 才 能 保 存 ASCII 表 示 , 包 括 负 值 的 符 号 字 符 和 结 尾 的空 字 符 。 该 函 数 是 MPLAB <strong>C18</strong> 对 ANSI 所 需 函 数 库 的 扩 展 。返 回 值 : 指 向 结 果 string 的 指 针 。文 件 名 :ultoa.asmDS51297C_CN 第 116 页© 2004 Microchip Technology Inc.


通 用 软 件 函 数 库4.4 存 储 器 和 字 符 串 操 作 函 数除 非 在 函 数 描 述 中 另 有 注 明 , 这 些 函 数 和 ANSI (1989) 标 准 C 库 函 数 中 的 同 名 函 数是 一 致 的 。 具 体 函 数 见 下 表 :表 4-3:函 数存 储 器 和 字 符 串 操 作 函 数描 述memchr 在 指 定 的 存 储 区 中 查 找 某 个 值 。memcmpmemcmppgmmemcmppgm2rammemcmpram2pgmmemcpymemcpypgm2rammemmovememmovepgm2ram比 较 两 个 数 组 的 内 容 。将 一 个 缓 冲 区 从 数 据 存 储 器 或 程 序 存 储 器 复 制 到 数 据 存 储 器 。将 一 个 缓 冲 区 从 数 据 存 储 器 或 程 序 存 储 器 复 制 到 数 据 存 储 器 。memset 用 某 个 重 复 的 值 初 始 化 数 组 。strcatstrcatpgm2ram将 源 字 符 串 的 拷 贝 添 加 到 目 标 字 符 串 的 末 尾 。strchr 查 找 某 个 值 在 字 符 串 中 首 次 出 现 的 位 置 。strcmpstrcmppgm2ramstrcpystrcpypgm2ram比 较 两 个 字 符 串 。将 一 个 字 符 串 从 数 据 存 储 器 或 程 序 存 储 器 复 制 到 数 据 存 储 器 。strcspn 计 算 从 字 符 串 开 头 不 包 含 在 另 一 组 字 符 中 的 连 续 字 符 数 。strlen 确 定 字 符 串 的 长 度 。strlwr 将 字 符 串 中 所 有 大 写 字 符 转 换 为 小 写 。strncatstrncatpgm2ram将 源 字 符 串 中 指 定 数 目 的 字 符 添 加 到 目 标 字 符 串 的 末 尾 。strncmp 比 较 两 个 字 符 串 , 直 到 指 定 的 字 符 数 。strncpystrncpypgm2ram将 源 字 符 串 中 的 字 符 复 制 到 目 标 字 符 串 , 直 到 指 定 的 字 符 数 。strpbrk 查 找 一 组 字 符 中 的 某 个 字 符 在 另 一 个 字 符 串 中 首 次 出 现 的 位 置 。strrchr 在 字 符 串 中 查 找 指 定 字 符 最 后 一 次 出 现 的 位 置 。strspn 计 算 从 字 符 串 开 头 包 含 在 另 一 组 字 符 中 的 连 续 字 符 数 。strstr 查 找 某 字 符 串 在 另 一 字 符 串 中 首 次 出 现 的 位 置 。strtok将 空 字 符 插 入 到 指 定 的 分 隔 符 处 , 把 某 个 字 符 串 分 隔 为 子 字 符 串 或 符号 。strupr 将 某 个 字 符 串 中 的 所 有 小 写 字 符 转 换 为 大 写 。© 2004 Microchip Technology Inc. DS51297C_CN 第 117 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库4.4.1 函 数 描 述memchr函 数 : 在 指 定 存 储 区 中 查 找 某 个 单 字 节 值 首 次 出 现 的 位 置 。包 含 头 文 件 : string.h原 型 :void * memchr( const void *mem,unsigned char c,size_t n);参 数 :mem指 向 存 储 区 的 指 针 。c要 查 找 的 单 字 节 值 。n查 找 的 最 大 字 节 数 。说 明 : 该 函 数 在 存 储 区 mem 中 查 找 n 个 字 节 , 查 找 c 首 次 出 现 的 位 置 。该 函 数 和 ANSI 中 指 定 函 数 的 不 同 之 处 在 于 , c 定 义 为 unsignedchar 参 数 , 而 不 是 int 参 数 。返 回 值 :文 件 名 :如 果 c 在 mem 的 前 n 个 字 节 中 出 现 , 则 函 数 返 回 指 向 mem 内 该 字 符 的指 针 ; 否 则 , 返 回 一 个 空 指 针 。memchr.asmmemcmpmemcmppgmmemcmppgm2rammemcmpram2pgm功 能 : 比 较 两 个 数 组 的 内 容 。包 含 头 文 件 : 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 );参 数 :buf1指 向 第 一 个 数 组 的 指 针 。buf2指 向 第 二 个 数 组 的 指 针 。memsize数 组 中 要 比 较 的 元 素 个 数 。DS51297C_CN 第 118 页© 2004 Microchip Technology Inc.


通 用 软 件 函 数 库memcmpmemcmppgmmemcmppgm2rammemcmpram2pgm ( 续 )说 明 :该 函 数 将 buf1 中 前 memsize 个 字 节 与 buf2 中 前 memsize 个 字 节 进行 比 较 , 然 后 返 回 一 个 值 , 表 明 其 中 一 个 缓 冲 区 是 小 于 、 等 于 还 是 大 于另 一 个 缓 冲 区 。返 回 值 : memcmp 的 返 回 值 :0 buf1 大 于 buf2文 件 名 :memcmp.asmmemcmpp2p.asmmemcmpp2r.asmmemcmpr2p.asmmemcpymemcpypgm2ram功 能 : 将 源 缓 冲 区 的 内 容 复 制 到 目 标 缓 冲 区 。包 含 头 文 件 : string.h原 型 :void * memcpy(void * dest,const void * src,size_t memsize );void * memcpypgm2ram(void * dest,const rom void * src,sizeram_t memsize );参 数 :dest指 向 目 标 数 组 的 指 针 。src指 向 源 数 组 的 指 针 。memsize从 src 数 组 复 制 到 dest 数 组 的 字 节 数 。说 明 :该 函 数 将 src 中 前 memsize 个 字 节 复 制 到 数 组 dest。 如 果 src 与dest 地 址 有 重 叠 , 则 无 法 执 行 此 操 作 ( 未 定 义 )。返 回 值 : 返 回 dest 的 值 。文 件 名 :memcpy.asmmemcpyp2r.asm© 2004 Microchip Technology Inc. DS51297C_CN 第 119 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库memmovememmovepgm2ram功 能 : 将 源 缓 冲 区 中 内 容 复 制 到 目 标 缓 冲 区 , 即 使 两 者 的 地 址 重 叠 。包 含 头 文 件 : string.h原 型 :void * memmove( void * dest,const void * src,size_t memsize );void * memmovepgm2ram(void * dest,const rom void * src,sizeram_t memsize );参 数 :dest指 向 目 标 数 组 的 指 针 。src指 向 源 数 组 的 指 针 。memsize从 src 复 制 到 dest 的 字 节 数 。说 明 :该 函 数 将 src 中 前 memsize 字 节 复 制 到 dest 数 组 。 即 使 src 与dest 地 址 重 叠 , 该 函 数 也 能 正 确 执 行 。返 回 值 : 返 回 dest 的 值 。文 件 名 :memmove.asmmemmovp2r.asmmemset功 能 : 将 指 定 字 符 复 制 到 目 标 数 组 。包 含 头 文 件 : string.h原 型 :void * memset( void * dest,unsigned char value,size_t memsize );参 数 :dest指 向 目 标 数 组 的 指 针 。value要 复 制 的 字 符 值 。memsizedest 中 将 value 复 制 到 的 字 节 数 。说 明 :该 函 数 将 字 符 value 复 制 到 数 组 dest 的 前 memsize 个 字 节 。 该 函 数与 ANSI 中 指 定 函 数 的 不 同 之 处 在 于 , value 定 义 为 unsigned char型 , 而 不 是 int 参 数 。返 回 值 : 返 回 dest 的 值 。文 件 名 :memset.asmDS51297C_CN 第 120 页© 2004 Microchip Technology Inc.


通 用 软 件 函 数 库strcatstrcatpgm2ram功 能 : 将 源 字 符 串 的 一 个 拷 贝 添 加 到 目 标 字 符 串 的 末 尾 。包 含 头 文 件 : string.h原 型 :char * strcat( char * dest,const char * src );char * strcatpgm2ram(char * dest,const rom char * src );参 数 :dest指 向 目 标 数 组 的 指 针 。src指 向 源 数 组 的 指 针 。说 明 :该 函 数 将 src 中 的 字 符 串 复 制 到 dest 中 字 符 串 的 末 尾 , 且 从 dest 中的 空 字 符 处 开 始 添 加 src 字 符 串 。 添 加 后 , 在 dest 的 末 尾 处 , 将 加 上一 个 空 字 符 。 如 果 src 与 dest 地 址 有 重 叠 , 则 无 法 执 行 此 操 作 ( 未定 义 )。返 回 值 : 返 回 dest 的 值 。文 件 名 :strcat.asmscatp2r.asmstrchr功 能 : 查 找 指 定 字 符 在 字 符 串 中 首 次 出 现 的 位 置 。包 含 头 文 件 : string.h原 型 :char * strchr( const char * str,const char c );参 数 :str指 向 要 查 找 的 字 符 串 的 指 针 。c要 查 找 的 字 符 。说 明 : 该 函 数 查 找 字 符 串 str, 找 出 字 符 c 首 次 出 现 的 位 置 。此 函 数 和 ANSI 中 指 定 函 数 的 不 同 之 处 在 于 , c 定 义 为 unsignedchar 参 数 , 而 不 是 int 型 参 数 。返 回 值 :文 件 名 :如 果 c 出 现 在 str 中 , 则 返 回 指 向 str 中 此 字 符 的 指 针 。 否 则 , 返 回一 个 空 指 针 。strchr.asm© 2004 Microchip Technology Inc. DS51297C_CN 第 121 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库strcmpstrcmppgm2ram功 能 : 比 较 两 个 字 符 串 。包 含 头 文 件 : string.h原 型 :signed char strcmp(const char * str1,const char * str2 );signed char strcmppgm2ram(const char * str1,const rom char * str2 );参 数 :str1指 向 第 一 个 字 符 串 的 指 针 。str2指 向 第 二 个 字 符 串 的 指 针 。说 明 :该 函 数 将 str1 中 的 字 符 串 与 str2 中 的 字 符 串 进 行 比 较 , 且 返 回 一 个值 , 表 明 str1 是 小 于 、 等 于 还 是 大 于 str2。返 回 值 : strcmp 返 回 的 值 :0 str1 大 于 str2文 件 名 :strcmp.asmscmpp2r.asmstrcpystrcpypgm2ram功 能 : 将 源 字 符 串 复 制 到 目 标 字 符 串 。包 含 头 文 件 : string.h原 型 :char * strcpy( char * dest,const char * src );char * strcpypgm2ram(char * dest,const rom char *src );参 数 :dest指 向 目 标 字 符 串 的 指 针 。src指 向 源 字 符 串 的 指 针 。说 明 :该 函 数 将 src 中 的 字 符 串 复 制 到 dest 中 , 且 所 复 制 的 字 符 包 括 src中 的 终 止 空 字 符 。 如 果 src 与 dest 地 址 有 重 叠 , 则 无 法 执 行 此 操 作( 未 定 义 )。返 回 值 : 返 回 dest 的 值 。文 件 名 :strcpy.asmscpyp2r.asmDS51297C_CN 第 122 页© 2004 Microchip Technology Inc.


通 用 软 件 函 数 库strcspn功 能 : 计 算 从 字 符 串 开 头 不 包 含 在 另 一 组 字 符 中 的 连 续 字 符 数 。包 含 头 文 件 : string.h原 型 :size_t * strcspn( const char * str1,const char * str2 );参 数 :str1指 向 要 查 找 字 符 串 的 指 针 。str2指 向 视 为 另 一 组 字 符 的 字 符 串 的 指 针 。说 明 :该 函 数 确 定 从 str1 中 首 字 符 开 始 不 包 含 在 str2 中 的 连 续 字 符 数 。 例如 :str1 str2 结 果"hello" "aeiou" 1"antelope" "aeiou" 0"antelope" "xyz" 8返 回 值 :文 件 名 :如 上 例 所 示 , 该 函 数 返 回 str1 中 首 字 符 开 始 不 包 含 在 str2 中 的 连 续字 符 数 。strcspn.asmstrlen功 能 : 返 回 字 符 串 的 长 度 。包 含 头 文 件 : string.h原 型 : size_t strlen( const char * str );参 数 :str指 向 字 符 串 的 指 针 。说 明 : 该 函 数 确 定 字 符 串 的 长 度 , 但 不 包 括 结 尾 的 空 字 符 。返 回 值 : 返 回 字 符 串 的 长 度 。文 件 名 :strlen.asmstrlwr功 能 : 将 字 符 串 中 所 有 大 写 字 符 转 换 为 小 写 。包 含 头 文 件 : string.h原 型 : char * strlwr( char * str );参 数 :str指 向 字 符 串 的 指 针 。说 明 :该 函 数 将 str 中 所 有 大 写 字 符 转 换 为 小 写 字 符 , 不 会 影 响 在 大 写 字 符(A 到 Z) 范 围 内 的 字 符 。返 回 值 : 返 回 str 的 值 。文 件 名 :strlwr.asm© 2004 Microchip Technology Inc. DS51297C_CN 第 123 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库strncatstrncatpgm2ram功 能 : 将 源 字 符 串 中 指 定 数 目 的 字 符 添 加 到 目 标 字 符 串 。包 含 头 文 件 : string.h原 型 :char * strncat( char * dest,const char * src,size_t n );char * strncatpgm2ram(char * dest,const rom char * src,sizeram_t n );参 数 :dest指 向 目 标 数 组 的 指 针 。src指 向 源 数 组 的 指 针 。n要 添 加 的 字 符 数 。说 明 :该 函 数 将 src 字 符 串 中 的 n 个 字 符 添 加 到 dest 字 符 串 的 末 尾 。 如 果 在n 个 字 符 复 制 完 前 也 复 制 了 空 字 符 , 则 这 些 空 字 符 将 添 加 到 dest, 直 到正 好 添 加 了 n 个 字 符 。如 果 src 和 dest 地 址 有 重 叠 , 则 无 法 执 行 此 操 作 ( 未 定 义 )。如 果 没 有 遇 到 空 字 符 , 则 不 会 添 加 空 字 符 。返 回 值 : 返 回 dest 的 值 。文 件 名 :strncat.asmsncatp2r.asmstrncmp功 能 : 比 较 两 个 字 符 串 , 直 到 指 定 的 字 符 数 。包 含 头 文 件 : string.h原 型 :signed char strncmp( const char * str1,const char * str2,size_t n );参 数 :str1指 向 第 一 个 数 组 的 指 针 。str2指 向 第 二 个 数 组 的 指 针 。n要 比 较 的 最 大 字 符 数 。说 明 :该 函 数 将 str1 中 的 字 符 串 与 str2 中 的 字 符 串 进 行 比 较 , 并 返 回 一 个值 , 表 明 str1 是 小 于 、 等 于 还 是 大 于 str2。 如 果 比 较 了 n 个 字 符后 , 没 有 发 现 差 别 , 则 该 函 数 会 返 回 一 个 值 , 表 明 两 个 字 符 串 是 相 等的 。返 回 值 : strncmp 根 据 str1 和 str2 之 间 的 第 一 个 不 同 字 符 返 回 下 列 值 :0 str1 大 于 str2文 件 名 :strncmp.asmDS51297C_CN 第 124 页© 2004 Microchip Technology Inc.


通 用 软 件 函 数 库strncpystrncpypgm2ram功 能 : 将 源 字 符 串 中 的 字 符 复 制 到 目 标 字 符 串 , 直 到 指 定 的 字 符 数 。包 含 头 文 件 : string.h原 型 :char * strncpy( char * dest,const char * src,size_t n );char *strncpypgm2ram(char * dest,const rom char * src,sizeram_t n );参 数 :dest指 向 目 标 字 符 串 的 指 针 。src指 向 源 字 符 串 的 指 针 。n要 复 制 的 最 大 字 符 数 。说 明 :该 函 数 将 src 中 的 字 符 串 复 制 到 dest。 当 遇 到 终 止 空 字 符 或 者 已 复 制n 个 字 符 时 , 复 制 结 束 。 如 果 复 制 了 n 个 字 符 而 没 有 空 字 符 , 则 dest 将不 会 以 空 字 符 结 束 。如 果 在 地 址 重 叠 的 对 象 之 间 复 制 , 则 无 法 执 行 此 操 作 ( 未 定 义 )。返 回 值 : 返 回 dest 的 值 。文 件 名 :strncpy.asmsncpyp2r.asmstrpbrk功 能 :包 含 头 文 件 :原 型 :参 数 :说 明 :返 回 值 :文 件 名 :查 找 指 定 的 一 组 字 符 中 包 含 的 某 个 字 符 在 另 一 个 字 符 串 中 首 次 出 现 的 位置 。string.hchar * strpbrk( const char * str1,const char * str2 );str1指 向 要 搜 索 的 字 符 串 。str2指 向 视 为 一 组 字 符 的 字 符 串 的 指 针 。该 函 数 将 搜 索 str1, 查 找 str2 中 包 含 的 某 个 字 符 在 str1 中 首 次 出现 的 位 置 。如 果 在 str1 中 找 到 str2 中 的 指 定 字 符 , 则 返 回 指 向 str1 中 那 个 字符 的 指 针 。 如 果 没 有 在 str1 中 找 到 str2 中 的 指 定 字 符 , 则 返 回 空 指针 。strpbrk.asm© 2004 Microchip Technology Inc. DS51297C_CN 第 125 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库strrchr功 能 : 查 找 字 符 串 中 指 定 字 符 最 后 一 次 出 现 的 位 置 。包 含 头 文 件 : string.h原 型 :char * strrchr( const char * str,const char c );参 数 :str指 向 要 查 找 字 符 串 的 指 针 。c要 查 找 的 字 符 。说 明 :该 函 数 对 包 括 终 止 空 字 符 在 内 的 字 符 串 str 进 行 搜 索 , 以 找 出 字 符 c最 后 一 次 出 现 的 位 置 。 该 函 数 与 ANSI 中 指 定 函 数 的 不 同 之 处 在 于 , c定 义 为 unsigned char 型 参 数 , 而 不 是 int 型 参 数 。返 回 值 :文 件 名 :如 果 c 在 str 中 出 现 , 则 返 回 指 向 str 中 该 字 符 的 指 针 ; 否 则 返 回 一个 空 指 针 。strrchr.asmstrspn功 能 : 计 算 从 字 符 串 首 字 符 开 始 、 包 含 在 另 一 组 字 符 中 的 连 续 字 符 数 。包 含 头 文 件 : string.h原 型 :size_t * strspn( const char * str1,const char * str2 );参 数 :str1指 向 要 查 找 的 字 符 串 。str2指 向 作 为 另 一 组 字 符 的 字 符 串 的 指 针 。说 明 :该 函 数 将 确 定 str1 中 首 字 符 开 始 、 包 含 在 str2 中 的 连 续 字 符 数 。 例如 :str1 str2 结 果"banana" "ab" 2"banana" "abn" 6"banana" "an" 0返 回 值 :文 件 名 :如 上 例 所 示 , 返 回 str1 中 首 字 符 开 始 、 包 含 在 str2 中 的 连 续 字 符数 。strspn.asmDS51297C_CN 第 126 页© 2004 Microchip Technology Inc.


通 用 软 件 函 数 库strstr功 能 : 查 找 某 个 字 符 串 在 另 一 字 符 串 中 首 次 出 现 的 位 置 。包 含 头 文 件 : string.h原 型 :char * strstr( const char * str,const char * substr );参 数 :str指 向 要 搜 索 的 字 符 串 。substr指 向 要 查 找 的 字 符 串 模 式 。说 明 :该 函 数 将 在 字 符 串 str 中 查 找 字 符 串 substr ( 空 字 符 除 外 ) 首 次 出现 的 位 置 。返 回 值 :如 果 找 到 了 字 符 串 , 返 回 指 向 str 中 该 字 符 串 的 指 针 。 否 则 , 返 回 一 个空 指 针 。文 件 名 :strstr.asmstrtok函 数 :包 含 头 文 件 :原 型 :将 空 字 符 插 入 到 指 定 的 分 隔 符 处 , 把 某 个 字 符 串 分 隔 为 子 字 符 串 或 者 符号 。string.hchar * strtok( char * str,const char * delim );参 数 :str指 向 要 搜 索 的 字 符 串 。delim指 向 表 明 符 号 结 尾 的 一 组 字 符 的 指 针 。说 明 : 该 函 数 通 过 将 空 字 符 插 入 到 指 定 的 字 符 处 , 把 字 符 串 分 隔 为 子 字 符 串 。在 第 一 次 对 某 个 字 符 串 调 用 此 函 数 时 , 该 字 符 串 要 传 递 给 str。 此 后 ,通 过 向 str 传 递 空 值 调 用 该 函 数 , 从 上 一 个 分 隔 符 继 续 解 析 该 字 符 串 。当 调 用 strtok 时 , 如 果 str 是 一 个 非 空 参 数 , 则 它 从 str 字 符 串 的首 字 符 开 始 搜 索 。 它 略 过 字 符 串 delim 中 出 现 的 所 有 前 导 字 符 , 然 后略 过 所 有 delim 中 没 有 出 现 的 字 符 , 最 后 将 下 一 字 符 设 为 空 字 符 。当 调 用 strtok 时 , 如 果 str 是 一 个 空 参 数 , 则 它 从 上 次 调 用 时 设 置为 空 的 字 符 后 面 一 个 字 符 开 始 , 查 找 最 新 检 测 过 的 字 符 串 。 它 略 过 所 有delim 中 没 有 出 现 的 字 符 , 然 后 将 下 一 字 符 设 为 空 字 符 。如 果 strtok 函 数 在 发 现 分 隔 符 前 遇 到 了 字 符 串 的 结 尾 , 则 它 不 会 修 改该 字 符 串 。在 每 次 调 用 strtok 函 数 时 , 传 递 给 delim 的 字 符 组 不 必 相 同 。返 回 值 :文 件 名 :如 果 找 到 分 隔 符 , 则 函 数 返 回 指 向 str 中 找 到 不 在 字 符 组 delim 中 的第 一 个 字 符 的 指 针 。 该 字 符 代 表 本 次 调 用 所 创 建 符 号 的 第 一 个 字 符 。如 果 在 遇 到 终 止 空 字 符 前 没 有 找 到 分 隔 符 , 则 返 回 一 个 空 指 针 。strtok.asm© 2004 Microchip Technology Inc. DS51297C_CN 第 127 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库strupr功 能 : 将 字 符 串 中 所 有 小 写 字 符 转 换 为 大 写 。包 含 头 文 件 : string.h原 型 : char * strupr( char * str );参 数 :str指 向 字 符 串 的 指 针 。说 明 :该 函 数 将 str 中 所 有 小 写 字 符 转 换 为 大 写 字 符 , 而 所 有 非 小 写 字 符 保 持不 变 。返 回 值 : 返 回 str 的 值 。文 件 名 :strupr.asmDS51297C_CN 第 128 页© 2004 Microchip Technology Inc.


通 用 软 件 函 数 库4.5 延 时 函 数延 时 函 数 执 行 需 要 若 干 个 处 理 器 指 令 周 期 的 代 码 。 对 于 基 于 时 间 的 延 时 , 必 须 考 虑 处理 器 的 工 作 频 率 。 具 体 函 数 见 下 表 :表 4-4:函 数延 时 函 数描 述Delay1TCY 延 时 一 个 指 令 周 期 。Delay10TCYx 延 时 10 的 整 数 倍 个 指 令 周 期 。Delay100TCYx 延 时 100 的 整 数 倍 个 指 令 周 期 。Delay1KTCYx 延 时 1,000 的 整 数 倍 个 指 令 周 期 。Delay10KTCYx 延 时 10,000 的 整 数 倍 个 指 令 周 期 。4.5.1 函 数 描 述Delay1TCY功 能 :延 时 1 个 指 令 周 期 (Tcy)。包 含 头 文 件 : delays.h原 型 : void Delay1TCY( void );说 明 :该 函 数 实 际 上 是 用 #define 定 义 的 NOP() 指 令 。 当 在 源 代 码 中 遇 到 该函 数 时 , 编 译 器 会 仅 仅 插 入 一 条 NOP() 指 令 。文 件 名 :delays.hDelay10TCYx功 能 :延 时 10 的 整 数 倍 个 指 令 周 期 (Tcy)。包 含 头 文 件 : delays.h原 型 : void Delay10TCYx( unsigned char unit );参 数 :unitunit 的 值 可 以 为 任 何 8 位 值 。 对 [1,255] 范 围 内 的 值 , 将 会 延 时 (unit *10) 个 周 期 。 值 为 0 时 则 延 时 2,560 个 周 期 。说 明 : 该 函 数 延 时 10 的 整 数 倍 个 指 令 周 期 。文 件 名 :d10tcyx.asmDelay100TCYx功 能 :延 时 100 的 整 数 倍 个 指 令 周 期 (Tcy)。包 含 头 文 件 : delays.h原 型 : void Delay100TCYx( unsigned char unit );参 数 :unitunit 的 值 可 以 为 任 何 8 位 值 。 对 [1,255] 范 围 内 的 值 , 将 会 延 时 (unit *100) 个 周 期 。 值 为 0 时 延 时 25,600 个 周 期 。说 明 : 该 函 数 延 时 100 的 整 数 倍 个 指 令 周 期 。文 件 名 :d100tcyx.asm© 2004 Microchip Technology Inc. DS51297C_CN 第 129 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库Delay1KTCYx功 能 :延 时 1,000 的 整 数 倍 个 指 令 周 期 (Tcy)。包 含 头 文 件 : delays.h原 型 : void Delay1KTCYx( unsigned char unit );参 数 :unitunit 的 值 可 以 为 任 何 8 位 值 。 对 [1,255] 范 围 内 的 值 , 将 会 延 时 (unit *1000) 个 周 期 。 值 为 0 时 延 时 256,000 个 周 期 。说 明 : 该 函 数 延 时 1,000 的 整 数 倍 个 指 令 周 期 。文 件 名 :d1ktcyx.asmDelay10KTCYx功 能 :延 时 10,000 的 整 数 倍 个 指 令 周 期 (Tcy)。包 含 头 文 件 : delays.h原 型 : void Delay10KTCYx( unsigned char unit );参 数 :unitunit 的 值 可 以 为 任 何 8 位 值 。 对 [1,255] 范 围 内 的 值 , 将 会 延 时 (unit *1000) 个 周 期 。 值 为 0 时 延 时 2,560,000 个 周 期 。说 明 : 该 函 数 延 时 10,000 的 整 数 倍 个 指 令 周 期 。文 件 名 :d10ktcyx.asmDS51297C_CN 第 130 页© 2004 Microchip Technology Inc.


通 用 软 件 函 数 库4.6 复 位 函 数复 位 函 数 可 用 来 帮 助 确 定 复 位 或 者 唤 醒 事 件 的 源 , 以 及 在 复 位 之 后 重 新 配 置 处 理 器 的状 态 。 具 体 函 数 见 下 表 :表 4-5:函 数复 位 函 数描 述isBOR 确 定 复 位 是 否 是 由 欠 压 复 位 电 路 引 起 的 。isLVD 确 定 复 位 是 否 是 由 检 测 到 低 电 压 条 件 引 起 的 。isMCLR 确 定 复 位 是 否 是 由 MCLR 引 脚 引 起 的 。isPOR 检 测 到 上 电 复 位 条 件 。isWDTTO 确 定 复 位 是 否 是 由 看 门 狗 定 时 器 超 时 引 起 的 。isWDTWU 确 定 唤 醒 是 否 是 由 看 门 狗 定 时 器 引 起 的 。isWU 检 测 单 片 机 从 休 眠 状 态 唤 醒 是 由 MCLR 引 脚 还 是 中 断 引 起 的 。StatusReset 置 位 POR 位 和 BOR 位 。注 :如 果 正 在 使 用 欠 压 复 位 (Brown-out Reset, BOR) 或 看 门 狗 定 时 器(Watchdog Timer, WDT), 则 必 须 在 头 文 件 reset.h 中 定 义 使 能 宏( 分 别 为 #define BOR_ENABLED 和 #define WDT_ENABLED) 并 重 新编 译 源 代 码 。4.6.1 函 数 描 述isBOR功 能 : 确 定 复 位 是 否 是 由 欠 压 复 位 电 路 引 起 的 。包 含 头 文 件 : reset.h原 型 : char isBOR( void );说 明 :该 函 数 检 测 单 片 机 复 位 是 否 因 欠 压 复 位 电 路 引 起 。 下 面 的 状 态 位 表 明 了此 条 件 :POR = 1BOR = 0返 回 值 : 如 果 复 位 是 由 欠 压 复 位 电 路 引 起 , 返 回 1 ;否 则 , 返 回 0。文 件 名 :isbor.cisLVD功 能 : 确 定 复 位 是 否 是 由 检 测 到 低 电 压 条 件 引 起 的 。包 含 头 文 件 : reset.h原 型 : char isLVD( void );说 明 : 该 函 数 检 测 器 件 电 压 是 否 要 比 LVDCON 寄 存 器 (LVDL3:LVDL0 位 )中 指 定 的 值 低 。返 回 值 : 如 果 复 位 是 由 正 常 工 作 时 LVD ( 低 电 压 检 测 ) 引 起 , 则 返 回 1 ;否 则 , 返 回 0。文 件 名 :islvd.c© 2004 Microchip Technology Inc. DS51297C_CN 第 131 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库isMCLR功 能 : 确 定 复 位 是 否 是 由 MCLR 引 脚 引 起 的 。包 含 头 文 件 : reset.h原 型 : char isMCLR( void );说 明 :该 函 数 检 测 单 片 机 在 正 常 工 作 时 是 否 因 MCLR 引 脚 引 起 复 位 。 下 列 状 态位 表 明 了 此 条 件 :POR = 1如 果 使 能 了 欠 压 复 位 , BOR = 1如 果 使 能 了 看 门 狗 定 时 器 , TO = 1PD = 1返 回 值 : 如 果 在 正 常 工 作 时 因 MCLR 而 复 位 , 则 返 回 1 ;否 则 , 返 回 0。文 件 名 :ismclr.cisPOR功 能 : 检 测 上 电 复 位 条 件 。包 含 头 文 件 : reset.h原 型 : char isPOR( void );说 明 : 该 函 数 检 测 单 片 机 是 否 刚 刚 发 生 上 电 复 位 。 下 列 状 态 位 表 明 了 此 条 件 :POR = 0BOR = 0TO = 1PD = 1正 常 工 作 时 MCLR 也 会 引 起 上 电 复 位 , 执 行 CLRWDT 指 令 时 也 会 引 起上 电 复 位 。在 调 用 isPOR 后 , 应 该 调 用 StatusReset 来 置 位 POR 位 和 BOR 位 。返 回 值 : 如 果 器 件 刚 刚 发 生 上 电 复 位 , 则 返 回 1 ;否 则 , 返 回 0。文 件 名 :ispor.cisWDTTO功 能 : 确 定 复 位 是 否 是 由 看 门 狗 定 时 器 超 时 引 起 的 。包 含 头 文 件 : reset.h原 型 : char isWDTTO( void );说 明 :该 函 数 检 测 单 片 机 在 正 常 工 作 时 是 否 因 WDT 而 复 位 。 下 面 的 状 态 位 表明 了 此 条 件 :POR = 1BOR = 1TO = 0PD = 1返 回 值 : 如 果 在 正 常 工 作 期 间 因 看 门 狗 而 复 位 , 则 返 回 1 ;否 则 , 返 回 0。文 件 名 :iswdtto.cDS51297C_CN 第 132 页© 2004 Microchip Technology Inc.


通 用 软 件 函 数 库isWDTWU功 能 : 确 定 唤 醒 是 否 是 由 看 门 狗 定 时 器 (WDT) 引 起 的 。包 含 头 文 件 : reset.h原 型 : char isWDTWU( void );说 明 :该 函 数 检 测 单 片 机 是 否 被 WDT 从 休 眠 状 态 中 唤 醒 。 下 面 的 状 态 位 表 明了 此 条 件 :POR = 1BOR = 1TO = 0PD = 0返 回 值 : 如 果 单 片 机 被 看 门 狗 定 时 器 唤 醒 , 则 返 回 1 ;否 则 , 返 回 0。文 件 名 :iswdtwu.cisWU功 能 : 检 测 是 MCLR 引 脚 还 是 中 断 将 单 片 机 从 休 眠 状 态 唤 醒 。包 含 头 文 件 : reset.h原 型 : char isWU( void );说 明 :该 函 数 检 测 是 因 MCLR 引 脚 还 是 中 断 将 单 片 机 从 休 眠 状 态 唤 醒 。 下 面 的状 态 位 表 明 了 此 条 件 :POR = 1BOR = 1TO = 1PD = 0返 回 值 : 如 果 是 因 MCLR 引 脚 或 者 中 断 唤 醒 单 片 机 , 则 返 回 1 ;否 则 , 返 回 0。文 件 名 :iswu.cStatusReset功 能 : 置 位 CPUSTA 寄 存 器 中 的 POR 位 和 BOR 位 。包 含 头 文 件 : reset.h原 型 : void StatusReset( void );说 明 : 该 函 数 置 位 CPUSTA 寄 存 器 中 的 POR 和 BOR 位 。 在 发 生 上 电 复 位 后 ,必 须 在 软 件 中 置 位 这 些 位 。文 件 名 :statrst.c© 2004 Microchip Technology Inc. DS51297C_CN 第 133 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库注 :DS51297C_CN 第 134 页© 2004 Microchip Technology Inc.


第 5 章 数 学 函 数 库MPLAB ® <strong>C18</strong> C 编 译 器函 数 库5.1 简 介本 章 讲 述 数 学 库 函 数 。 有 关 数 学 函 数 库 的 更 多 信 息 可 参 考 Embedded ControlHandbook, Volume 2 (DS00167), 有 关 创 建 和 使 用 函 数 库 的 更 多 信 息 可 参 考MPASM User's Guide with MPLINK and MPLIB (DS33014)。本 章 包 括 两 个 部 分 :• 32 位 整 数 和 32 位 浮 点 数 数 学 函 数 库• 十 进 制 / 浮 点 数 转 换 及 浮 点 数 / 十 进 制 转 换5.2 32 位 整 数 和 32 位 浮 点 数 数 学 函 数 库MPLAB <strong>C18</strong> 使 用 的 数 学 函 数 基 于 Microchip 的 应 用 笔 记 AN575, 其 源 代 码 可 在 编 译 器安 装 目 录 的 子 目 录 src\math 中 找 到 。 这 些 源 文 件 已 经 被 编 译 成 目 标 代 码 并 添 加 到 lib子 目 录 下 的 标 准 C 函 数 库 。 当 使 用 MPLAB <strong>C18</strong> 提 供 的 链 接 器 描 述 文 件 时 , 标 准 C 函数 库 文 件 就 被 包 含 了 进 来 。浮 点 库 函 数 提 供 的 数 学 函 数 有 :32 位 有 符 号 整 数 的 乘 法 和 除 法 , 32 位 无 符 号 整 数 的 乘法 和 除 法 以 及 32 位 浮 点 数 的 乘 法 和 除 法 。 还 包 含 把 8 位 、 16 位 、 24 位 和 32 位 有 符号 和 无 符 号 整 数 转 换 为 32 位 浮 点 数 、 把 32 位 浮 点 数 转 换 为 32 位 整 数 的 函 数 。5.2.1 浮 点 数 表 示浮 点 数 以 改 进 的 IEEE-754 格 式 来 表 示 。 这 种 格 式 允 许 浮 点 函 数 利 用 处 理 器 的 架 构 并 可降 低 计 算 所 需 的 开 销 。 这 种 表 示 和 IEEE-754 格 式 的 比 较 见 下 表 :格 式 指 数 尾 数 0 尾 数 1 尾 数 2IEEE-754 sxxx xxxx yxxx xxxx xxxx xxxx xxxx xxxxMicrochip xxxx xxxy sxxx xxxx xxxx xxxx xxxx xxxx其 中 , s 为 符 号 位 , y 为 指 数 的 最 低 有 效 位 (LSB 位 ), x 为 尾 数 位 和 指 数 位 的 占 位符 。通 过 对 指 数 字 节 和 尾 数 0 字 节 进 行 操 作 , 可 以 很 容 易 地 在 这 两 种 格 式 之 间 进 行 转 换 。下 面 的 汇 编 代 码 是 这 种 操 作 的 一 个 示 例 。© 2004 Microchip Technology Inc. DS51297C_CN 第 135 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库例 5-1:Rlcf MANTISSA0Rlcf EXPONENTRrcf MANTISSA0例 5-2:Rlcf MANTISSA0Rrcf EXPONENTRrcf MANTISSA0IEEE-754 格 式 转 换 为 MICROCHIP 格 式MICROCHIP 格 式 转 换 为 IEEE-754 格 式5.3 十 进 制 / 浮 点 数 和 浮 点 数 / 十 进 制 转 换下 面 几 节 详 细 讨 论 如 何 将 十 进 制 数 转 换 为 浮 点 数 , 以 及 如 何 将 浮 点 数 转 换 为 十 进 制 数 。5.3.1 将 十 进 制 数 转 换 为 Microchip 浮 点 格 式有 几 种 方 法 可 将 十 进 制 数 ( 基 数 为 10) 转 换 成 Microchip 浮 点 格 式 。 Microchip 提 供了 一 个 名 为 FPREP.EXE 的 PC 实 用 程 序 , 能 将 十 进 制 数 转 换 为 浮 点 数 , 以 便 在 数 学 库函 数 中 使 用 。 该 实 用 程 序 和 AN575 的 源 代 码 可 从 Microchip 网 站 上 下 载 。另 外 , 与 十 进 制 数 等 价 的 浮 点 数 也 可 使 用 普 通 方 法 (longhand) 来 计 算 。 要 使 用 普 通方 法 (longhand) 计 算 浮 点 数 , 必 须 求 出 指 数 和 尾 数 。DS51297C_CN 第 136 页© 2004 Microchip Technology Inc.


数 学 函 数 库使 用 下 面 的 方 程 可 算 出 指 数 :方 程 5-1:2 Z = A 10方 程 5-2:Exp = int(Z)其 中 , Z 为 小 数 形 式 的 指 数 , A 10 为 原 十 进 制 数 , Exp 为 Z 的 整 数 部 分 。为 求 出 指 数 , 首 先 重 新 整 理 方 程 5-1, 求 出 Z:Z = ln (A 10 )ln (2)如 果 Z 为 正 数 , 则 取 舍 到 比 此 数 大 的 下 一 个 整 数 值 。 如 果 Z 为 负 数 , 则 取 舍 到 比 此 数小 的 下 一 个 整 数 值 。 这 样 得 到 的 结 果 为 Exp。最 后 添 加 一 个 偏 移 值 0x7F, 将 Exp 转 换 为 Microchip 浮 点 格 式 (Exp MFP )。Exp MFP = Exp + 0x7F为 求 出 尾 数 , 必 须 采 用 除 法 , 从 原 十 进 制 数 中 将 刚 刚 得 到 的 指 数 值 去 除 。方 程 5-3:x = A 102 Z其 中 , x 为 尾 数 的 小 数 部 分 , A 10 和 Z 为 如 上 所 述 的 值 。注 : x 将 始 终 为 大 于 1 的 值 。要 确 定 尾 数 的 二 进 制 表 示 , 可 依 次 将 x 和 2 的 降 幂 相 比 较 , 从 2 0 逐 渐 减 小 到 2 -23 。 如果 x 大 于 或 等 于 当 前 被 比 较 的 2 的 幂 , 则 二 进 制 表 示 的 相 应 位 置 “1” , 同 时 从 x 中减 去 这 个 2 的 幂 值 。 新 的 x 再 和 下 一 个 的 2 的 降 幂 比 较 , 如 果 x 小 于 当 前 被 比 较 的 2的 幂 , 则 相 应 位 置 “0”, 同 时 不 进 行 减 法 。 使 用 同 样 的 x 值 再 和 下 一 个 2 的 幂 值 作 比较 。重 复 这 个 过 程 直 到 24 位 都 已 经 确 定 或 者 x 减 为 0。 最 后 , 将 一 个 24 位 的 值 转 换 成Microchip 浮 点 格 式 , 用 原 十 进 制 数 的 符 号 代 替 MSb 位 , 也 就 是 “1” 代 表 负 ,“0”代 表 正 。© 2004 Microchip Technology Inc. DS51297C_CN 第 137 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库为 示 范 转 换 方 法 , 使 用 与 AN575 中 相 同 的 例 子 , 其 中 A 10 = 0.15625。首 先 , 求 出 指 数 :2 Z = 0.15625Z =ln (0.15625)ln (2)= -2.6780719Exp = int(Z) = -3接 着 , 计 算 尾 数 的 小 数 部 分 :x = 0.156252 -3 = 1.25然 后 确 定 二 进 制 表 示 :x = 1.25 ≥ 2 0 ? 是 bit = 1 ; x = 1.25 - 1 = 0.25x = 0.25 ≥ 2 -1 ? 否 bit = 0 ; x = 0.25x = 0.25 ≥ 2 -2 ? 是 bit = 1 ; x = 0.25 - 0.25 = 0x = 0过 程 结 束因 此 , 二 进 制 表 示 为 :A 2 = 1.01000000000000000000000。最 后 , 将 正 确 的 符 号 位 放 到 尾 数 的 MSb 位 , 并 且 将 计 算 出 的 指 数 加 上 偏 移 量 0x7F, 即转 换 成 Microchip 浮 点 格 式 。 0.156256 的 Microchip 浮 点 格 式 表 示 是 0x7C200000。 有关 浮 点 格 式 转 换 的 更 多 信 息 , 请 查 阅 AN575。5.3.2 将 Microchip 浮 点 格 式 转 换 为 十 进 制 数将 浮 点 数 转 换 成 十 进 制 数 的 过 程 相 对 简 单 , 可 通 过 手 工 计 算 ( 或 使 用 计 算 器 ) 来 检 查结 果 。 要 把 浮 点 数 转 换 成 十 进 制 数 , 可 使 用 如 下 方 程 :方 程 5-4:A 10 = 2 Exp • A 2其 中 , Exp 为 未 加 偏 移 量 的 指 数 , A 为 尾 数 的 二 进 制 扩 展 。为 使 用 上 述 公 式 , 必 须 对 存 储 的 值 进 行 处 理 。 因 为 指 数 是 以 加 偏 移 量 格 式 存 储 的 , 也就 是 说 , 真 正 的 指 数 加 上 了 0x7F , 所 以 , 要 获 得 上 述 计 算 中 所 使 用 的 真 正 指 数 , 就必 须 将 存 储 的 值 减 去 0x7F。符 号 位 存 储 在 尾 数 的 MSb 中 。 为 了 精 确 得 到 尾 数 的 全 部 24 位 , 一 旦 提 取 出 符 号 位 ,MSb 位 就 被 明 确 假 定 为 1。 为 了 计 算 A 2 , 使 用 下 面 公 式 进 行 简 单 的 二 进 制 扩 展 。 因 为MSb 明 确 为 1, 扩 展 部 分 总 会 包 含 2 0 项 。DS51297C_CN 第 138 页© 2004 Microchip Technology Inc.


数 学 函 数 库方 程 5-5:A 2 = 2 0 + (Bit22) • 2 -1 + (Bit21) • 2 -2 + ... + (Bit0) • 2 -23如 AN575 中 所 述 一 样 , 我 们 以 十 进 制 数 50.2654824574 为 例 。 其 浮 点 表 示 为0x84490FDB, 其 中 加 了 偏 移 量 的 指 数 为 0x84 , 包 含 符 号 位 的 尾 数 为 0x490FDB, 而 未加 偏 移 量 的 指 数 为 Exp = 0x84 - 0x7F = 0x05。 要 处 理 尾 数 , 首 先 要 转 换 成 二 进 制 格 式 ,并 且 置 位 MSb 位 , 以 便 于 扩 展 。0x490FDB =0100 1001 0000 1111 1101 1011 2 →1100 1001 0000 1111 1101 1011 2根 据 方 程 5-5 进 行 扩 展 。A 2 = 2 0 + 2 -1 + 2 -4 + 2 -7 + 2 -12 + 2 -13 + 2 -14 + 2 -15 + 2 -16 + 2 -17 +2 -19 + 2 -20 + 2 -22 + 2 -23A 2 = 1.570796371最 后 , 为 计 算 出 实 际 的 浮 点 数 , 可 将 指 数 和 扩 展 的 尾 数 一 起 输 入 到 转 换 方 程 ( 方程 5-4)。A 10 = 2 5 • 1.570796371A 10 = 50.26548387计 算 结 果 的 精 度 达 到 了 十 进 制 的 前 5 个 高 位 , 但 是 由 于 舍 入 误 差 和 计 算 误 差 , 而 导 致其 余 十 进 制 位 出 现 了 某 种 程 度 的 不 确 定 性 。 有 关 误 差 来 源 的 详 细 信 息 , 可 参 考AN575。© 2004 Microchip Technology Inc. DS51297C_CN 第 139 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库注 :DS51297C_CN 第 140 页© 2004 Microchip Technology Inc.


MPLAB ® <strong>C18</strong> C 编 译 器函 数 库术 语 表AANSI美 国 国 家 标 准 学 会B八 进 制 (Octal)使 用 数 字 0-7, 以 8 为 基 数 的 计 数 体 制 。 最 右 边 的 位 表 示 1 的 倍 数 , 右 侧 第 二 位 表 示 8的 倍 数 , 右 侧 第 三 位 表 示 8 2 = 64 的 倍 数 , 以 此 类 推 。编 译 器 (Compiler)将 用 高 级 语 言 编 写 的 源 文 件 翻 译 成 机 器 代 码 的 程 序 。CCPU中 央 处 理 单 元存 储 类 别 (Storage Class)确 定 与 指 定 对 象 相 关 联 存 储 区 的 生 存 时 间 。存 储 模 型 (Memory Model)一 种 描 述 , 它 指 定 指 向 程 序 存 储 器 的 指 针 的 位 数 。存 储 限 定 符 (Storage Qualifier)表 明 所 定 义 的 对 象 的 特 性 ( 例 如 CONST)。存 取 存 储 区 (Access Memory)PI<strong>C18</strong> PICMICRO 单 片 机 的 一 些 特 殊 通 用 寄 存 器 (General Purpose Registers,GPR), 对 这 些 寄 存 器 的 访 问 与 存 储 区 选 择 寄 存 器 (BSR) 的 设 置 无 关 。错 误 文 件 (Error File)包 含 MPLAB <strong>C18</strong> 所 生 成 的 诊 断 信 息 的 文 件 。D单 片 机 (Microcontroller)高 度 集 成 的 芯 片 , 它 包 括 CPU、 RAM、 某 种 类 型 的 ROM、 I/O 端 口 和 定 时 器 。递 归 函 数 (Recursive)自 调 用 的 函 数 ( 即 调 用 自 己 的 函 数 )。© 2004 Microchip Technology Inc. DS51297C_CN 第 141 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库地 址 (Address)确 定 信 息 在 存 储 器 中 位 置 的 代 码 。段 (Section)位 于 特 定 存 储 器 地 址 的 一 段 应 用 程 序 。段 属 性 (Section Attribute)段 的 特 性 ( 如 ACCESS 段 )。E二 进 制 (Binary)使 用 数 字 0 和 1, 以 2 为 基 数 的 计 数 体 制 。 最 右 边 的 位 表 示 1 的 倍 数 , 右 边 第 二 位 表示 2 的 倍 数 , 右 边 第 三 位 表 示 2 2 = 4 的 倍 数 , 以 此 类 推 。FFree-standing一 种 实 现 , 它 接 受 任 何 不 使 用 复 杂 数 据 类 型 的 严 格 符 合 程 序 , 而 且 在 这 种 实 现 中 , 对库 条 款 中 规 定 的 属 性 的 使 用 , 仅 限 于 标 准 头 文 件 :、 、、 、 、 和 。非 扩 展 模 式 (Non-extended Mode)在 非 扩 展 模 式 下 , 编 译 器 不 会 使 用 扩 展 指 令 和 立 即 数 变 址 寻 址 。G高 级 语 言 (High-level Language)编 写 程 序 的 语 言 , 与 汇 编 语 言 相 比 , 它 不 依 赖 于 具 体 的 处 理 器 。H汇 编 器 (Assembler )把 汇 编 源 代 码 翻 译 成 机 器 代 码 的 语 言 工 具 。汇 编 语 言 (Assembly)以 可 读 形 式 描 述 二 进 制 机 器 代 码 的 符 号 语 言 。IICD在 线 调 试 器ICE在 线 仿 真 器IDE集 成 开 发 环 境IEEE电 子 和 电 气 工 程 师 协 会DS51297C_CN 第 142 页© 2004 Microchip Technology Inc.


术 语 表ISO国 际 标 准 化 组 织ISR中 断 服 务 程 序J绝 对 段 (Absolute Section)具 有 链 接 器 不 能 改 变 的 固 定 地 址 的 段 。K可 重 定 位 (Relocatable)没 有 被 指 定 到 固 定 的 存 储 器 地 址 的 对 象 。可 重 入 函 数 (Reentrant)可 以 有 多 个 同 时 运 行 的 实 例 的 函 数 。 在 下 面 两 种 情 况 下 可 能 发 生 函 数 重 入 : 直 接 或 间接 递 归 调 用 函 数 ; 或 者 在 由 函 数 转 入 的 中 断 处 理 过 程 中 又 执 行 此 函 数 。库 (Library)可 重 定 位 目 标 模 块 的 集 合 。库 管 理 器 (Librarian)建 立 并 管 理 库 的 程 序 。扩 展 模 式 (Extended Mode)在 扩 展 模 式 下 , 编 译 器 将 使 用 扩 展 指 令 ( 即 ADDFSR、 ADDULNK、 CALLW、 MOVSF、MOVSS、 PUSHL、 SUBFSR 和 SUBULNK) 以 及 立 即 数 变 址 寻 址 。L链 接 器 (Linker)把 目 标 文 件 和 库 文 件 结 合 起 来 生 成 可 执 行 代 码 的 程 序 。MMPASM 汇 编 器 (MPASM Assembler)MICROCHIP PICMICRO 系 列 单 片 机 的 可 重 定 位 宏 汇 编 器 。MPLIB 目 标 库 管 理 器 (MPLIB Object Librarian )MICROCHIP PICMICRO 系 列 单 片 机 的 库 管 理 器 。MPLINK 目 标 链 接 器 (MPLINK Object Linker)MICROCHIP PICMICRO 系 列 单 片 机 的 链 接 器 。目 标 代 码 (Object Code)由 汇 编 器 或 编 译 器 生 成 的 机 器 代 码 。目 标 文 件 (Object File)包 含 目 标 代 码 的 文 件 。 它 可 以 直 接 执 行 或 需 要 与 其 它 目 标 代 码 文 件 ( 比 如 库 文 件 ) 链接 , 以 生 成 完 全 可 执 行 的 程 序 。© 2004 Microchip Technology Inc. DS51297C_CN 第 143 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库N匿 名 结 构 (Anonymous Structure)未 命 名 的 对 象 。PPragma一 种 伪 指 令 , 它 对 于 特 定 的 编 译 器 有 意 义 。RRAM随 机 访 问 存 储 器ROM只 读 存 储 器S十 六 进 制 (Hexadecimal)使 用 数 字 0-9 以 及 字 母 A-F ( 或 A-F), 以 16 为 基 数 的 计 数 体 制 。 字 母 A-F 表 示 十 进制 数 10 到 15。 最 右 边 的 位 表 示 1 的 倍 数 , 右 边 第 二 位 表 示 16 的 倍 数 , 第 三 位 表 示16 2 = 256 的 倍 数 , 以 此 类 推 。随 机 访 问 存 储 器 (Random Access Memory)一 种 存 储 器 , 可 以 在 这 种 存 储 器 中 以 任 意 顺 序 读 写 信 息 。T特 殊 功 能 寄 存 器 (Special Function Register)控 制 I/O 处 理 函 数 、 I/O 状 态 、 定 时 器 、 其 它 模 式 或 外 围 模 块 的 寄 存 器 。条 件 编 译 (Conditional Compilation)只 有 当 预 处 理 伪 指 令 指 定 的 某 个 常 数 表 达 式 为 真 时 才 编 译 程 序 段 的 操 作 。X向 量 (Vector)复 位 或 中 断 发 生 时 , 应 用 程 序 跳 转 到 的 存 储 器 地 址 。小 尾 数 法 (Little Endian)将 给 定 对 象 的 最 低 有 效 字 节 存 储 在 较 低 的 地 址 。DS51297C_CN 第 144 页© 2004 Microchip Technology Inc.


术 语 表Y已 分 配 段 (Assigned Section)在 链 接 器 命 令 文 件 中 已 分 配 到 目 标 存 储 区 的 段 。异 步 (Asynchronously)不 同 时 发 生 的 多 个 事 件 。 通 常 用 来 指 可 能 在 处 理 器 执 行 过 程 中 的 任 意 时 刻 发 生 的 中 断 。运 行 时 模 型 (Runtime Model)编 译 器 运 行 所 遵 循 的 各 项 前 提 。Z帧 指 针 (Frame Pointer)指 向 堆 栈 中 位 置 的 指 针 , 它 用 于 区 分 堆 栈 中 的 函 数 参 数 和 局 部 变 量 。只 读 存 储 器 (Read Only Memory)存 储 器 硬 件 , 它 允 许 快 速 访 问 其 中 永 久 存 储 的 数 据 , 但 不 允 许 添 加 或 更 改 数 据 。致 命 错 误 (Fatal Error)引 起 编 译 立 即 停 止 的 错 误 。 不 产 生 其 它 消 息 。中 断 (Interrupt)发 送 到 CPU 的 信 号 , 它 使 CPU 暂 停 正 在 运 行 的 应 用 程 序 , 把 控 制 权 转 交 给 中 断 服 务程 序 , 以 处 理 事 件 。 执 行 完 中 断 服 务 程 序 后 , 继 续 正 常 执 行 应 用 程 序 。中 断 服 务 程 序 (Interrupt Service Routine)处 理 中 断 的 函 数 。中 断 响 应 时 间 (Latency)从 事 件 发 生 到 得 到 响 应 的 时 间 。中 央 处 理 单 元 (Central Processing Unit)芯 片 的 一 部 分 , 其 功 能 是 取 出 要 执 行 的 指 令 , 再 对 指 令 进 行 译 码 , 然 后 执 行 指 令 。 如果 有 必 要 , 它 和 算 术 逻 辑 单 元 ( ARITHMETIC LOGIC UNIT, ALU) 一 起 工 作 , 来 完成 指 令 的 执 行 。 它 控 制 程 序 存 储 器 的 地 址 总 线 、 数 据 存 储 器 的 地 址 总 线 和 对 堆 栈 的 访问 。字 节 存 储 顺 序 (Endianness)多 字 节 对 象 的 字 节 存 储 顺 序© 2004 Microchip Technology Inc. DS51297C_CN 第 145 页


MPLAB ® <strong>C18</strong> C 编 译 器 函 数 库注 :DS51297C_CN 第 146 页© 2004 Microchip Technology Inc.


MPLAB ® <strong>C18</strong> C 编 译 器函 数 库索 引AA/D 转 换 器 .............................................................. 11使 用 示 例 .......................................................... 18Busy ................................................................. 12Close ................................................................ 12Convert ............................................................ 12Open ....................................................12, 14, 16Read ................................................................ 17Set Channel ..................................................... 18AckI2C .................................................................... 23ANSI .......................................................................... 7atob ....................................................................... 112atof ........................................................................ 112atoi ........................................................................ 113atol ........................................................................ 113B标 准 C 函 数 库 ............................................................ 8捕 捉 ................................................................... 19–20使 用 示 例 .......................................................... 22Close ................................................................ 19Open ................................................................ 20Read ................................................................ 21baudUSART ............................................................ 63btoa ....................................................................... 113build.bat .................................................................... 8BusyADC ................................................................ 12BusyUSART ............................................................ 57BusyXLCD .............................................................. 67C存 储 器 操 作 函 数 ..................................................... 117Compare ........................................................ 118Copy .............................................................. 119Move .............................................................. 120Search ........................................................... 118Set ................................................................. 120c018.o ....................................................................... 7c018_e.o ................................................................... 7c018i.o ...................................................................... 7c018i_e.o .................................................................. 7c018iz.o ..................................................................... 7c018iz_e.o ................................................................. 7CAN2510, 外 部 ...................................................... 72Bit Modify ......................................................... 73Byte Read ........................................................ 74Byte Write ........................................................ 74Data Read ........................................................ 74Data Ready ...................................................... 75Disable ............................................................. 76Enable .............................................................. 76Error State ........................................................ 77Initialize ............................................................ 77Interrupt Enable ............................................... 81Interrupt Status ................................................ 82Load Extended to Buffer .................................. 83Load Extended to RTR .................................... 84Load Standard to Buffer ................................... 82Load Standard to RTR ..................................... 84Read Mode ...................................................... 85Read Status ..................................................... 85Reset ................................................................ 86Send Buffer ...................................................... 86Sequential Read .............................................. 86Sequential Write ............................................... 87Set Message Filter to Extended ....................... 89Set Message Filter to Standard ....................... 88Set Mode .......................................................... 88Set Single Filter to Extended ........................... 90Set Single Filter to Standard ............................ 90Set Single Mask to Extended ........................... 91Set Single Mask to Standard ........................... 91Write Extended Message ................................. 93Write Standard Message ................................. 92CAN2510BitModify .................................................. 73CAN2510ByteRead ................................................. 74CAN2510ByteWrite ................................................. 74CAN2510DataRead ................................................ 74CAN2510DataReady ............................................... 75CAN2510Disable ..................................................... 76CAN2510Enable ..................................................... 76CAN2510ErrorState ................................................ 77CAN2510Init ............................................................ 77CAN2510InterruptEnable ........................................ 81CAN2510InterruptStatus ......................................... 82CAN2510LoadBufferStd .......................................... 82CAN2510LoadBufferXtd .......................................... 83CAN2510LoadRTRStd ............................................ 84CAN2510LoadRTRXtd ............................................ 84CAN2510ReadMode ............................................... 85CAN2510ReadStatus .............................................. 85CAN2510Reset ....................................................... 86CAN2510SendBuffer ............................................... 86CAN2510SequentialRead ....................................... 86CAN2510SequentialWrite ....................................... 87CAN2510SetMode .................................................. 88CAN2510SetMsgFilterStd ....................................... 88CAN2510SetMsgFilterXtd ....................................... 89© 2004 Microchip Technology Inc. DS51297C_CN 第 147 页


索 引CAN2510SetSingleFilterStd .................................... 90CAN2510SetSingleFilterXtd .................................... 90CAN2510SetSingleMaskStd ................................... 91CAN2510SetSingleMaskXtd ................................... 91CAN2510WriteStd ................................................... 92CAN2510WriteXtd ................................................... 93ClearSWCSSPI ..................................................... 101clib.lib ........................................................................ 8clib_e.lib .................................................................... 8Clock_test ............................................................... 95CloseADC ............................................................... 12CloseCapture .......................................................... 19CloseECapture ........................................................ 19CloseI2C ................................................................. 24CloseMwire ............................................................. 34ClosePORTB .......................................................... 32ClosePWM .............................................................. 39CloseRBxINT .......................................................... 32CloseSPI ................................................................. 42CloseTimer .............................................................. 48CloseUSART ........................................................... 57ConvertADC ............................................................ 12D大 写 字 符 ........................................................ 111, 115电 可 擦 除 存 储 器 件 接 口 函 数 ..................................... 28定 时 器 ..................................................................... 48使 用 示 例 .......................................................... 55Close ................................................................ 48Open .......................................................... 48–52Read ................................................................ 53Write ................................................................ 54堆 栈 , 软 件 ................................................................ 7DataRdyMwire ........................................................ 34DataRdySPI ............................................................ 42DataRdyUSART ...................................................... 58Delay100TCYx ...................................................... 129Delay10KTCYx ..................................................... 130Delay10TCYx ........................................................ 129Delay1KTCYx ....................................................... 130Delay1TCY ............................................................ 129DisablePullups ........................................................ 32EEEAckPolling .......................................................... 28EEByteWrite ............................................................ 28EECurrentAddRead ................................................ 29EEPageWrite .......................................................... 29EERandomRead ..................................................... 30EESequentialRead .................................................. 30EnablePullups ......................................................... 33F浮 点 数表 示 ................................................................ 135函 数 库 ............................................................ 135转 换 ................................................................ 136复 位 函 数 ................................................................ 131低 电 压 检 测 ..................................................... 131唤 醒 ................................................................ 133看 门 狗 定 时 器 超 时 .......................................... 132看 门 狗 定 时 器 唤 醒 .......................................... 133欠 压 ................................................................ 131上 电 ................................................................ 132主 复 位 ............................................................ 132状 态 ................................................................ 133FPREP .................................................................. 136GgetcI2C .................................................................... 24getcMwire ................................................................ 35getcSPI .................................................................... 42getcUART .............................................................. 104getcUSART ............................................................. 58getsI2C .................................................................... 24getsMwire ................................................................ 35getsSPI .................................................................... 43getsUART .............................................................. 104getsUSART ............................................................. 58H函 数 库处 理 器 内 核 ......................................................... 8重 建 ................................................................ 7–9特 定 处 理 器 ......................................................... 9源 代 码 ............................................................ 8–9函 数 库 概 述 ................................................................ 7h 目 录 .............................................................. 94, 100II/O 口 ....................................................................... 32I 2 C, 软 件 ................................................................ 94使 用 示 例 .......................................................... 98Acknowledge .................................................... 95Clock Test ........................................................ 95Get Character .................................................. 95Get String ......................................................... 95No Acknowledge ........................................ 95–96Put Character ................................................... 96Put String ......................................................... 96Read ................................................................ 96Restart ............................................................. 96Start ................................................................. 97Stop .................................................................. 97Write ................................................................. 97I 2 C, 硬 件 ................................................................ 23使 用 示 例 .......................................................... 31Acknowledge .................................................... 23Close ................................................................ 24EEPROM Acknowledge Polling ....................... 28EEPROM Byte Write ........................................ 28EEPROM Current Address Read ..................... 29EEPROM Page Write ....................................... 29EEPROM Random Read ................................. 30EEPROM Sequential Read .............................. 30Get Character .................................................. 24Get String ......................................................... 24Idle ................................................................... 25No Acknowledge .............................................. 25Open ................................................................ 25Put Character ................................................... 25Put String ......................................................... 26© 2004 Microchip Technology Inc. DS51297C_CN 第 148 页


索 引Read ................................................................ 26Restart ............................................................. 26Start ................................................................. 27Stop ................................................................. 27Write ................................................................ 27IdleI2C ..................................................................... 25IEEE 浮 点 数 表 示 ................................................... 135isalnum .................................................................. 108isalpha ................................................................... 108isBOR .................................................................... 131iscntrl ..................................................................... 108isdigit ..................................................................... 109isgraph .................................................................. 109islower ................................................................... 109isLVD .................................................................... 131isMCLR ................................................................. 132isPOR .................................................................... 132isprint .................................................................... 110ispunct ................................................................... 110isspace .................................................................. 110isupper .................................................................. 111isWDTTO .............................................................. 132isWDTWU ............................................................. 133isWU ..................................................................... 133isxdigit ................................................................... 111itoa ........................................................................ 114K看 门 狗 定 时 器 (WDT) ................................. 132–133控 制 字 符 ................................................................ 108LLCD, 外 部 .............................................................. 65使 用 示 例 .......................................................... 71Busy ................................................................. 67Open ................................................................ 67Put Character ............................................. 67, 70Put ROM String ................................................ 68Put String ......................................................... 68Read Address .................................................. 68Read Data ........................................................ 69Set Character Generator Address ................... 69Set Display Data Address ................................ 69Write Command ............................................... 70Write Data ........................................................ 70lib 目 录 ..........................................................7–8, 135ltoa ........................................................................ 114M脉 宽 调 制 函 数 .......................................................... 39目 录启 动 .................................................................... 8h ............................................................... 94, 100lib ...........................................................7–8, 135math ............................................................... 135pmc ............................................................ 11, 65src ...................................................................... 7main .......................................................................... 7makeclib.bat .............................................................. 8makeplib.bat .............................................................. 9math 目 录 .............................................................. 135memchr ................................................................. 118memcmp ............................................................... 118memcmppgm ........................................................ 118memcmppgm2ram ................................................ 118memcmpram2pgm ................................................ 118memcpy ................................................................. 119memcpypgm2ram ................................................. 119memmove ............................................................. 120memmovepgm2ram .............................................. 120memset ................................................................. 120Microchip 网 站 ........................................................... 4Microwire ................................................................. 34使 用 示 例 .......................................................... 37Close ................................................................ 34Data Ready ...................................................... 34Get Character .................................................. 35Get String ......................................................... 35Open ................................................................ 35Put Character ................................................... 35Read ................................................................ 36Write ................................................................. 36MPASM 汇 编 器 ..................................................... 8–9MPLIB 库 管 理 器 .................................................... 8–9NNotAckI2C ............................................................... 25OOpenADC ....................................................12, 14, 16OpenCapture ........................................................... 20OpenECapture ........................................................ 20OpenI2C .................................................................. 25OpenMwire .............................................................. 35OpenPORTB ........................................................... 33OpenPWM ............................................................... 39OpenRBxINT ........................................................... 33OpenSPI .................................................................. 43OpenSWSPI .......................................................... 101OpenTimer ........................................................ 48–52OpenUART ............................................................ 104OpenUSART ........................................................... 59OpenXLCD .............................................................. 67Ppmc 目 录 ........................................................... 11, 65PORTBClose ................................................................ 32Disable Interrupts ............................................. 32Disable Pullups ................................................ 32Enable Interrupts .............................................. 33Enable Pullups ................................................. 33Open ................................................................ 33putcI2C .................................................................... 25putcMwire ................................................................ 35putcSPI .................................................................... 43putcSWSPI ............................................................ 101putcUART .............................................................. 104putcUSART ............................................................. 60putcXLCD .......................................................... 67, 70putrsUSART ............................................................ 60© 2004 Microchip Technology Inc. DS51297C_CN 第 149 页


索 引putrsXLCD .............................................................. 68putsI2C .................................................................... 26putsSPI ................................................................... 44putsUART ............................................................. 104putsUSART ............................................................. 60putsXLCD ................................................................ 68PWM ....................................................................... 39Close ................................................................ 39Open ................................................................ 39Set Duty Cycle ................................................. 40Set ECCP Output ............................................. 41Q启 动 代 码 .................................................................... 7启 动 目 录 .................................................................... 8Rrand ....................................................................... 114ReadADC ................................................................ 17ReadAddrXLCD ...................................................... 68ReadCapture ........................................................... 21ReadDataXLCD ...................................................... 69ReadI2C .................................................................. 26ReadMwire .............................................................. 36ReadSPI .................................................................. 44ReadTimer .............................................................. 53ReadUART ............................................................ 105ReadUSART ........................................................... 61RestartI2C ............................................................... 26S示 例捕 捉 .................................................................. 22定 时 器 .............................................................. 55A/D 转 换 器 ....................................................... 18I 2 C, 软 件 ......................................................... 98I 2 C, 硬 件 ......................................................... 31LCD .................................................................. 71Microwire ......................................................... 37SPI, 软 件 ...................................................... 102SPI, 硬 件 ........................................................ 45UART, 软 件 .................................................. 105USART, 硬 件 .................................................. 64数 据 初 始 化 ................................................................ 7数 据 转 换 函 数 ........................................................ 112Byte to String ................................................. 113Convert Character to Lower Case ................. 115Convert Character to Upper Case ................. 115Integer to String ............................................. 114Long to String ................................................ 114String to Byte ................................................. 112String to Float ................................................ 112String to Integer ............................................. 113String to Long ................................................ 113Unsigned Long to String ................................ 116SetCGRamAddr ...................................................... 69SetChanADC .......................................................... 18SetDCPWM ............................................................. 40SetDDRamAddr ...................................................... 69SetOutputPWM ....................................................... 41SetSWCSSPI ........................................................ 101SPI, 软 件 .............................................................. 100使 用 示 例 ........................................................ 102Clear Chip Select ........................................... 101Open .............................................................. 101Put Character ................................................. 101Set Chip Select .............................................. 101Write ............................................................... 102SPI, 硬 件 ................................................................ 42使 用 示 例 .......................................................... 45Close ................................................................ 42Data Ready ...................................................... 42Get Character .................................................. 42Get String ......................................................... 43Open ................................................................ 43Put Character ................................................... 43Put String ......................................................... 44Read ................................................................ 44Write ................................................................. 44srand ..................................................................... 115src 目 录 ..................................................................... 7SSP ................................................................... 23–24StartI2C ................................................................... 27StatusReset ........................................................... 133StopI2C ................................................................... 27strcat ..................................................................... 121strcatpgm2ram ...................................................... 121strchr ..................................................................... 121strcmp ................................................................... 122strcmppgm2ram .................................................... 122strcpy ..................................................................... 122strcpypgm2ram ..................................................... 122strcspn ................................................................... 123strlen ..................................................................... 123strlwr ...................................................................... 123strncat ................................................................... 124strncatpgm2ram .................................................... 124strncmp ................................................................. 124strncpy ................................................................... 125strncpypgm2ram ................................................... 125strpbrk ................................................................... 125strrchr .................................................................... 126strspn .................................................................... 126strstr ...................................................................... 127strtok ..................................................................... 127strupr ..................................................................... 128SWAckI2C ......................................................... 95–96SWGetcI2C ............................................................. 95SWGetsI2C ............................................................. 95SWNotAckI2C ......................................................... 95SWPutcI2C .............................................................. 96SWPutsI2C .............................................................. 96SWReadI2C ............................................................ 96SWRestartI2C ......................................................... 96SWStartI2C ............................................................. 97SWStopI2C ............................................................. 97SWWriteI2C ............................................................ 97T特 殊 功 能 寄 存 器 定 义 .................................................. 9同 步 模 式 .................................................................. 59推 荐 读 物 .................................................................... 3© 2004 Microchip Technology Inc. DS51297C_CN 第 150 页


索 引tolower .................................................................. 115toupper .................................................................. 115UUART, 软 件 ......................................................... 103使 用 示 例 ........................................................ 105Get Character ................................................ 104Get String ....................................................... 104Open .............................................................. 104Put Character ................................................. 104Put String ....................................................... 104Read .............................................................. 105Write .............................................................. 105ultoa ...................................................................... 116USART, 硬 件 ......................................................... 56使 用 示 例 .......................................................... 64baud ................................................................. 63Busy ................................................................. 57Close ................................................................ 57Data Ready ...................................................... 58Get Character .................................................. 58Get String ......................................................... 58Open ................................................................ 59Put Character ................................................... 60Put String ......................................................... 60Read ................................................................ 61Write ................................................................ 62W外 设 函 数 库 ................................................................ 9尾 数 .......................................................135, 137–138文 档 约 定 .................................................................... 2WriteCmdXLCD ...................................................... 70WriteDataXLCD ...................................................... 70WriteI2C .................................................................. 27WriteMwire .............................................................. 36WriteSPI .................................................................. 44WriteSWSPI .......................................................... 102WriteTimer .............................................................. 54WriteUART ............................................................ 105WriteUSART ........................................................... 62X小 尾 数 法 ................................................................ 144小 写 字 符 ........................................................ 109, 115Y已 初 始 化 数 据 ............................................................ 7异 步 模 式 .................................................................. 59延 时 ....................................................................... 1291 Tcy .............................................................. 1291,000 Tcy 的 整 数 倍 ........................................ 13010 Tcy 的 整 数 倍 ............................................. 12910,000 Tcy 的 整 数 倍 ...................................... 130100 Tcy 的 整 数 倍 ........................................... 129Z增 强 型 捕 捉Close ................................................................ 19Open ................................................................ 20指 数 .......................................................135, 137–138字 符 串 操 作 函 数 ..................................................... 117Append ................................................... 121, 124Compare ................................................ 122, 124Convert to Lower Case .................................. 123Convert to Upper-case ................................... 128Copy ....................................................... 122, 125Length ............................................................ 123Search ............................................121, 125–127Tokenize ........................................................ 127字 符 分 类标 点 ................................................................ 110大 写 字 母 ........................................................ 111可 打 印 ............................................................ 110空 白 ................................................................ 110控 制 ................................................................ 108十 进 制 ............................................................ 109十 六 进 制 ........................................................ 111图 形 ................................................................ 109字 母 ................................................................ 108字 母 数 字 ........................................................ 108小 写 字 母 ........................................................ 109字 符 分 类 函 数 ........................................................ 107字 母 数 字 字 符 ........................................................ 108字 母 字 符 ................................................................ 108中 断 服 务 程 序 ........................................................ 145© 2004 Microchip Technology Inc. DS51297C_CN 第 151 页


全 球 销 售 及 服 务 网 点美 洲公 司 总 部 Corporate Office2355 West Chandler Blvd.Chandler, AZ 85224-6199Tel: 1-480-792-7200Fax: 1-480-792-7277技 术 支 持 :http://support.microchip.com网 址 :www.microchip.com亚 特 兰 大 AtlantaAlpharetta, GATel: 1-770-640-0034Fax: 1-770-640-0307波 士 顿 BostonWestford, MATel: 1-978-692-3848Fax: 1-978-692-3821芝 加 哥 ChicagoItasca, ILTel: 1-630-285-0071Fax: 1-630-285-0075达 拉 斯 DallasAddison, TXTel: 1-972-818-7423Fax: 1-972-818-2924底 特 律 DetroitFarmington Hills, MITel: 1-248-538-2250Fax: 1-248-538-2260科 科 莫 KokomoKokomo, INTel: 1-765-864-8360Fax: 1-765-864-8387洛 杉 矶 Los AngelesMission Viejo, CATel: 1-949-462-9523Fax: 1-949-462-9608圣 何 塞 San JoseMountain View, CATel: 1-650-215-1444Fax: 1-650-961-0286加 拿 大 多 伦 多 TorontoMississauga, Ontario,CanadaTel: 1-905-673-0699Fax: 1-905-673-6509亚 太 地 区中 国 - 北 京Tel: 86-10-8528-2100Fax: 86-10-8528-2104中 国 - 成 都Tel: 86-28-8676-6200Fax: 86-28-8676-6599中 国 - 福 州Tel: 86-591-750-3506Fax: 86-591-750-3521中 国 - 香 港 特 别 行 政 区Tel: 852-2401-1200Fax: 852-2401-3431中 国 - 上 海Tel: 86-21-5407-5533Fax: 86-21-5407-5066中 国 - 沈 阳Tel: 86-24-2334-2829Fax: 86-24-2334-2393中 国 - 深 圳Tel: 86-755-8203-2660Fax: 86-755-8203-1760中 国 - 顺 德Tel: 86-757-2839-5507Fax: 86-757-2839-5571中 国 - 青 岛Tel: 86-532-502-7355Fax: 86-532-502-7205台 湾 地 区 - 高 雄Tel: 886-7-536-4818Fax: 886-7-536-4803台 湾 地 区 - 台 北Tel: 886-2-2500-6610Fax: 886-2-2508-0102台 湾 地 区 - 新 竹Tel: 886-3-572-9526Fax: 886-3-572-6459亚 太 地 区澳 大 利 亚 Australia - SydneyTel: 61-2-9868-6733Fax: 61-2-9868-6755印 度 India - BangaloreTel: 91-80-2229-0061Fax: 91-80-2229-0062印 度 India - New DelhiTel: 91-11-5160-8632Fax: 91-11-5160-8632日 本 Japan - KanagawaTel: 81-45-471- 6166Fax: 81-45-471-6122韩 国 Korea - SeoulTel: 82-2-554-7200Fax: 82-2-558-5932 or82-2-558-5934新 加 坡 SingaporeTel: 65-6334-8870Fax: 65-6334-8850欧 洲奥 地 利 Austria - WeisTel: 43-7242-2244-399Fax: 43-7242-2244-393丹 麦 Denmark - BallerupTel: 45-4420-9895Fax: 45-4420-9910法 国 France - MassyTel: 33-1-69-53-63-20Fax: 33-1-69-30-90-79德 国 Germany - IsmaningTel: 49-89-627-144-0Fax: 49-89-627-144-44意 大 利 Italy - MilanTel: 39-0331-742611Fax: 39-0331-466781荷 兰 Netherlands - DrunenTel: 31-416-690399Fax: 31-416-690340英 国 England - BerkshireTel: 44-118-921-5869Fax: 44-118-921-582009/20/04DS51297C_CN 第 152 页© 2004 Microchip Technology Inc.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!