42
2006 Microchip Technology Inc. DS51556A_CN 低引脚数演示板 用户指南

低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

2006 Microchip Technology Inc. DS51556A_CN

低引脚数演示板

用户指南

Page 2: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

请注意以下有关 Microchip 器件代码保护功能的要点:

• Microchip 的产品均达到 Microchip 数据手册中所述的技术指标。

• Microchip 确信:在正常使用的情况下, Microchip 系列产品是当今市场上同类产品中 安全的产品之一。

• 目前,仍存在着恶意、甚至是非法破坏代码保护功能的行为。就我们所知,所有这些行为都不是以 Microchip 数据手册中规定的

操作规范来使用 Microchip 产品的。这样做的人极可能侵犯了知识产权。

• Microchip 愿与那些注重代码完整性的客户合作。

• Microchip 或任何其他半导体厂商均无法保证其代码的安全性。代码保护并不意味着我们保证产品是 “牢不可破”的。

代码保护功能处于持续发展中。Microchip 承诺将不断改进产品的代码保护功能。任何试图破坏 Microchip 代码保护功能的行为均可视

为违反了 《数字器件千年版权法案 (Digital Millennium Copyright Act)》。如果这种行为导致他人在未经授权的情况下,能访问您的

软件或其他受版权保护的成果,您有权依据该法案提起诉讼,从而制止这种行为。

提 供 本 文 档 的 中 文 版 本 仅 为 了 便 于 理 解。 MicrochipTechnology Inc. 及其分公司和相关公司、各级主管与员工及

事务代理机构对译文中可能存在的任何差错不承担任何责任。建议参考 Microchip Technology Inc. 的英文原版文档。

本出版物中所述的器件应用信息及其他类似内容仅为您提供便

利,它们可能由更新之信息所替代。确保应用符合技术规范,是您自身应负的责任。Microchip 对这些信息不作任何明示或

暗示、书面或口头、法定或其他形式的声明或担保,包括但不

限于针对其使用情况、质量、性能、适销性或特定用途的适用性的声明或担保。 Microchip 对因这些信息及使用这些信息而

引起的后果不承担任何责任。如果将 Microchip 器件用于生命

维持和 / 或生命安全应用,一切风险由买方自负。买方同意在

由此引发任何一切伤害、索赔、诉讼或费用时,会维护和保障Microchip 免于承担法律责任,并加以赔偿。在 Microchip 知识

产权保护下,不得暗中或以其他方式转让任何许可证。

DS51556A_CN 第 ii 页

商标

Microchip 的名称和徽标组合、 Microchip 徽标、 Accuron、dsPIC、 KEELOQ、 microID、 MPLAB、 PIC、 PICmicro、PICSTART、 PRO MATE、 PowerSmart、 rfPIC 和

SmartShunt 均为 Microchip Technology Inc. 在美国和其他国

家或地区的注册商标。

AmpLab、 FilterLab、 Migratable Memory、 MXDEV、MXLAB、 PICMASTER、 SEEVAL、 SmartSensor 和 The Embedded Control Solutions Company 均为 Microchip Technology Inc. 在美国的注册商标。

Analog-for-the-Digital Age、 Application Maestro、dsPICDEM、 dsPICDEM.net、 dsPICworks、 ECAN、

ECONOMONITOR、 FanSense、 FlexROM、 fuzzyLAB、In-Circuit Serial Programming、 ICSP、 ICEPIC、 Linear Active Thermistor、 MPASM、 MPLIB、 MPLINK、 MPSIM、PICkit、 PICDEM、 PICDEM.net、 PICLAB、 PICtail、PowerCal、 PowerInfo、 PowerMate、 PowerTool、 Real ICE、 rfLAB、 rfPICDEM、 Select Mode、 Smart Serial、SmartTel、 Total Endurance、 UNI/O、 WiperLock 和 Zena均为 Microchip Technology Inc. 在美国和其他国家或地区的

商标。

SQTP 是 Microchip Technology Inc. 在美国的服务标记。

在此提及的所有其他商标均为各持有公司所有。

© 2006, Microchip Technology Inc. 版权所有。

2006 Microchip Technology Inc.

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

Page 3: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板

用户指南

目录

前言 ................................................................................................................................. 1第 1 章 低引脚数(LPC)演示板概述

1.1 引言 ................................................................................................................ 71.2 重点 ................................................................................................................ 71.3 LPC 演示板支持的器件 ................................................................................... 71.4 LPC 演示板概述 .............................................................................................. 81.5 运行 PICkit™ 2 Starter Kit 默认演示程序 ........................................................ 8

第 2 章 中档 PICmicro® 单片机架构概述

2.1 引言 ................................................................................................................ 92.2 存储器组织 ................................................................................................... 102.3 指令格式 ....................................................................................................... 10

2.3.1 汇编基础 .................................................................................................... 11

第 3 章 LPC 演示板课程

3.1 引言 .............................................................................................................. 133.2 LPC 演示板课程 ............................................................................................ 13

3.2.1 第 1 课:Hello World (点亮 LED) ........................................................................ 143.2.2 第 2 课:延时循环 (使 LED 闪烁) ........................................................................ 153.2.3 第 3 课:轮流 (轮流点亮 LED) ............................................................................. 173.2.4 第 4 课:模数转换 ................................................................................................... 193.2.5 第 5 课:变速轮流点亮 ............................................................................................ 223.2.6 第 6 课:开关防反跳 ............................................................................................... 233.2.7 第 7 课:可反向的变速轮流点亮 ............................................................................. 253.2.8 第 8 课:函数调用 ................................................................................................... 263.2.9 第 9 课: Timer0 ...................................................................................................... 273.2.10 第 10 课:中断 ...................................................................................................... 293.2.11 第 11 课:间接数据寻址 ........................................................................................ 313.2.12 第 12 课:查表 (ROM 数组) .............................................................................. 33

附录 A 硬件原理图

A.1 引言 .............................................................................................................. 37全球销售及服务网点 ...................................................................................................... 38

2006 Microchip Technology Inc. DS51556A_CN 第 iii 页

Page 4: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板用户指南

DS51556A_CN 第 iv 页 2006 Microchip Technology Inc.

注:

Page 5: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数

演示板用户指南

前言

简介

本章包含使用低引脚数 (Low Pin Count, LPC)演示板前需要了解的有用的一般信息。内容包括:

• 文档编排

• 本指南使用的约定

• 保修登记

• 推荐读物

• Microchip 网站

• 开发系统变更通知客户服务

• 客户支持

文档编排 本文档介绍了如何将低引脚数演示板用作开发工具来帮助用户在目标板上仿真和调试固件。文档内容编排如下:

• 第 1 章 “低引脚数 (LPC)演示板概述” ——Microchip 低引脚数演示板概述。

• 第 2 章 “中档 PICmicro® 单片机架构概述”——中档 PICmicro® 架构概述。

• 第 3 章 “LPC 演示板课程” ——提供多个课程,演示如何使用低引脚数演示板以及如何用演示板做实验。

客户须知

所有文档均会过时,本文档也不例外。 Microchip 的工具和文档将不断演变以满足客户的需求,因此实际使用中有些对话框和 / 或工具说明可能与本文档所述之内容有所不同。请访问我们的网站(www.microchip.com)获取 新文档。

文档均标记有 “DS”编号。该编号出现在每页底部的页码之前。 DS 编号的命名约定为“DSXXXXXA”,其中 “XXXXX”为文档编号,“A”为文档版本。

欲了解开发工具的 新信息,请参考 MPLAB® IDE 在线帮助。从 Help (帮助)菜单选择 Topics(主题),打开现有在线帮助文件列表。

2006 Microchip Technology Inc. DS51556A_CN 第 1 页

Page 6: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板用户指南

本指南使用的约定

本指南采用以下文档约定:

文档约定

说明 含义 示例

Arial 字体:

斜体字 参考数目 MPLAB® IDE User’s Guide需强调的文字 ... 仅有的编译器 ...

首字母大写 窗口 Output 窗口

对话框 Settings 对话框

菜单选项 选择 Enable Programmer引用 窗口或对话框中的字段名 “Save project before build”带右尖括号且有下划线的斜体文字

菜单路径 File>Save

粗体字 对话框按钮 点击 OK选项卡 点击 Power 选项卡

N‘Rnnnn 验证日志格式的数,其中, N是总的位数, R 是基, n 是数位。

4‘b0010, 2‘hF1

尖括号 < > 括起的文字 键盘上的按键 按下 <Enter>, <F1>Courier 字体:

常规 Courier 源代码示例 #define START文件名 autoexec.bat文件路径 c:\mcc18\h

关键字 _asm, _endasm, static命令行选项 -Opa+, -Opa-位值 0, 1

常数 0xFF, ‘A’斜体 Courier 可变参数 file.o,其中 file 可以是任

一有效的文件名

方括号 [ ] 可选参数 mcc18 [options] file [options]

花括号和竖线: | 选择互斥参数; “或”选择 errorlevel 0|1省略号 ... 代替重复文字 var_name [,

var_name...]表示用户提供的代码 void main (void)

...

DS51556A_CN 第 2 页 2006 Microchip Technology Inc.

Page 7: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

前言

保修登记

请填写随附的保修登记卡 (Warranty Registration Card)并尽快寄出。寄出保修登记卡的客户将可收到新产品更新信息。临时发布的软件在 Microchip 网站上提供。

推荐读物

本用户指南说明如何使用低引脚数 (LPC)演示板。 下面列出了其他有用的文档。以下 Microchip 文档均已提供,并建议读者作为补充参考材料。

低引脚数 (LPC)演示板的自述文件 (Readme)有关使用低引脚数 (LPC)演示板的 新信息,请阅读 “Readme for Low Pin Count Demo Board.txt”文件(ASCII 文本文件),该文件位于 PICkit 2 安装目录下。自述文件包含了本用户指南中可能未提供的更新信息和已知问题。

自述文件

有关使用其他工具的 新信息,请阅读与工具相关的自述文件,文件位于 MPLAB IDE安装目录的 Readmes子目录下。自述文件包含本用户指南中可能未提供的更新信息和已知问题。

PICkit™ 2 单片机编程器用户指南 (DS51553A_CN)

有关如何使用 PICkit 2 单片机编程器软硬件的信息,请参阅此文档。

PIC16F685/687/689/690 数据手册 (DS41262A_CN)

有关 PIC16F685/687/689/690 20 引脚 8 位闪存 CMOS 单片机的信息,请参阅此文档。

MPLAB® IDE Simulator, Editor Userís Guide (DS51025)有关 MPLAB 集成开发环境 (IDE)软件的安装和功能的更多信息,请参阅此文档。

2006 Microchip Technology Inc. DS51556A_CN 第 3 页

Page 8: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板用户指南

MICROCHIP 网站

Microchip 网站 (www.microchip.com)为客户提供在线支持。客户可通过该网站方便地获取文件和信息。只要使用常用的因特网浏览器即可访问。网站提供以下信息:

• 产品支持——数据手册和勘误表、应用笔记和样本程序、设计资源、用户指南以及硬件支持文档、 新的软件版本以及存档软件

• 一般技术支持——常见问题 (FAQ)、技术支持请求、在线讨论组以及 Microchip顾问计划成员名单

• Microchip业务——产品选型和订购指南、 新Microchip新闻稿、研讨会和活动安排表、 Microchip 销售办事处、代理商以及工厂代表列表

开发系统变更通知客户服务

Microchip 的客户通知服务有助于客户了解 Microchip 产品的 新信息。注册客户可在他们感兴趣的某个产品系列或开发工具发生变更、更新、发布新版本或勘误表时,收到电子邮件通知。

欲注册,请登录 Microchip 网站 www.microchip.com,点击 “变更通知客户(Customer Change Notification)”服务并按照注册说明完成注册。

开发系统产品的分类如下:

• 编译器——Microchip C 编译器及其他语言工具的 新信息,包括 MPLAB C18 和MPLAB C30 C 编译器、 MPASMTM 和 MPLAB ASM30 汇编器、 MPLINKTM 和MPLAB LINK30 目标链接器,以及 MPLIBTM 和 MPLAB LIB30 目标库管理器。

• 仿真器——Microchip 在线仿真器的 新信息,包括 MPLAB ICE 2000 和 MPLAB ICE 4000。

• 在线调试器——Microchip 在线调试器 MPLAB ICD 2 的 新信息。

• MPLAB® IDE——用于开发系统工具的Windows®集成开发环境Microchip MPLAB IDE 的 新信息,主要针对 MPLAB IDE、MPLAB SIM 模拟器、MPLAB IDE 项目管理器以及一般编辑和调试功能。

• 编程器——Microchip编程器的 新信息,包括MPLAB PM3和PRO MATE® II器件编程器以及 PICSTART® Plus 和 PICkit® 1 开发编程器。

DS51556A_CN 第 4 页 2006 Microchip Technology Inc.

Page 9: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

前言

客户支持

Microchip 产品的用户可通过以下渠道获得帮助:

• 代理商或代表

• 当地销售办事处

• 应用工程师 (FAE)• 技术支持

• 开发系统信息热线

客户应联系其代理商、代表或应用工程师 (FAE)寻求支持。当地销售办事处也可为客户提供帮助。本文档后附有销售办事处的联系方式。

也可通过 http://support.microchip.com 获得网上技术支持。

文档版本历史

版本 A (2005 年 5 月)

• 本文档的第一版。

2006 Microchip Technology Inc. DS51556A_CN 第 5 页

Page 10: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板用户指南

注:

DS51556A_CN 第 6 页 2006 Microchip Technology Inc.

Page 11: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板

用户指南

第 1 章 低引脚数(LPC)演示板概述

1.1 引言

本章介绍低引脚数 (LPC)演示板并说明 LPC 演示板的功能。

1.2 重点

本章将讨论:

• LPC 演示板支持的器件

• LPC 演示板概述

• 运行 PICkit™ 2 Starter Kit 默认演示程序

1.3 LPC 演示板支持的器件

所支持器件的列表,参见 PICkit™ 2 Starter Kit CD-ROM 上的 LPC 演示板 README文件。

8 引脚 DIP 闪存器件:

14 引脚 DIP 闪存器件:

20 引脚 DIP 闪存器件:

PIC12F508 PIC12F629 PIC12F635PIC12F509 PIC12F675 PIC12F683PIC12F510

PIC16F505 PIC16F630 PIC16F684PIC16F506 PIC16F676 PIC16F688

PIC16F685 PIC16F689 PIC16F785PIC16F687 PIC16F690

2006 Microchip Technology Inc. DS51556A_CN 第 7 页

Page 12: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板用户指南

1.4 LPC 演示板概述

配合使用低引脚数演示板和 PICkit™ 2 单片机编程器,能够帮助用户快速上手使用PICmicro® 单片机。本用户指南以课程的形式编写,接触过汇编语言但从未使用过PICmicro® 单片机的用户是本指南的目标读者。

LPC 演示板概貌如图 1-1 所示。

图 1-1: LPC 演示板

1.5 运行 PICkit™ 2 STARTER KIT 默认演示程序

低引脚数演示板预先烧写了演示程序。为了使用这个程序,应使用 USB 电缆将PICkit™ 2 Starter Kit连接到PC的USB端口。启动PICkit™ 2单片机编程器应用程序,检查目标电源盒。演示程序将使四个红灯依次闪烁。按下按钮开关 SW1,红灯闪烁的顺序将颠倒。调节电位计 RP1,红灯闪烁的频率将改变。这个演示程序是通过本指南的前面 7 课开发的。

14 引脚扩展插头

实验电路

按钮

20 引脚

电位计

LED

PICkit™ 2 编程插头

布线区

DIP 插座

DS51556A_CN 第 8 页 2006 Microchip Technology Inc.

Page 13: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板

用户指南

第 2 章 中档 PICmicro® 单片机架构概述

2.1 引言

本章针对 LPC 演示板,给出了中档 PICmicro® 的架构概述。

图 2-1: 中档 PICmicro® 单片机简化框图

4k x 14

存储器

13数据总线

8

14程序

总线

指令寄存器

程序计数器

RAM

文件寄存器

直接地址 7

RAM 地址9

地址 MUX

间接地址

FSR 寄存器

状态寄存器

MUX

ALU

W 寄存器

指令译码与控制

时序发生

OSC1/CLKI

OSC2/CLKO

8

8

8

3

8 级堆栈(13 位)256 字节

闪存程序

INT

内部振荡器

2006 Microchip Technology Inc. DS51556A_CN 第 9 页

Page 14: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板用户指南

2.2 存储器组织

PICmicro® 单片机设计为程序存储区和数据存储区分离的架构。这样加快了程序执行速度,因为地址总线和数据总线是独立的,不需要在一条总线上完成双重任务。

数据存储器由文件寄存器组成。指令使用 7 个位来引用文件寄存器,从而只能寻址128 个文件寄存器。多个文件寄存器组织成“页”。状态寄存器中的两个位 RP0 和 RP1使得访问多个页成为可能。 RP0 和 RP1 实际上变成了文件寄存器地址的 高两位。器件可能实现或不实现更多的页,这取决于具体的器件型号。

中档器件保留每个页的前 32 个地址,保留给特殊功能寄存器 (Special Function Registers, SFR)。程序通过 SFR 与外设进行交互。控制和数据寄存器存储映射到SFR 空间。每页中大于 0x20 的地址是通用寄存器 (General Purpose Registers,GPR),可以存放程序变量。

一些经常使用的寄存器,可以从任何存储区进行访问。例如,不管通过 RP 位选择了哪个存储区,状态寄存器始终都是可访问的。 后 16 字节 (0x70-0x7F)也可以从任何存储区访问。

通过 13 位程序计数器 (PC)来访问程序存储器。通过 SFR (PCL)访问 PC 的低 8 位, PC 的高 5 位在 PCLATH 中。 PC 的详细信息,请参阅《PIC16F685/687/689/690 数据手册》(DS41262A_CN)的 PCL 和 PCLATH 部分。当程序存储器大小超过 1k 指令字时, PCLATH 就变得重要起来; PCLATH 对于第 12课的查表也很重要。

中档 PICmicro® 单片机的时钟可以由若干种不同的器件提供。除非另有说明,否则本指南的课程中,时钟均为运行在 4 MHz 的内部振荡器。

2.3 指令格式

大多数指令的格式都是三种格式之一:字节操作类指令、位操作类指令以及立即数指令。

字节指令包含 7 位数据地址、目的位以及 6 位操作码。数据地址,加上 RP0 和 RP1位,构成了一个操作数的 9 位数据存储器地址。另一个操作数是工作寄存器 (叫做 W或 Wreg)。在指令执行之后,目的位 (d)指定结果是存放在 W 中还是存放回原文件寄存器中。例如:

ADDWF data,f

将 Wreg和 data的内容相加,结果存放回 data。

位指令对文件寄存器中特定的位进行操作。位指令包含 7 位数据地址、 3 位数字,其余 4 位是操作码。位指令可以将文件寄存器中的特定位置 1 或清零。位指令也可以用来测试文件寄存器中的特定位。例如:

BSF STATUS,RP0

将把状态寄存器中的 RP0 位置 1。立即数指令内含指令的数据操作数。 Wreg 成为另一个操作数。 Call和 GOTO使用11 位作为立即数地址。

MOVLW'A'

将 “A”的 ASCII 值 (0x41)传送至 Wreg 中。

DS51556A_CN 第 10 页 2006 Microchip Technology Inc.

Page 15: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

中档 PICmicro® 单片机架构概述

2.3.1 汇编基础

汇编中的数

除非另有说明,否则汇编器总是假设程序中的数字常量都是十六进制的 (基数16)。汇编器还支持二进制 (基数 2)、八进制 (基数 8)、十进制 (基数 10)以及 ASCII 编码。

十六进制 12或 0x12或 H'12'

十进制 .12或 D'12'

八进制 O'12'

二进制 B'00010010'

ASCII A'c' or 'c'

Org (起点)

Org告诉汇编器从哪里开始生成代码。通常我们从地址 “0000”开始编码,但也可以从其他任何地址开始。低档器件的复位向量位于程序存储器中的 后一个存储单元,所以良好的编程实践是:在复位向量处放置一条指向程序开头的GOTO指令。

End

End告知汇编器停止汇编。在程序末尾必须要有一个 End。End不一定要在文件的末尾,但 End之后的任何语句都不会被汇编。

定义数据存储单元

指定存储单元有三种方法 (见示例 2-1)。

示例 2-1: 定义数据存储器

除非确实有理由要指定具体的存储单元,否则 好使用 cblock/endc方法。由于在开发过程中有时使用使用某个变量,有时不使用,使用 cblock/endc方法的优点是将使存储块保持为 小。如果使用其他方法,你可能不得不回过头来检查以找出未使用的存储单元。

#define Length 0x20 ;c-like syntax

Length equ 0x20 ;equate 0x20 with the symbol

cblock 0x20 ;start a block of variablesLength ;this will be at address 0x20Width ;this will be at address 0x21Area:2 ;this is 2 bytes long, starting at

;address 0x22Girth ;this will be at address 0x24

endc

2006 Microchip Technology Inc. DS51556A_CN 第 11 页

Page 16: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板用户指南

注:

DS51556A_CN 第 12 页 2006 Microchip Technology Inc.

Page 17: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板

用户指南

第 3 章 LPC 演示板课程

3.1 引言

下面的课程涵盖了 LPC 演示板的基本功能。需要的话请参阅适当的文档。在Microchip 网站上可找到文档的 新版本。

代码和十六进制文件安装在 C:\Microchip\PICkit 2 Lessons\目录下。在PICkit™ 2 CD-ROM 上的目录 \PICkit 2 Lessons\下也包含了这些代码和十六进制文件。

3.2 LPC 演示板课程

• 第 1 课:Hello World (点亮 LED)

• 第 2 课:延时循环 (使 LED 闪烁)

• 第 3 课:轮流 (使 LED 轮流点亮)

• 第 4 课:模数转换

• 第 5 课:速度可变的轮流点亮

• 第 6 课:开关防反跳

• 第 7 课:可反向的变速轮流点亮

• 第 8 课:函数调用

• 第 9 课:Timer0• 第 10 课:中断

• 第 11 课:间接数据寻址

• 第 12 课:查表 (ROM 数组)

2006 Microchip Technology Inc. DS51556A_CN 第 13 页

Page 18: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板用户指南

3.2.1 第 1 课:Hello World (点亮 LED)

第一课说明如何点亮 LED。这是 “Hello World”的 PICmicro® 单片机版本,还将讨论I/O 引脚结构。

新指令

BSF 位置 1BCF 位清零

LED连接到 I/O引脚RC0至RC3。当这些 I/O引脚中的一个引脚为高电平时,相应的LED将点亮。 I/O 引脚可以配置为输入或输出。启动时,默认为输入。 TRIS 位使用如下约定:为 “0”表示输出,为 “1”表示输入。我们需要数字输出,所以必须配置引脚。

示例 3-1: PICkit 2,第 1 课:“HELLO WORLD”

现在来看看实现上述功能的程序。

; 注释开始。分号之后同一行上的文本都将被忽略。

#include 包含定义 PIC16F690 中所有特殊功能寄存器的头文件。另外,头文件还定义了有效的存储区域。这些定义与器件数据手册中使用的名称是一致的。

__Config 定义配置字。标号在 p16F690.inc文件中定义。可以对标号进行逻辑与 (AND),形成字。

Org 0 指示汇编器从哪里开始生成代码。可以在器件的任何区域生成代码。中档 PICmicro® 单片机器件的起始地址是 “0”,也称作复位向量。

BCF TRISC,0 指示处理器将文件寄存器中的一位清零。TRISC 是 PORTC 各引脚的三态寄存器。该寄存器中的 bit 0 为 “1”时, PORTC的引脚 0 为输入,为 “0”时 PORTC 的引脚 0 为输出。我们希望引脚为输出,所以必须将该位清零。

BSF PORTC,0 指示处理器将PORTC的引脚0置1。这将使I/O引脚变为高电平状态,点亮 LED。

GOTO $ 指示处理器跳转至当前指令。

详细信息,请参阅 《PIC16F685/687/689/690 数据手册》(DS41262A_CN)的 I/O端口部分。

; PICkit 2 Lesson 1 - 'Hello World';#include <p16F690.inc>

__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOD_OFF & _IESO_OFF & _FCMEN_OFF)

org 0Start

BSF STATUS,RP0 ;select Register Page 1BCF TRISC,0 ;make I/O Pin C0 an outputBCF STATUS,RP0 ;back to Register Page 0BSF PORTC,0 ;turn on LED C0GOTO $ ;wait hereend

DS51556A_CN 第 14 页 2006 Microchip Technology Inc.

Page 19: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

LPC 演示板课程

3.2.2 第 2 课:延时循环 (使 LED 闪烁)

第一课说明了如何点亮 LED,本课程将说明如何使 LED 闪烁。尽管看上去只是对第 1课作了微小的改动,但看了下面的内容后就会清楚改动的理由。

新指令

CLRF 清零文件寄存器

INCF 递增文件寄存器

DECF 递减文件寄存器

INCFSZ 递增文件寄存器,如果为零,则跳过下一条指令

DECFSZ 递减文件寄存器,如果为零,则跳过下一条指令

GOTO 跳转到程序中的新位置

示例 3-2: PICkit 2,第 2 课:闪烁

通过增加了一条 BCF指令并进行循环,可以使 LED 闪烁,但是,闪烁的速度太快以至于无法看到。 LED 看上去只是稍微变暗。循序执行需要 4 个指令周期。第一条指令点亮 LED。第二条指令熄灭 LED。 GOTO指令花费两个指令周期,这意味着 25% 的时间LED 是点亮的。

按照配置, PICmicro 每秒执行一百万条指令。按照这个速度,为了使闪烁可见,需要使闪烁变慢才行,这可以通过使用延时循环来完成。

LoopBSF PORTC,0 ;turn on LED C0BCF PORTC,0 ;turn off LED C0GOTO Loop ;do it again

注: 数一数周期——将时钟速度与指令速度联系起来。处理器执行一条指令需要 4 个时钟。课程中使用的内部振荡器运行速度为 4 MHz,所以指令执行速度是 1 MHz。

2006 Microchip Technology Inc. DS51556A_CN 第 15 页

Page 20: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板用户指南

递增或递减文件寄存器

INCFSZ和 DECFSZ指令将文件寄存器的内容加一或减一,当结果为零时将跳过下一条指令。这两条指令在延时循环中的一种用法,如示例 3-3 所示。

CLRF 清零计数器存储单元。

DECFSZ 递减存储单元,如果结果为零,则跳过下一条指令。

示例 3-3: 延时循环

GOTO Loop(在示例 3-3 中)将重返循环起始处再次执行循环体。这个循环用时 3 个指令周期;一个用于递减,两个用于 GOTO(见注释),计数器将使循环执行 256 次,这样的话执行总计用时 768 个指令周期 (768 µs)。

即便如此,对于肉眼而言还是太快了。在这个循环之外再增加第二个循环,可以使延时变得更慢。

内循环仍然需要 768 µs,加上外循环的 3 µs,但现在外循环要执行 256 次,所以循环总用时 771 * 256 = 197376 µs = 0.197s。

打开 Blink.asm 文件,编译课程。然后,将十六进制文件导入 PICkit 2 并对器件进行编程。注意,现在 LED 大约以 2 Hz 的速率闪烁。

短循环

CLRF DelayLoop

DECFSZ Delay,fGOTO Loop

长循环

CLRF Delay1CLRF Delay2

LoopDECFSZ Delay1,fGOTO LoopDECFSZ Delay2,fGOTO Loop

注: 由于处理器的流水线设计, GOTO指令需要两个指令周期。在执行当前指令时,处理器取出下一条指令。当程序发生跳转时,不会执行预取的指令。

DS51556A_CN 第 16 页 2006 Microchip Technology Inc.

Page 21: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

LPC 演示板课程

3.2.3 第 3 课:轮流 (轮流点亮 LED)

第 1 课和第 2 课说明了如何点亮 LED,然后使用延时循环使 LED 闪烁,在此基础上,本课程将增加轮流点亮功能。程序将点亮 DS4,然后点亮 DS3,接着是 DS2、 DS1,再回到 DS4。

新指令

MOVLW 将立即数装入工作寄存器

MOVWF 将工作寄存器的内容传送到文件寄存器

MOVF 将文件寄存器的内容传送到工作寄存器 (Wreg),或者传送回文件寄存器本身 (见注释)

RRF 右移文件寄存器内容

RLF 左移文件寄存器内容

轮流点亮程序流程

• 首先,初始化 I/O 端口和 Display变量,

• 将 Display变量复制到 I/O 端口,然后

• 延时一小会儿

• 移位 Display

图 3-1: 轮流点亮程序流程

注: 将文件寄存器内容传送到自身,初看起来就像是执行 NOP指令。 不过,这样做是有用的:将根据寄存器内容来设置 Z 标志。换句话说, MOVF fileregister,f是测试值是否为零的简便方法,测试不影响工作寄存器的内容。

初始化 I/O 端口

赋值 Display

延时

移位 Display

复位 Display

溢出了吗?

2006 Microchip Technology Inc. DS51556A_CN 第 17 页

Page 22: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板用户指南

移位

移位指令 (RRF或 RLF)将文件寄存器中的所有位向右或向左移动一个位置,移位时要带进位位。进位位将被移出和移入字节,并接受从字节移出的位。在移位之前,应清零进位位,这样不会在 Display的字节中引入非预期的位。进位位还将表明Display的字节何时为空。当 Display的字节为空时,将 bit 3 重置为 “1”。

PICmicro 单片机有两条移位指令:左移 (RLF)和右移 (RRF)。这两条指令将文件寄存器的内容以及进位位移动一个位置。

图 3-2: 左移

示例 3-4: 轮流点亮示例

文件寄存器进位位

StartBSF STATUS,RP0 ;select Register Page 1CLRF TRISC ;make I/O PORTC all outputBCF STATUS,RP0 ;back to Register Page 0MOVLW 0x08MOVWF Display

MainLoopMOVF Display,w ;Copy the display to the LEDsMOVWF PORTC

OndelayLoop ;Delay .197SDECFSZ Delay1,fGOTO OndelayLoopDECFSZ Delay2,fGOTO OndelayLoop

BCF STATUS,C ;ensure the carry bit is clearRRF Display,f ;Rotate Display rightBTFSC STATUS,C ;Did the bit rotate into the carry?BSF Display,3 ;yes, put it into bit 3.GOTO MainLoop

DS51556A_CN 第 18 页 2006 Microchip Technology Inc.

Page 23: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

LPC 演示板课程

3.2.4 第 4 课:模数转换

本课程说明如何配置 ADC、运行转换、读取演示板上电位计 (RP1)控制的模拟电压以及在显示 LED 上显示电压的高 4 位。

PIC16F690 具有一个模数转换器(Analog-to-Digital Converter,ADC),转换器有 11个通道,每个通道的分辨率均为 10 位。转换器的参考电压可以使用器件的 VDD 或者外部参考电压。 LPC 演示板使用由 USB 电缆提供的 VDD 作为参考电压。转换器的转换结果表示为电压与参考电压的比值:

ADC = V/VREF * 1023将 ADC 转换结果表示为电压,需要解出 V:

V = ADC/1023 * VREF

公式右边三项中有两项是常数,可以事先计算好。这样就不需要做除法,不过仍然需要定点数或浮点数乘法来实时求解方程。

然而 , 在一些时候,比如在读取传感器时,计算电压只是第一步。为了通过计算得到传感器的有意义数据,可能还需要其他数学计算。例如, 在读取热敏电阻时,计算电压只是获得温度过程中的第一步。

转换 ADC 值还有其他方法,包括直接查表或者分段线性插值法。不同的方法代表了不同的速度 / 存储器权衡。

原理图 (附录 A “硬件原理图”)表明电位计的滑动头连接到 PIC16F690 上的引脚RA0。

本课程必须要进行如下设置:

• 将 PORTA 配置为模拟输入, TRISA<0> = 1, ANSEL<0> = 1。• 在 ADCON1 中选择时钟分频比。

• 在 ADCON0 中选择通道、对齐方式和 VREF 源。

2006 Microchip Technology Inc. DS51556A_CN 第 19 页

Page 24: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板用户指南

3.2.4.1 ADCON1

ADCON1 选择处理器时钟速度与转换速度之比。这很重要,因为 ADC 每位至少需要1.6 µs。如果时钟速度太高,精度将降低。随着处理器时钟速度的增加,需要越来越大的分频比,以便保持转换速度。当转换速度为每位 2 µs 时,在 8:1 比例下时钟速度快为 4 MHz。推荐的配置,请参阅 《PIC16F685/687/689/690 数据手册》(DS41262A_CN) 模数转换部分中的 “TAD 与器件工作频率关系表”。

寄存器 3-1: ADCON1 – A/D 控制寄存器 1(地址:9Fh) U-0 R/W-0 R/W-0 R/W-0 U-0 U-0 U-0 U-0— ADCS2 ADCS1 ADCS0 — — — —

bit 7 bit 0

bit 7 未用:读为 0

bit 6-4 ADCS<2:0>:A/D 转换时钟选择位

000 = FOSC/2001 = FOSC/8010 = FOSC/32x11 = FRC (时钟由专用内部振荡器 = 大 500 kHz)100 = FOSC/4101 = FOSC/16110 = FOSC/64

bit 3-0 未用:读为 0

图注:

R = 可读位 W = 可写位 U = 未用位,读为 0- n = 上电复位时的值 1 = 置 1 0 = 清零 x = 未知

DS51556A_CN 第 20 页 2006 Microchip Technology Inc.

Page 25: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

LPC 演示板课程

3.2.4.2 ADCON0

ADCON0控制ADC的操作。bit 0开启ADC模块。 bit 1启动转换,而bit<5:2>选择 ADC进行转换的通道。 VCFG bit< 6> 选择 ADC 参考电压,可以是 VDD,也可以是 VREF上的独立参考电压。ADFM bit<7> 选择 16 位数中的 10 位转换结果是右对齐还是左对齐。

对于本课程,必须开启 ADC 并指向 RA0。选择内部参考电压和 8 TOSC 的转换时钟。

在改变通道后, ADC 需要约 5 µs 来使 ADC 采样电容稳定。 后,将 ADCON0 中的GO 位置 1,启动转换。GO 位同时还用作 DONE 标志。即,当转换结束时,ADC 将清零同一个位。然后在 ADRESH:ADRESL 中给出转换结果。

本课程使用转换结果的高 4 位,将转换结果拷贝到与 PORTC 相连的显示 LED。

ADC 模块的详细信息,请参阅 《PIC16F685/687/689/690 数据手册》(DS41262A_CN)的模数转换部分。

寄存器 3-2: ADCON0 – A/D 控制寄存器 (地址:1Fh) R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0ADFM VCFG CHS3 CHS2 CHS1 CHS0 GO/DONE ADON

bit 7 bit 0

bit 7 ADFM:A/D 结果对齐格式选择位

1 = 右对齐0 = 左对齐

bit 6 VCFG:参考电压位1 = VREF 引脚

0 = VDD

bit 5-2 CHS<3:0>:模拟通道选择位

0000 = 通道 00 (AN0)0001 = 通道 01 (AN1)0010 = 通道 02 (AN2)0011 = 通道 03 (AN3)0100 = 通道 04 (AN4)0101 = 通道 05 (AN5)0110 = 通道 06 (AN6)0111 = 通道 07 (AN7)1000 = 通道 08 (AN8)1001 = 通道 09 (AN9)1010 = 通道 10 (AN10)1011 = 通道 11 (AN11)1100 = CVREF1101 = VP61110 = 保留。未使用。1111 = 保留。未使用。

bit 1 GO/DONE :A/D 转换状态位1 = A/D 转换进行中。将此位置 1 将启动一个 A/D 转换周期。

当 A/D 转换完成时,硬件将自动清零此位。0 = A/D 转换完成 / 不在进行转换

bit 0 ADON :A/D 使能位1 = A/D 转换器模块使能

0 = A/D 转换器关闭,不消耗工作电流

图注:

R = 可读位 W = 可写位 U = 未用位,读为 0- n = 上电复位时的值 1 = 置 1 0 = 清零 x = 未知

2006 Microchip Technology Inc. DS51556A_CN 第 21 页

Page 26: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板用户指南

3.2.5 第 5 课:变速轮流点亮

使用模数转换器 (ADC)控制轮流点亮的速度,第 5 课将第 3 课和第 4 课融合在一起。

新指令

BTFSS 位测试,如果为 1 则跳过下一条指令

BTFSC 位测试, 如果为 0 则跳过下一条指令

主循环每执行一次,就进行一次转换。转换结果控制外循环的长度 (见示例 3-5)。

示例 3-5: 变速轮流点亮示例

图 3-3: 变速轮流点亮程序流程

...BSF ADCON0,GO ;start conversionBTFSS ADCON0,GO ;this bit will change to zero when the

;conversion is completeGOTO $-1MOVF ADRESH,w ;Copy the display to the LEDsADDLW 1MOVWF Delay2

A2DDelayLoopDECFSZ Delay1,f ;Delay Loop shortened by the ADResult as

;controlled by the Pot. GOTO A2DDelayLoopDECFSZ Delay2,fGOTO A2DDelayLoop

初始化 I/O 端口

赋值 Display

使用 ADC 延时

移位 Display

复位 Display

溢出了吗?

初始化 ADC

获取 ADC 结果

DS51556A_CN 第 22 页 2006 Microchip Technology Inc.

Page 27: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

LPC 演示板课程

3.2.6 第 6 课:开关防反跳

机械式开关在计算机、微处理器和单片机的实际应用中具有重要而广泛的运用。机械开关不昂贵、简单且可靠。不过,开关的噪声可能非常大。开、关动作产生明显的噪声,其后果是很少产生噪声极低的电气转换。在开关状态 后稳定下来之前,连接建立、断开好几次,甚至可能数百次。

这个问题叫做开关反跳。断断续续活动产生的部分原因,是由于开关触点实际上相互弹开。想象一下两个桌球相互碰撞。桌球硬质无弹性的材料不会吸收运动的动能。能量随着时间和摩擦而逐渐损耗;摩擦存在于反跳动作中,反跳对抗着使桌球碰撞在一起的力。硬质金属开关触点的作用方式几乎是一样的。另外,开关触点的平滑程度并不完美。 当触点运动相互接触时,表面的不光滑和杂质将导致电气连接的不连续。其结果就是开关反跳。

不正确的开关反跳的后果令人烦恼,有时甚至是灾难性的。例如,你要将电视调到下一个频道,结果却调到了再后面一个频道,中间跳过了一个频道。设计人员应该尽量避免这样的情形。

即便在 早的计算机出现之前,开关反跳已经是一个问题。传统的解决方案包含滤波,例如,通过电阻电容电路,或者通过可重置移位寄存器(参见图 3-4 和图 3-5)。这些方法仍然有效,不过由于在材料、安装以及电路板面积上有要求,从而要产生额外的成本。在软件免费、程序存储器充足时,为什么还要负担额外的成本呢?

图 3-4: 滤波防反跳方案

图 3-5: 移位寄存器防反跳方案

+V

R1

R2

滤波后的开关输出

SW

C1

+V

R1

滤波后的开关输出

SW

防反跳时钟

D

CLKCLR

Qn

2006 Microchip Technology Inc. DS51556A_CN 第 23 页

Page 28: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板用户指南

一种 简单的开关防反跳方法,是持续采样开关直到信号稳定为止,或者持续采样开关信号直到不再检测到反跳为止。持续采样多长时间需要稍作考虑。不过,通常 5 ms 就足够长了,而且反应还足够迅速,用户不会注意到。

第 6 课将说明:如何以 1 ms 的速度采样信号,一直到状态连续改变一定次数 ,也就是简单地计数到 5,然后如果原始状态没有改变的话就复位计数器。

LPC 演示板上的开关反跳得并不厉害,不过,良好的习惯做法是:在系统中对所有开关进行防反跳处理。

图 3-6: 简单开关防反跳程序流程

计数器递增

复位计数器

改变状态复位计数器

计数器 = 5?

开关改变 状态了吗?

延时 1 ms

DS51556A_CN 第 24 页 2006 Microchip Technology Inc.

Page 29: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

LPC 演示板课程

3.2.7 第 7 课:可反向的变速轮流点亮

第 7 课将第 5 课和第 6 课结合在一起:使用按钮,在按钮按下时改变轮流点亮的方向,调节电位计将控制轮流点亮的速度。

程序需要跟踪轮流点亮的方向,为了反向轮流点亮还需要增添新的代码。

第 5 课中是向右轮流点亮,检查进位位是否为 “1”从而判断什么时候重新开始轮流点亮序列。第 7 课中,我们还需要向左轮流点亮并检查 Display的 bit 4 是否为“1”。当 Display的 bit 4 为 “1”时,在 bit 0 处重新插入一个 “1”。

示例 3-6: 可反向变速轮流点亮示例

原始形式:

RotateRRF Display,fBTFSC STATUS,C ;Did the bit rotate into the carry?BSF Display,3 ;yes, put it into bit 3.

双向形式:

RotateBCF STATUS,C ;ensure the carry bit is clearBTFSS Direction,0GOTO RotateLeft

RotateRightRRF Display,fBTFSC STATUS,C ;Did the bit rotate into the carry?BSF Display,3 ;yes, put it into bit 3.GOTO MainLoop

RotateLeftRLF Display,fBTFSC Display,4 ;did it rotate out of the displayBSF Display,0 ;yes, put it into bit 0GOTO MainLoop

2006 Microchip Technology Inc. DS51556A_CN 第 25 页

Page 30: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板用户指南

3.2.8 第 8 课:函数调用

第 8 课说明如何反向轮流点亮 LED,但是将延时循环以函数的形式重写。

新指令

CALL 调用函数或子程序

RETURN 终止函数或子程序

RETLW 终止函数或子程序

使用 CALL指令调用函数或子程序,使用 RETURN或 RETLW指令结束函数或程序。RETURN跳转回原程序中紧接着 CALL后的指令。RETLW也将返回至调用程序,但要将一个常数装载到工作寄存器中。

中档 PICmicro MCU 器件的 CALL堆栈能够保存至多 8 个返回地址。如果执行第九个CALL的话,堆栈顶部将被覆写,程序不能够正常地依次返回。

传递参数

可以用几种方式将参数传递给子程序。使用工作寄存器来传递一个字节很方便,可以使用 FSR 来传递另一个字节,如果 FSR 没有用于其他用途的话。如果必须传递更多的数据,则必须分配缓冲区。

在将 Delay 函数作为子程序执行之前, ADC 转换结果被传送到工作寄存器,然后CALL指令将程序控制转交给 Delay 子程序。 RETURN指令将程序控制转交给紧接着CALL指令的 MOVLW指令。

示例 3-7: 函数调用示例

MOVF ADRESH,wCALL Delay ;call delay function

;returns here when done...GOTO xxx

; Delay function. ; Delay time is Wreg value * 771 uSDelay

MOVWF Delay2DelayLoop

DECFSZ Delay1,fGOTO DelayLoopDECFSZ Delay2,fGOTO DelayLoopRETURN

DS51556A_CN 第 26 页 2006 Microchip Technology Inc.

Page 31: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

LPC 演示板课程

3.2.9 第 9 课: Timer0Timer0 是在处理器中实现的计数器,它可以用来对处理器时钟周期或外部事件进行计数。第 9 课中,将配置 Timer0,对指令周期进行计数,在计满返回时置 1 标志。这将使处理器摆脱无用的周期,做有意义的工作。

Timer0 是 8 位计数器,带有可选的预分频器,预分频器的预分频比设置为 256,在时钟信号进入 Timer0 计数器之前进行分频。

图 3-7: TIMER0 简化框图

TMR0 是个特殊功能寄存器(SFR),可以被程序读取或修改。预分频器不是 SFR,不能被程序读取或修改。不过,写 TMR0 将清零预分频器。

定时器的时钟来源,可以是处理器时钟,也可以是外部事件。当定时器使用处理器时钟时,定时器每指令周期递增一次。这是很方便的标记时间的方法,比延时循环要好,因为这样使得处理器能够处理问题,而不是在延时循环中浪费指令周期。

通过 OPTION_REG 配置预分频器,参见图 3-8。

图 3-8: 使用 OPTION_REG,配置预分频器

第 9 课中,将 Timer0 和预分频器配置为 Timer0 上 大延时。预分频器将处理器时钟进行 256 分频, Timer0 还要再次 256 分频。这样, Timer0 标志将在每 65536 µs (0.0000001 秒 * 256 * 256)置为 1,或者说,每秒置 1 约 15 次。主程序一直在循环中,等待计数器计满返回;当计数器计满返回时,程序将递增 Display,然后循环返回。

预分频器 T0IFTMR0Clock/4 或

T0CKI 引脚

预分频器可以配置为2、4、8、16、32、64、 128 或 256 分频。

当 TMR0 溢出时

置 1 标志。标志

注: 详情参见 PIC16F690 的 Timer0 部分。

必须在软件中清零。

X X T0CS T0SE PSA PS2 PS1 PS0bit 7 bit 0

图注:

X: 无关——与 Timer0 无关。

T0CS:Timer0 时钟源选择,为 0 时使用指令时钟。

T0SE:Timer0 时钟源边沿——当连接到指令时钟时忽略。

PSA: 预分频器分配,为 0 则分配给 Timer0。PS: 预分频比选择,为 “111”—— 大预分频比, 256 分频。

2006 Microchip Technology Inc. DS51556A_CN 第 27 页

Page 32: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板用户指南

示例 3-8: TIMER0 示例

ORG 0BSF STATUS,RP0MOVLW b'00000111' ;configure Timer0. Sourced from the

;Processor clockMOVWF OPTION_REG ;Maximum PrescalerCLRF TRISC ;Make PORTC all outputCLRF DisplayBCF STATUS,RP0

ForeverLoopBTFSS INTCON,T0IF ;wait here until Timer0 rolls overGOTO ForeverLoopBCF INTCON,T0IF ;flag must be cleared in softwareINCF Display,f ;increment display variableMOVF Display,w ;send to the LEDsMOVWF PORTCGOTO ForeverLoop

END

DS51556A_CN 第 28 页 2006 Microchip Technology Inc.

Page 33: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

LPC 演示板课程

3.2.10 第 10 课:中断

新指令

RETFIE 从中断返回

SWAPF 文件寄存器中内容半字节交换

中断源

大多数外设都能产生中断;同也可以将一些 I/O 引脚配置为在它们改变状态时产生中断。

在外设需要服务时,它将其中断标志置 1。每个中断标志与其允许位进行逻辑与操作(AND),然后结果进行逻辑或运算 (OR),形成主中断。主中断与全局中断允许位(GIE)进行逻辑与。中断逻辑的完整图示,请参阅 《PIC16F685/687/689/690 数据手册》(DS41262A_CN)中的中断逻辑图。中断允许位使得 PICmicro 单片机能够限制至某些外设的中断源。

图 3-9: 简化的中断逻辑

当主中断信号有效时, PICmicro 单片机结束当前指令,将下一条指令地址存入 CALL堆栈,然后跳转至中断服务程序 (ISR)。还将清零 GIE 位,防止在服务当前中断时产生其他中断。

保存当前现场

ISR 必须做的第一件事就是保存当前处理器现场,这样在返回到主程序之前可以恢复处理器现场。还必须保存任何可能改变状态的特殊功能寄存器,这意味着至少要保存工作寄存器和状态寄存器。每个 PIC16F690 文件寄存器页的 后 16 字节没有分配给任何存储区,是保存现场的好地方,因为,可以从任何寄存器页访问这 16 字节,不用理会状态寄存器中的 RP0 和 RP1 位。未分配给存储区的寄存器地址,随器件的不同而变化。请查阅寄存器映射,以便获得特定器件未分配给存储区的区域的信息。

识别触发事件

接下来, ISR 需要找出是什么触发了中断。 ISR 需要检查中断标志,确定是什么触发了中断。在 ISR 找到中断源后,就能够为外设提供服务了。

主中断

全局中断允许

中断标志

中断允许

其他中断源

2006 Microchip Technology Inc. DS51556A_CN 第 29 页

Page 34: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板用户指南

恢复现场

一旦外设得到服务,就需要恢复现场,继续执行主程序。恢复现场要比初看上去困难一些。 明显的方法并不适用,因为 MOVF W_Temp,w可能影响前一条指令恢复的 Z标志。为此,可以使用一对 SWAPF指令恢复工作寄存器,而不会影响到状态寄存器中的标志。 SWAPF交换高、低位半字节。第一个 SWAPF交换文件寄存器中的半字节,第二个 SWAPF将半字节交换回去,存放到工作寄存器中。

示例 3-9: 现场恢复

后, RETFIE将控制交回给原程序,将 GIE 位置 1 重新允许中断。

图 3-10: SWAPF指令

;incorrect context restoreMOVF STATUS_Temp,wMOVWF STATUSMOVF W_Temp ;this may change the Z bit

;in the Status register

;good context restoreMOVF STATUS_Temp,wMOVWF STATUSSWAPF W_Temp,f ;swap in placeSWAPF W_Temp,w ;swap with Wreg destination

之前

之后

1 0 1 0 0 0 1 1

1 0 1 00 0 1 1

DS51556A_CN 第 30 页 2006 Microchip Technology Inc.

Page 35: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

LPC 演示板课程

3.2.11 第 11 课:间接数据寻址

FSR (File Select Register,文件选择寄存器)允许指定文件寄存器地址。而后对INDF (间接文件寄存器)进行的读和写都将针对由 FSR 寻址的文件寄存器。

这可以用来实现移动平均滤波器。移动平均需要记录 近的 n 个值,并计算其平均值。滤波器需要两个部分:一个循环对列,一个计算平均值的函数。

图 3-11: 移动平均

在中档 PICmicro 单片机中计算平均值, 佳的实现方法是:使用 FSR 跟踪下一个值将要插入的位置。这将确保 旧值始终被 新值覆写,不需要将时间浪费在在存储器中移动数据上。

示例 3-10: 文件选择寄存器示例

Time Average

n 105 102 101 104 99 103 105 107 103n + 1 106 105 102 101 104 99 103 105 103n + 2 110 106 105 102 101 104 99 103 104

新值插入在这里

其余值向下移动一个位置

概念视图

实现视图

Time Average

n 107 105 101 104 99 101 102 105 103

n + 1 106 105 102 101 99 101 102 105 103

n + 2 106 110 103 99 99 101 102 105 104

指针指向 旧值

覆盖 旧值,指针前进

指针前进

;insert new value into a queue, enter with new value in;Wreg

MOVF temp ;save the latest valueMOVF QueuePointer,wMOVWF FSR ;load FSR with the queue pointerMOVF temp,wMOVWF INDF ;Write the latest value to the queue

2006 Microchip Technology Inc. DS51556A_CN 第 31 页

Page 36: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板用户指南

第 11 课向第 4 课的模数转换代码增加移动平均滤波器。调节电位计改变模数转换读取的值。然后经过滤波的值被送给 LED 显示。滤波器每 0.2 秒只运行一次,这将放慢显示变化的速度,使得显示可见。 显示的是从电位计原先位置到新位置的计数值。

滤波器求 后 8 个读数的平均值。样本数选择 2 的幂,使得可以通过移位来做除法,而不是使用普通 (longhand)除法。

并不需要每次都对数组求和,跟踪前次求和结果,从中减去对列中的 旧值然后再加上新值,这样 快。

DS51556A_CN 第 32 页 2006 Microchip Technology Inc.

Page 37: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

LPC 演示板课程

3.2.12 第 12 课:查表 (ROM 数组)

第 8 课介绍了函数调用。第 12 课将说明如何使用函数调用和程序计数器的计算修改来实现查表 (见示例 3-11)。

有时,用查表的方式来进行值转换很有用。

如果用高级语言来表达,看上去就像是:

y = function(x) ;即,对于每个 x 值,将返回对应的 y 值。

在将输入转换为有意义的数据时,查表是 快的方法,因为传递函数已经预先计算好,是 “查找”而不实时计算。

PICmicro 单片机查表的实现方法是直接修改程序计数器。例如,考虑一个将十六进制数转换为等价的 ASCII 码的函数。 我们可以取出每个半字节,然后调用查表。 索引将使程序计数器前进到恰当的 RETLW 指令处, RETLW 指令将常数装载到工作寄存器中去,然后返回调用程序。

示例 3-11: 查表

绝大多数时候,调用查表是可行的。但是,如果查表跨越了 256 字节的页边界, 或者以某种方式使用了边界之外的索引值调用查表,程序将跳转到查表之外的地址。

良好的编程习惯要求使用一些额外的指令。首先,因为查表只有十六项,应确保传入的数不大于 16。 简单的方法是在修改 PCL 之前,将工作寄存器的内容进行逻辑与运算:ANDLW 0x0F。根据具体的应用,可能需要更加复杂的错误恢复机制。

此外,如果查表跨越了 256 字节的边界,有一些麻烦的地方必须小心。程序计数器是13 位宽的,而 PCL 仅仅是其低 8 位(见图 3-12)。余下的 5 位存放在 PCLATH 中。 然而,低 8 位的溢出,并不会自动进入 PCLATH 中。所以,在代码中必须检查并处理这种情况。至于 PCLATH 如何使用的细节,请参阅 《PIC16F685/687/689/690 数据手册》(DS41262A_CN)中的 PCL 和 PCLATH 部分。

图 3-12: PC 载入, PC 是指令的目的寄存器

;Enter with index in WregLook-upTable

ADDWF PCL,f ;jump to RETLW '0' ;index 0RETLW '1' ;index 1...RETLW 'F' ;index 15

PC

12 8 7 0

5PCLATH<4:0>

PCLATH

ALU 结果8

PCH PCL PCL 作为目的寄存器的指令

2006 Microchip Technology Inc. DS51556A_CN 第 33 页

Page 38: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板用户指南

本课程使用查表来实现二进制数到格雷码的转换。格雷码是二进制形式的编码,但相邻编码序列只有一位有变化。格雷码经常用于编码器应用中,用来避免状态之间的剧烈跳变。二进制编码器的典型实现是一个不透明的圆盘,使用光敏传感器来感应信号。由于不同的位有不同的阈值电压,位可能在略微不同的时间发生变化,这将产生暂时的无效结果。格雷码能够避免这样的情况,因为相邻编码序列只有一位发生变化。当前编码是正确的,除非它转变到下一个编码。

二进制与格雷码之间的转换算法相当复杂。在位数比较少的时候,表查找方法代码量较小且速度较快。

本课程将使用模数转换的值,将值转换成格雷码并在 LED 上显示。当在电位计量程内调节电位计时,编码一次只改变一位 (见示例 3-12)。

格雷码转换

十进制 二进制

0 0000

1 0001

2 0011

3 0010

4 0110

5 0111

6 0101

7 0100

8 1100

9 1101

10 1111

11 1110

12 1010

13 1011

14 1001

15 1000

DS51556A_CN 第 34 页 2006 Microchip Technology Inc.

Page 39: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

LPC 演示板课程

示例 3-12: 将二进制数转换为格雷码

; Convert 4 bit binary to 4 bit Gray code; BinaryToGrayCode

ANDLW 0x0F ;mask off invalid entriesMOVWF tempMOVLW high TableStart ;get high order part of the beginning of

;the tableMOVWF PCLATHMOVLW low TableStart ;load starting address of tableADDWF temp,w ;add offsetBTFSC STATUS,C ;did it overflow?INCF PCLATH,f ;yes: increment PCLATHMOVWF PCL ;modify PCL

TableStartRETLW b'0000' ;0RETLW b'0001' ;1RETLW b'0011' ;2RETLW b'0010' ;3RETLW b'0110' ;4RETLW b'0111' ;5RETLW b'0101' ;6RETLW b'0100' ;7RETLW b'1100' ;8RETLW b'1101' ;9RETLW b'1111' ;10RETLW b'1110' ;11RETLW b'1010' ;12RETLW b'1011' ;13RETLW b'1001' ;14RETLW b'1000' ;15

2006 Microchip Technology Inc. DS51556A_CN 第 35 页

Page 40: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板用户指南

注:

DS51556A_CN 第 36 页 2006 Microchip Technology Inc.

Page 41: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

低引脚数演示板

用户指南

附录 A 硬件原理图

A.1 引言

本附录给出了低引脚数演示板的原理图。

图 A-1: 低引脚数演示板原理图

14

13

12

11

104321 98765

21654321

6 7 8 92 5

13

12

11

10

20

19

18

17

16

15

14

3 41

VP

P

VD

D

GN

D

ICS

PD

AT

ICS

PC

LK

T1G

RC

2/A

N6/P

1D

RC

1/A

N5/C

12IN

-

RC

0/A

N4/C

2IN

+

RA

2/A

N2/T

0C

LK

I/IN

T/C

1O

UT

RA

1/A

N1/C

12IN

-/V

RE

F/IC

SP

CLK

RA

0/A

N0/C

1IN

+/IC

SP

DA

T/U

LP

WU

VS

S

RB

7/R

X/C

K

RC

5/C

CP

1/P

1A

RC

4/C

2O

UT

/P1B

RC

3/A

N7/P

1C

RC

6/A

N8/S

S

RC

7/A

N9/S

DO

VD

D

RB

4/A

N10/S

DI/S

DA

RB

5/A

N11/R

X/D

T

RB

6/S

CK

/SC

K

RA

4/A

N3/T

1G

/OS

C2/C

LK

OU

T

RA

5/T

1C

KI/O

SC

1/C

LK

IN

RA

3/M

CLR

/VP

P

+V

+V

+V

+V

+V

RC

3

RC

2

RC

1

RC

0

RA

3

RA

0

RC

7

RC

6

RB

7R

B6

RB

5

RB

4

RC

2

RC

5

RC

4

RC

3

RC

1

RC

0

RA

5

RA

4

RA

3R

A2

RA

1

RA

0

RC

4

RC

2

RA

5

RA

4

RA

3

RA

2

RA

1

RA

0

RC

5

RC

3

RC

1

RC

0

C1

0.1

µF

C2

0.1

µF

DS

1

DS

2

DS

3

DS

4

J1

JP

1

JP

2

JP

3

JP

4

JP

5

P2

P1

R1

10 K

Ω

R2

1 K

Ω

R3

470

Ω

R4

470

Ω

R5

470

Ω

R6

470

Ω

R7

1K

ΩR

P1

10 K

Ω

SW

1

U1

PIC16F690/P

RA

5

RA

4

RA

3

RC

5

RC

4

RC

3

RA

0

RA

1

RA

2

RC

0

RC

1

RC

2

+5V

GN

D

PW

R

ICS

PT

M

2006 Microchip Technology Inc. DS51556A_CN 第 37 页

Page 42: 低引脚数演示板 用户指南 - ww1.microchip.comww1.microchip.com/downloads/en/devicedoc/51556a_cn.pdf · 第5 课中是向右轮流点亮,检查进位位是否为“1”从而判断什么时候重新开始轮流

DS51556A_CN 第 38 页 2006 Microchip Technology Inc.

全球销售及服务网点

10/31/05

美洲公司总部 Corporate Office2355 West Chandler Blvd.Chandler, AZ 85224-6199Tel: 1-480-792-7200 Fax: 1-480-792-7277技术支持:http://support.microchip.com网址:www.microchip.com亚特兰大 AtlantaAlpharetta, GA Tel: 1-770-640-0034 Fax: 1-770-640-0307波士顿 BostonWestborough, MA Tel: 1-774-760-0087 Fax: 1-774-760-0088芝加哥 ChicagoItasca, IL Tel: 1-630-285-0071 Fax: 1-630-285-0075达拉斯 DallasAddison, TX Tel: 1-972-818-7423 Fax: 1-972-818-2924底特律 DetroitFarmington Hills, MI Tel: 1-248-538-2250Fax: 1-248-538-2260科科莫 KokomoKokomo, IN Tel: 1-765-864-8360Fax: 1-765-864-8387洛杉矶 Los AngelesMission Viejo, CA Tel: 1-949-462-9523 Fax: 1-949-462-9608圣何塞 San JoseMountain View, CA Tel: 1-650-215-1444Fax: 1-650-961-0286加拿大多伦多 TorontoMississauga, Ontario, CanadaTel: 1-905-673-0699 Fax: 1-905-673-6509

亚太地区

中国 - 北京Tel: 86-10-8528-2100 Fax: 86-10-8528-2104

中国 - 成都Tel: 86-28-8676-6200 Fax: 86-28-8676-6599

中国 - 福州Tel: 86-591-8750-3506 Fax: 86-591-8750-3521

中国 - 香港特别行政区Tel: 852-2401-1200 Fax: 852-2401-3431

中国 - 青岛Tel: 86-532-8502-7355 Fax: 86-532-8502-7205

中国 - 上海Tel: 86-21-5407-5533 Fax: 86-21-5407-5066

中国 - 沈阳Tel: 86-24-2334-2829 Fax: 86-24-2334-2393

中国 - 深圳Tel: 86-755-8203-2660 Fax: 86-755-8203-1760

中国 - 顺德Tel: 86-757-2839-5507 Fax: 86-757-2839-5571

中国 - 武汉Tel: 86-27-5980-5300 Fax: 86-27-5980-5118

中国 - 西安Tel: 86-29-8833-7252 Fax: 86-29-8833-7256

台湾地区 - 高雄Tel: 886-7-536-4818Fax: 886-7-536-4803

台湾地区 - 台北Tel: 886-2-2500-6610 Fax: 886-2-2508-0102

台湾地区 - 新竹Tel: 886-3-572-9526Fax: 886-3-572-6459

亚太地区

澳大利亚 Australia - SydneyTel: 61-2-9868-6733 Fax: 61-2-9868-6755

印度 India - BangaloreTel: 91-80-2229-0061 Fax: 91-80-2229-0062

印度 India - New DelhiTel: 91-11-5160-8631Fax: 91-11-5160-8632

印度 India - PuneTel: 91-20-2566-1512Fax: 91-20-2566-1513

日本 Japan - YokohamaTel: 81-45-471- 6166 Fax: 81-45-471-6122韩国 Korea - GumiTel: 82-54-473-4301Fax: 82-54-473-4302

韩国 Korea - SeoulTel: 82-2-554-7200 Fax: 82-2-558-5932 或82-2-558-5934

马来西亚 Malaysia - PenangTel: 60-4-646-8870Fax: 60-4-646-5086

菲律宾 Philippines - ManilaTel: 63-2-634-9065Fax: 63-2-634-9069新加坡 SingaporeTel: 65-6334-8870 Fax: 65-6334-8850

泰国 Thailand - BangkokTel: 66-2-694-1351Fax: 66-2-694-1350

欧洲奥地利 Austria - WelsTel: 43-7242-2244-399Fax: 43-7242-2244-393丹麦 Denmark-CopenhagenTel: 45-4450-2828 Fax: 45-4485-2829法国 France - ParisTel: 33-1-69-53-63-20 Fax: 33-1-69-30-90-79德国 Germany - MunichTel: 49-89-627-144-0 Fax: 49-89-627-144-44意大利 Italy - Milan Tel: 39-0331-742611 Fax: 39-0331-466781荷兰 Netherlands - DrunenTel: 31-416-690399 Fax: 31-416-690340西班牙 Spain - MadridTel: 34-91-708-08-90Fax: 34-91-708-08-91英国 UK - WokinghamTel: 44-118-921-5869Fax: 44-118-921-5820