<4D F736F F D D433635CFB5C1D0B5A5C6ACBBFAD4ADC0EDBCB0BFAAB7A25F56312E322E646F63>

Size: px
Start display at page:

Download "<4D F736F F D D433635CFB5C1D0B5A5C6ACBBFAD4ADC0EDBCB0BFAAB7A25F56312E322E646F63>"

Transcription

1 凌阳 8 位通用单片机 SPMC65 系列单片机原理及开发 VERSION 凌阳单片机推广中心

2 前 言 通用单片机, 其实泛指微控器, 对于芯片提供厂商, 又指应用于通用领域的单片机产品 ; 广泛应用于家电产品 工业控制产品 仪器仪表设备 智能控制器等当中, 渗透在人们的日常生活 生产活动当中 按照通用单片机的数据总线位数划分, 也分为 4 位 8 位 16 位以及 32 位通用单片机 / 微控制器, 其中又以 8 位通用单片机在通用领域应用的市场当中, 占据最大的份额 ; 而且随着需求的增涨, 全球 8 位通用单片机的出货量还在攀升当中 在 8 位通用单片机的供货商中, 有很多世界知名的芯片厂商, 都在给广大用户提供各种规格的通用单片机产品, 应用于各种领域 ; 凌阳科技 (Sunplus Technology Co., Ltd.) 作为全球知名的芯片设计公司, 在通用单片机产品上, 提供了 SPMC 系列通用单片机 从 2000 年开始, 凌阳科技为回馈教育, 改善大专院校单片机教学条件, 增进高校师生接触新技术 新器件的机会, 推出具有长远战略意义的凌阳科技大学计划 到 2005 年在国内已有 300 多所大学与凌阳科技大学计划进行合作, 并且建立了 100 多所凌阳 16 位单片机实验室, 取得了令人瞩目的成就 而在 2005 年, 为了配合新一代凌阳通用单片机的推广, 凌阳科技成立了凌阳单片机推广中心, 负责凌阳通用单片机产品的推广 销售 技术支持等业务 2005 年年中, 成立不久的凌阳单片机推广中心, 随即发布了新一代的 8 位 SPMC65 系列通用单片机, 并以优良的抗干扰性能 高性价比 全面的技术支持服务等特点进入 MCU 领域 SPMC65 系列单片机采用凌阳的 8 位 SPMC65 内核, 以 SOC 单片机的设计思想, 给用户提供好用 适用 可靠的单片机 该系列单片机在资源上拥有多通道 10 位 ADC 拥有 CCP 功能的定时器 驱动能力强的端口, 以及多种串行通讯接口等 ; 不同规格的芯片适用在不同的产品设计当中, 比如 :SPMC65P2404A 适合开发定频空调, 以及同等资源要求的产品 ;SPMC65P2204A 就非常适合开发电磁炉 ;SPMC65P2404A 也非常适合电机的伺服驱动器的开发 本书结合凌阳单片机推广中心 MCU 技术支持部人员的开发应用经验, 以及凌阳公司各个部门在芯片设计 系统应用 软件开发等方面的经验, 系统地介绍了凌阳 SPMC65 系列 8 位通用单片机的内核特点 指令系统 硬件结构 集成开发环境 (Fortis IDE) 软硬件开发工具, 以及多个应用实例 本书共分 10 章 : 第 1 章为凌阳 SPMC65 系列单片机, 介绍凌阳 SPMC65 系列单片机的性能特点, 内核结构, 以及 SPMC65P2408A 单片机的资源特点 最小系统等 第 2 章为 SPMC65 系列单片机指令系统, 系统的介绍 SPMC65 内核的指令集 伪指令以及常用软件设计 第 3 章至第 8 章分别分绍 SPMC65 系列单片机的各种硬件功能模块, 如 I/O 端口 中断系统 定时器 串行接口 模拟外设 复位 时钟源等 ; 每一个功能模块的介绍均配有片段代码, 介绍各个功能模块的使用方法 第 9 章为 SPMC65 系列单片机的开发工具, 分别介绍 Fortis 集成开发环境 (IDE), 以及 Q-Writer 编程工具 SPMC65 系列单片机在线仿真编程器 第 10 章为 SPMC65 系列单片机的应用实例, 给出了利用 SPMC65 系列单片机实现红外遥控接收 智能电饭煲 定频空调等的应用实例 全书由北京北阳电子技术有限公司大学计划处处长罗亚非 张向艳统一审稿, 由凌阳单片机推广中心多位工程师负责编写, 在编写过程中, 得到了台湾凌阳科技 IP 开发处 系统应用中心的多位工程师的技术指导, 在此致以诚挚的谢意 在阅读本书时, 读者可以登陆凌阳单片机网站 下载更多 SPMC65 系列单片机的资料, 以便参考, 也可以登陆论坛进行在线讨论 本书的编排和规划, 汇聚了多位电子工程师的开发与使用经验而成, 如果有谬误之处, 还请各位读者

3 赐与宝贵的建议 欢迎发邮件与我们联络 编者 2005 年 12 月 7 日于北京

4 目 录 第 1 章 凌阳 SPMC65 系列单片机 凌阳通用单片机简介 SPMC65 系列单片机简介 SPMC65 系列单片机特点 SPMC65 系列单片机 CPU 内核 SPMC65 系列单片机的存储器 SPMC65P2408A 单片机...11 第 2 章 SPMC65 系列单片机指令系统 符号约定 寻址方式 指令系统 常用伪指令 常用程序实例...62 第 3 章 I/O 端口原理及应用 I/O 端口概述 I/O 端口结构 I/O 端口寄存器 特殊功能 I/O 端口应用...78 第 4 章 中断系统 SPMC65 系列单片机中断系统 中断控制寄存器 中断应用...92 第 5 章 定时 / 计数器原理及应用 SPMC65 系列单片机的定时 / 计数器 Timer 控制寄存器 定时 / 计数器 捕获器 (Capture) 比较模式 (Compare) PWM 模式 第 6 章 串行接口原理及应用 SPMC65 系列单片机的串行接口 SPI 接口 UART 接口 IIC 接口 第 7 章 模拟外设...155

5 7.1 模数转换器 DAC 原理及应用 电压比较器原理及应用 第 8 章 其它硬件功能模块原理及应用 复位 时钟源 低功耗工作模式 看门狗定时器 时基与蜂鸣器输出 第 9 章 SPMC65 系列单片机开发工具 概述 集成开发环境 FortisIDE Fortis IDE 用户编程界面 FortisIDE 的使用 SPMC65 系列单片机硬件开发工具 Q-Writer 的使用 第 10 章 SPMC65 系列单片机的应用实例 ADC 一线键盘输入应用 SPI 串行接口读写 EEPROM 红外遥控接收应用例 利用 PWM 实现音乐播放 SPMC65P2404A 在智能电饭煲中的应用 SPMC65P2408A 在定频空调中应用 附录一 SPMC65 指令速查表 附录二 SPMC65 系列单片机管脚分配表 附录三 SPMC65 系列单片机端口速查表 附录四 SPMC65 系列单片机硬件资源列表 附录五 SPMC65 系列单片机封装信息...263

6

7 第 1 章凌阳通用单片机简介 第 1 章凌阳 SPMC65 系列单片机 1.1 凌阳通用单片机简介 凌阳科技 (Sunplus Technology Co., Ltd.) 是全球知名的芯片设计公司, 致力于开发高品质的集成电路芯片 凌阳科技的愿景是 科技落实生活, 以强大的 IC 设计与系统应用能力为客户提供满意的产品与服务 凌阳科技运用多媒体影音 单片微处理器 数字信号处理器 (DSP) 等核心技术, 发展出多样化的产品线, 包括液晶 IC 微控器 IC 多媒体 IC 语音 音乐 IC 及各式 ASIC, 并逐年扩增中 凌阳科技在单片微处理器的核心技术上, 发展了从 8 位系列微控制器到 µ nsp 系列 16 位微控制器 32 位微控制器的核心技术 ; 同时, 形成完整的 IC 产品线, 应用在电子词典 计算机外围 智能家电控制器 数码相机 VCD DVD 播放器 来电显示器等产品领域, 在日常生活中无所不在 凌阳科技的 16 位单片机的 CPU 内核采用凌阳自主知识产权的 µ nsp(microcontroller and Signal Processor)16 位微处理器 ( 以下简称 µ nsp) 而围绕 µ nsp 所形成的 16 位 µ nsp 系列单片机采用的是模块化集成结构, 以 µ nsp 内核为中心, 集成不同规模的 ROM RAM 和功能丰富的各种外设接口部件, 将单片机应用引领到 SOC(System on Chip) 领域 凌阳科技的 µ nsp 系列 16 位单片机主要产品有 : 带语音功能的 SPCE 通用单片机系列, 工业控制级控制型的 SPMC 通用单片机系列, 应用于视频游戏类产品的 SPG 系列单片机, 带有 LCD 显示驱动的 SPL16 系列单片机 专用于通讯产品的 SPT 系列单片机, 应用于高档电子乐器 和弦发声的 SPF 系列单片机等等 凌阳科技新近又推出了以 µ nsp 为内核的 SPMC75F 系列单片机, 用于变频马达驱动控制, 广泛应用于变频家电 工业变频器 工业控制等领域 详细的资料可以登陆凌阳单片机网站 查阅 凌阳科技的 8 位系列单片机产品拥有完整的产品线, 以其高性价比 全面的技术支持服务 方便的工具支持为广大客户所接受, 出货量排在全球半导体企业的前几位 ; 凌阳科技 8 位单片机产品主要的类别有 : 带 LCD 驱动的 SOC 芯片 多媒体应用芯片 语音芯片 通用单片机等 凌阳科技最新推出的 SPMC65 系列单片机属于 8 位的通用单片机系列, 是针对家电产品以及工业控制领域的高抗干扰性 高性价比的工业级芯片 SPMC65 系列单片机提供了从低档到高档一系列产品, 以满足客户的不同需求, 包括不带 ADC 的 I/O 控制型单片机 带 ADC 的 I/O 控制型单片机等 本书将重点介绍 SPMC65 系列单片机 ( 带 ADC/ 不带 ADC 的 I/O 控制型单片机系列 ) 的全部资源以及开发使用的方法 ; 而系列单片机中, 具体型号的芯片会针对不同应用将片内资源进行一定的删减, 保留的资源以及端口等都与本书介绍的一样 读者可通过对本书的学习, 掌握 SPMC65 全系列单片机的原理及开发使用方法 ; 但涉及具体型号芯片的设计时, 建议结合具体型号芯片的数据手册 (Data Sheet) 进行设计 1.2 SPMC65 系列单片机简介 SPMC65 系列单片机是由凌阳科技设计开发的 8 位通用单片机系列产品 ; 该系列单片机具有优越的抗干扰能力 丰富易用的资源以及优良的结构, 是非常适合于家用电器 工业控制 仪器仪表等方面应用的工业级微控制器 SPMC65 系列单片机采用 8 位的 SPMC65 CPU 1 内核, 并围绕这个通用的 CPU 内核, 集成了不同的片内资源形成了从低档到高档一系列产品 在系列芯片中相同的片内硬件功能模块具有相同的资源特点 ; 不同型号的芯片只是对片内资源进行删减 表 1.1 中列出了 SPMC65 系列单片机部分芯片的硬件资源 Tel: mcu@sunplus.com.cn 1

8 凌阳 8 位通用单片机 表 1.1 SPMC65 系列单片机硬件资源列表 芯片名称 功能 SPMC65P2104A SPMC65P2204A SPMC65P2404A SPMC65P2408A 内部存储器 OTP (ROM) Data (RAM) 4k 字节 4k 字节 4k 字节 8k 字节 128 字节 192 字节 192 字节 256 字节 最大工作频率 8MHZ 8MHZ 8MHZ 8MHZ 指令集 182 条指令 支持位操作 ( 置 1, 清零, 取反, 测试 ) I/O 端口 13 15/11 15/23 23/27 A/D 转换器 4 通道 /10 位 9 通道 /10 位 8 通道 /10 位 8 通道 / 10 位 SPI 无 无 1 个 1 个 UART 无 无 无 1 个 定时 / 计数器 1 个 16 位定时 / 计数器 1 个 8 位定时 / 计数器 1 个 16 位定时 / 计数器 2 个 8 位定时 / 计数器 2 个 16 位定时 / 计数器 2 个 8 位定时 / 计数器 2 个 16 位定时 / 计数器 时基 1 个 1 个 1 个 1 个 看门狗定时器 1 个 1 个 1 个 1 个 蜂鸣器输出 1 个 1kHz~2MHz 1 个 1kHz~2MHz 1 个 1kHz~2MHz 1 个 1kHz~2MHz 工作电压 3~5.5V 3~5.5V 3~5.5V 3~5.5V 管脚 / 封装 18 PIN PDIP/SOP 20/16 PIN PDIP/SOP 20/28 PIN PDIP/SOP 28/32 PIN PDIP/SOP 注 1:SPMC65 CPU 内核是凌阳公司在 6502 的基础上改进后的 CPU 内核, 支持 6502 的全部指令, 而在本书中将统称为 SPMC65 CPU 内核或 SPMC65 核, 其指令系统称为 SPMC65 指令系统 SPMC65 系列单片机根据片内资源的情况, 目前划分了两大类芯片 :1 不带 ADC 的通用单片机系列 ; 2 带 ADC 的通用单片机系列 上表中列出的 SPMC65P2408A 单片机为资源较全的一颗芯片, 下面就以 SPMC65P2408A 来说明凌阳 SPMC65 系列单片机的命名方法, 同时也可以了解 SPMC65 系列单片机的一些情况 : SPMC65P2408A 的前六个字符 SPMC65 为凌阳 8 位 SPMC65 系列通用单片机的标志字头, 代表凌阳公司设计 开发的 8 位的通用型单片机系列 ; SPMC65P2408A 的第七个字符 P 是指该芯片为一次性编程 (OTP,One Time Program) 型芯片, 该位表示芯片的程序存储器类型, 如果该位字符为 F, 则表示为闪速存储器 (Flash) 型芯片, 2 mcu@sunplus.com.cn Tel:

9 第 1 章凌阳通用单片机简介 如果为 C 则代表掩膜 (MASK) 型芯片 ; SPMC65P2408A 的第八位 2 表示为 SPMC65 系列单片机中的 2 系列芯片, 即带 ADC 的通用单片机系列, 如果为 1 则表示为 1 系列芯片, 即不带 ADC 的通用单片机系列 ; SPMC65P2408A 的后两位数字表示该芯片的程序存储器大小 SPMC65P2408A 最后的一个字母代表该芯片的版本号, 如 A 则代表 A 版的芯片 SPMC65 全系列单片机中, 硬件结构 寄存器的映射等都是相同的, 不同的只是资源的删减情况 ; 所以在本书的介绍中, 将从最全的 SPMC65 单片机的资源去作介绍, 具体型号的芯片请参考相应型号的的数据手册 (DataSheet), 读者可在凌阳单片机网站 : 上下载到 SPMC65 系列单片机中各型号芯片的数据手册 1.3 SPMC65 系列单片机特点 SPMC65 系列单片机为针对家用电器 工业控制应用设计的工业级芯片 ; 并为其应用领域作了具有针对性的增强设计 ; 如 : 加强 I/O 端口以提高 I/O 端口的驱动能力 抗干扰能力 ; 采用增强的复位系统, 提高系统的可靠性 ; 提供可靠而且完整 CCP 功能的定时器 / 计数器等 SPMC65 系列单片机目前提供最大 928 字节的 RAM 和 16K 字节的 ROM; 同时还集成了一个时基 一个看门狗定时器 最多 6 个 16 位定时器 / 计数器 最多 9 个通道的 ADC 等资源 下面介绍全部的 SPMC65 系列单片机资源特性 : 存储空间 - 最大 16K 字节的程序空间 (ROM) - 最大 928 字节的数据空间 (RAM) SPMC65 CPU - 支持 182 条指令 - CPU 最高频率 8MHz - 支持位操作指令 I/O 端口 - 最多 6 组 8 位通用 I/O 端口 - 可设置为上拉 / 下拉 / 悬浮输入口, 或者输出口 - 具有复用功能的双向 I/O 端口 中断 - 最多 6 通道外部中断 :NMI 非屏蔽中断或 IRQ 可屏蔽中断 - 内部中断 复位 - 增强的复位系统 时钟管理 (Clock) - 3 种时钟源 :RC 振荡器 晶体和外部时钟输入 - 具备时钟频率输出能力 省电模式 Tel: mcu@sunplus.com.cn 3

10 凌阳 8 位通用单片机 - 2 种省电模式 : STOP HALT 模拟外设 - 9 通道带一个内部参考电压的 10 位的 ADC, 或 8 通道带内 / 外部参考电压的 10 位 ADC - 4.0V 或 2.5V 可选的低电压复位系统 - 1 通道 10 位的 DAC, 最大输出电流为 3.3mA - 2 个模拟电压比较器 3 个 16 位定时 / 计数器 ( 类型 I,Timer0 2 4) - 8 位 /16 位定时 计数功能 - 捕获功能 ( 8 位脉宽 / 周期测量,16 位脉宽测量 ) - 8 位 /16 位比较输出 - 8 位 PWM 输出 2 个 16 位定时 / 计数器 ( 类型 II,Timer1 3) - 8 位 /16 位定时 / 计数器, 事件计数模式 - 捕获功能 ( 8 位脉宽 / 周期测量,16 位脉宽测量 ) - 8 位 /16 位比较输出 - 12 位 PWM 输出 1 个 16 位定时 / 计数器 ( 类型 III,Timer5) - 8 位 /16 位定时 / 计数器, 事件计数模式 - 捕获功能 ( 8 位脉宽 / 周期测量,16 位脉宽 / 周期测量 ) - 8 位 /16 位比较输出 - 16 位 PWM 输出 时基 - 频率选择 :1Hz ~ 蜂鸣器输出 - 频率 :1kHz to 可编程看门狗定时器 串行总线接口 - SPI 总线 - UART 总线 - IIC 总线应用领域 : 小家电 - 微波炉 冰箱 洗衣机 空调 电饭煲 电磁炉 充电器等 ; 带有 I/O 控制和 A/D 转换功能的工控场合 为了方便用户的开发, 凌阳公司还开发了一款仿真芯片 ECMC653, 专门用于 SPMC65 系列单片机的仿真 ECMC653 片内集成了 SPMC65 系列单片机全部的资源, 具有 928 字节的 RAM 和 16k 字节的 SRAM 4 mcu@sunplus.com.cn Tel:

11 第 1 章凌阳通用单片机简介 同时还集成了 1 个时基 1 个看门狗定时 / 计数器 6 个 16 位定时 / 计数器和 9 通道的 ADC 等 为了帮助用户缩短开发周期, 便于发现程序中隐藏的错误, 芯片内部集成了专用的 1k 字节的 PC Trace 用于记录程序的运行路径, 用户可以从中了解到程序是否正确执行 用户可以通过 ECMC653 仿真 学习 SPMC65 系列全部的芯片, 而且其硬件资源的应用与 SPMC65 系列单片机是完全一样的, 需要仿真不同的芯片时, 只需要在集成开发环境 FortisIDE 上作选择即可 ( 具体请参考第十章中对 FortisIDE 以及在线仿真编程器的介绍 ) 1.4 SPMC65 系列单片机 CPU 内核 SPMC65 系列单片机结构 SPMC65 系列单片机为冯 诺伊曼结构 ; 其片内的程序空间 (ROM) 和数据空间 (RAM) 是统一编址的 其结构分为内核 硬件外设和特殊功能三部分 其中内核是芯片的基本部分, 如 CPU CPU 寄存器等 ; 硬件外设为每款芯片区别于同系列其它芯片的硬件资源配置部分, 如定时 / 计数器 捕获器等 ; 特殊功能可以使系统提高可靠性 降低功耗, 如低电压复位 省电模式等 SPMC65 系列单片机结构如图 1.1 所示 XI XO OSC circuit Power saving controller SPMC65 CPU 928 bytes RAM $0060h~03FFh DATA BUS ADDRESS BUS 16K bytes program memory(rom) $C000h~$FFFFh (INT1,INT0)PB[5:4] (INT3,INT2)PD[1:0] (INT5,INT4)PD[5:4] Interrupt Management PORT D[1:0] Interval Timer Buzzer output PORT B6 8/16 bit Timer-0 CCP PORT B0, B2 PB6(BUZ) PB0(TC0) PB2(COMP0/PWM0) RESET VDD VSS RESET Management Low Voltage Reset Internal RC-OSC & Watch-Dog Timer 8/16 bit Timer-1 CCP PORT B1, B3 8/16 bit Timer-2 CCP PORT B4, D3 8/16 bit Timer-3 CCP PORT B5, D2 PB1(TC1) PB3(COMP1/PWM1) PB4(TC2) PD3(COMP2/PWM2) PB5(TC3) PD2(COMP3/PWM3) (AN8,Avref)PB7 (AN[7:0])PA[7:0] 9-channel 10 -bit ADC PORT A[7:0], B7 8/16 bit Timer-4 CCP PORT D4, D6 PD4(TC4) PD6(COMP4/PWM4) (COMPREF[1:0])PE4,2 (COMPIN[1:0])PE5,3 Comparator Port E[5:2] 8/16 bit Timer-5 CCP PORT D5, D7 SPI interface PORT C[3:0] PD5(TC5) PD7(COMP5/PWM5) PC[3:0](SDO,SDI,SCK,SSB) (DA)PE6 10 -bit DAC Port E6 UART interface PORT C[5:4] I2C interface PORT C[6:7] PC[5:4](RXD,TXD) PC[7:6](SDA,SCL) PE7,1,0 Port E7,1,0 Port F[7:0] PF[7:0] 图 1.1 SPMC65 系列单片机内部结构框图 Tel: mcu@sunplus.com.cn 5

12 凌阳 8 位通用单片机 SPMC65 系列单片机管脚分配 SPMC65 系列单片机提供了多种规格不同管脚数量的系列芯片, 而且提供了 PDIP SOP 形式的封装片 ; 在系列芯片中所有的管脚功能分配 复用对映都是相同的, 只是针对具体型号芯片有所删减 具体各个管脚的定义请参考书后的附录 SPMC65 系列单片机 CPU SPMC65 系列单片机采用高性能微处理器 SPMC65 作为内核, 全静态 CMOS 工艺设计, 它有 6 个内部寄存器 : 累加器 (A) 程序指针(PC) X 寄存器 Y 寄存器 堆栈指针寄存器 (SP) 和状态寄存器 (P) 支持 182 条指令 系统最高运行时钟 (F SYS ) 可以达到 8MHz CPU 内部结构见图 1.2 寄存器部分 控制器部分 RESET IRQ NMI 中断控制 A0 A1 A2 A3 A4 ABL X 寄存器 Y 寄存器 RDY PD A5 A6 堆栈指针寄存器 SP A7 指令译码器 ALU 地址总线 累加器 A PCL 时钟控制 A8 A9 A10 A11 A12 A13 A14 A15 ABH 图例 SPMC65 CPU 寄存器 = 8BIT 线宽 = 1 BIT 线宽 PCH INPUT DATA LATCH IDLI 数据总线缓冲器 图 1.2 CPU 结构框图 程序状态寄存器 P 指令寄存器 时钟发生器 D0 D1 D2 D3 D4 D5 D6 D7 CLK 0 IN 数据总线 R/W SPMC65 CPU 有 6 个寄存器 : 程序指针 (PC) 累加器(A) X 寄存器 Y 寄存器, 堆栈指针寄存器 (SP) 状态寄存器 (P) 其中程序指针寄存器为 16 位寄存器, 其它都是 8 位寄存器, 详细描述见表 mcu@sunplus.com.cn Tel:

13 第 1 章凌阳通用单片机简介 表 1.2 系统寄存器描述表 寄存器 位数 描述 累加器 (A) 8 位 累加器是唯一的可以用于算术或逻辑操作的寄存器, 如加 减 与 或 异或运算, 并且可以存储计算结果 X 寄存器 8 位 X 寄存器可以用作数据存储 偏移量或者计数器 Y 寄存器 8 位 Y 寄存器可以用作数据存储 偏移量或者计数器 程序指针 (PC) 16 位 程序计数器 (PC) 是一个 16 位寄存器, 它指向 CPU 即将执行的下一条指令的地址 当 CPU 执行完一条指令, 指向下一条指令的地址, 如果发生指令跳转, 则 PC 指向跳转地址 堆栈指针寄存器 (SP) 8 位 堆栈指针 (SP) 是一个 8 位寄存器, 用于存放堆栈的栈顶地址 状态寄存器 (P) 8 位 状态寄存器可以提供 CPU 执行完上一条指令后的状态信息 累加器 : 累加器是一个 8 位通用寄存器, 可用于数据传送 数据暂存和条件判断等操作 X Y 寄存器 : 在寻址模式下,X Y 寄存器用作地址指针, 可以很方便的进行数据的存取 同时,X Y 寄存器还可以进行加 1 减 1 比较和数据传送的操作 堆栈指针寄存器 (SP): 一个可自动加 1 或减 1 的 8 位寄存器, 专门用来存放堆栈的栈顶地址 当调用子程序或中断发生时, 堆栈指针会自动更新 但是如果堆栈指针的值超出了其允许的堆栈空间, 系统就会发生非法地址复位 而在 CPU 内部, 会自动对堆栈指针寄存器的值进行位扩展, 即第 9 位始终 自动扩展为 1, 如下图所示 : 硬件扩展 SP 堆栈空间范围 (1E0~1FF) 图 1.3 CPU 内部对堆栈指针寄存器扩展程序计数器 (PC):16 位寄存器, 存放 CPU 即将执行的下一条指令的 16 位地址 该 16 位地址的高 8 位和低 8 位分别存放在寄存器 PCH 和 PCL 中 复位后,PC 载入复位向量 $FFFC $FFFD 中的程序运行起始地址 状态寄存器 (P):8 位寄存器, 包括一个中断屏蔽位和 5 个独立的状态标志位, 这 5 个状态标志位可以反映程序执行完上一条指令后的状态信息 详细说明如下 Tel: mcu@sunplus.com.cn 7

14 凌阳 8 位通用单片机 N V D I Z C 进位标志有进位,C=1 零标志算术或逻辑运算结果为 0,Z=1; 否则 Z=0 中断屏蔽标志 I=1,CPU 忽略中断请求信号 ( 非屏蔽中断源 NMI 除外 );I=0,CPU 接受中断请求信号 十进制模式标志 D=1,CPU 当前运算模式为十进制, 否则 D=0,CPU 当前运算模式为二进制 溢出标志算术运算过程发生溢出 V=1, 否则 V=0 负标志算术运算或逻辑运算结果为负,N=1; 否则 N=0 注 : 并不是所有的指令执行都会影响状态寄存器的值 在后面的的指令系统的章节中将对每个指令作详细描述 负标志位 (N): 该位指示一个数据或者运算结果的 bit7 的状态 用户可以通过该位进行条件跳转 溢出标志位 (V): 该位仅用于有符号数的算术运算 如果两个同符号数相加或两个不同符号数相减, 结果大于 127 或者小于 -128, 该位置 1 十进制模式标志位 (D): 在 SPMC65 系列单片机中有两种算术运算模式 : 二进制模式和十进制模式, 该位标明了当前的运算模式 用户可以通过相应的控制指令来选择一种运算模式 中断屏蔽位 (I): 该位用于使能 / 禁止除 非屏蔽中断源 (NMI) 以外的所有中断源 将该位置 1, CPU 将忽略中断请求, 置 0,CPU 将可以接受中断请求 零标志位 (Z): 算术或逻辑运算结果标志位 当算术或逻辑运算结果为 0 时, 该位被置 1; 为其它值时, 该位被置 0 进位标志 (C): 当加法操作中产生进位或减法操作中没有产生借位时, 该位被置 1 此外, 移位或循环指令也会改变该位的值 SPMC65 系列单片机的寻址方式 SPMC65 系列单片机支持 11 种寻址方式 ( 详见第三章指令系统中的介绍 ): 立即数寻址 (Immediate addressing mode) 绝对寻址 (Absolute addressing mode) 零页寻址 (Zero page addressing mode) 绝对变址寻址 (Absolute indexed addressing mode) 零页变址寻址 (Zero page indexed addressing mode) 间接跳转寻址 (Indirect addressing mode) 变址间接寻址 (Indexed indirect addressing mode) 间接变址寻址 (Indirect indexed addressing mode) 隐含寻址 (Implied addressing mode) 累加器寻址 (Accumulator addressing mode) 8 mcu@sunplus.com.cn Tel:

15 相对寻址 (Relative addressing mode) 第 1 章凌阳通用单片机简介 1.5 SPMC65 系列单片机的存储器 SPMC65 系列单片机有独立的程序存储区和数据存储区 程序存储区为只读的, 最大为 16K 字节 数据存储区可读可写, 包含了各种控制寄存器和用户 RAM 其中用户 RAM 最大为 928 字节 ( 包括堆栈区 ) SPMC65 系列单片机集成的硬件外设通过地址映射到存储区的 $0000~$005F 范围内 CPU 访问硬件外设即在内存中寻访到相应的外设控制寄存器 注意不要访问有 保留 字样的内存区, 否则可能导致非法地址复位 SPMC65 系列单片机的存储器分配见图 1.4 所示 $0000 $005F $ Bytes 硬件控制寄存器 928 Bytes $03FF $0400 RAM 保留 $7FDF $7FE0 $7FE3 $7FE4 $7FEF $7FF0 $7FFF $8000 $BFFF $C000 $FFF9 $FFFA $FFFF 4 Bytes 芯片配置选项保留 16 Bytes 用户信息 保留 16K Bytes 程序存储器 (ROM) 6 Bytes 向量空间 $FFFA $FFFC $FFFE $FFFF 向量空间 NMI Vector Reset Vector IRQ Vector 图 1.4 SPMC65 系列单片机存储器分配 SPMC65 系列单片机各部分的存储地址分配都是一样的, 具体型号芯片会针对其应用对存储器有所删减, 请参考具体型号芯片的数据手册 程序存储器 SPMC65 系列单片机的程序存储区 (ROM) 最大为 16K 字节, 所以使用一个 16 位的程序计数器 ( 最大寻址 64K 字节 ) 就可以访问全部的 ROM 空间 程序存储区由一次性可编程型只读存储器 OTP ROM 组成 ( 针对于 SPMC65PXXXX 单片机 ), 烧写时可以设置 保密功能 对程序进行保护 当设置 保密功能 时, 用户无法读取这 16K 的 OTP ROM 中的内容, 这时芯片配置选项和用户信息, 以及地址 $FFF0~$FFFF 中的存储器数据是可读的 相反, 不设置 保密功能 时, 程序可以从芯片中读出 Tel: mcu@sunplus.com.cn 9

16 凌阳 8 位通用单片机 复位后,CPU 从地址 $FFFC 和 $FFFD 中读出复位后程序的入口地址, 然后跳转到该程序的入口去执行 中断发生时,CPU 通过中断向量跳转到相应的中断服务子程序中继续执行 存储器的 $FFFA~$FFFB 作为非屏蔽中断 NMI 的向量地址,$FFFE~$FFFF 作为可屏蔽中断 IRQ 的向量地址 这些中断向量的地址应在用户程序中做出正确的定义 数据存储器数据存储区分为两大部分 : 硬件控制寄存器 用户 RAM 区 ( 包含堆栈空间 ) $0000~$005F 空间作为硬件控制寄存器,$0060~$03FF 作为用户使用的 RAM 空间 其中 $0000~$00FF 的空间为第零页存储空间 (PAGE0) 硬件控制寄存器 : CPU 通过设置硬件控制寄存器来控制其硬件外设的工作 硬件控制寄存器位于存储器的 $0000 ~$005F 空间内, 共有 96 字节 它的作用是对中断系统 定时 / 计数器 AD 转换器和 IO 端口等进行设置和状态标识 详细介绍请见各章节 在 SPMC65 系列单片机中, 位于内存 $0030~$0036 之间的寄存器是与系统运行相关的寄存器, 需要慎重配置 因此访问 $0030~$0036 之间的寄存器时, 必须进行连续两次的写操作才能设置成功, 目的是为了保证写入控制寄存器的内容一定正确并能防止数据或地址总线上的噪声干扰 用户 RAM 区 : 用户 RAM 区位于 $0060 ~ $03FF 的地址空间内, 可读可写 用户 RAM 区包括了堆栈空间 堆栈空间 : 堆栈区域为 $01E0~$01FF 共 32 字节, 初始状态堆栈指针 (SP) 指向 $01FF( 系统会自动为其扩展高位 ), 每压入一个字节的数据, 指针减一, 一旦超出 $01E0,CPU 则发生非法地址复位 (IAR) 当中断发生时, 中断返回地址和状态寄存器的值被压入堆栈 中断服务子程序执行完毕, 执行指令 RTI 后, 中断返回地址和状态寄存器的值被弹出堆栈, 程序返回 同样, 当调用子程序时, 子程序的返回地址也会被压入堆栈 子程序执行完毕, 执行指令 RTS 后, 子程序的返回地址被弹出堆栈, 程序返回 Push AB Push CD Push EF SP-->$1FC SP-->$1FD EF SP-->$1FE CD CD AB AB AB 堆栈操作 : Push POP EF POP CD POP AB SP-->$1FD CD SP-->$1FE AB AB SP-->$1FF 堆栈操作 : Pop 图 1.5 堆栈操作示意图 堆栈指针 (SP) 用于指示当前的堆栈状况, 每当压入一个数据, 指针会自动减 1, 弹出数据时, 指针 10 mcu@sunplus.com.cn Tel:

17 第 1 章凌阳通用单片机简介 先自动加 1, 然后再弹出一个数据, 所以堆栈指针 (SP) 总是指向堆栈的顶端 详细操作见图 芯片配置选项及用户信息芯片配置选项 : $7FE0 ~ $7FE3 为芯片配置选项寄存器, 用户可以设置一些特殊功能, 以满足不同应用的需要, 如低电压复位 看门狗复位使能 非屏蔽中断源和时钟源的选择等 在进行芯片烧写的时候, 这些设置会通过烧写器写入芯片, 而用户程序是无法对这些寄存器进行写操作的 如果使用凌阳公司的集成开发环境 Fortis IDE, 可以在 FortisIDE 中设置这些寄存器 ; 具体操作请参考第十章中关于设置工程的介绍 用户信息 : SPMC65 系列单片机预留了 $7FF0~ $7FFF 的空间作为用户信息块, 可以由用户写入序列号或版本控制信息等, 详细设置方法见后在介绍软硬件开发工具的章节 1.6 SPMC65P2408A 单片机 SPMC65P2408A 是 SPMC65 系列单片机中资源较多的一款芯片, 下面将简单介绍一下 SPMC65P2408A 的特点及资源情况,SPMC65P2408A 资源情况见表 1.3; 更详细的资料请参考 SPMC65P2408A 的数据手册 表 1.3 SPMC65P2408 资源简介 型号 ROM RAM ( 字节 )( 字节 ) I/O 10 bit A/D CCP 模块 Compare Capture PWM SPI UART 封装信息 SPMC65P2408A 8K /23 8 ch Y Y 32/28PIN PDIP/SOP 资源特性 : 存储空间 - 8K 字节程序空间 (OTP ROM) 字节数据空间 (RAM) I/O 端口 - 最多 27(32PIN 封装 ) 个通用 I/O 端口 - 可设置为上拉 / 下拉 / 悬浮输入口, 或者输出口 - 所有端口具备直接驱动 LED 的能力 - 2 个 I/O 端口具备 20mA 的驱动能力 中断 -4 通道外部中断 ( 其中 1 通道可设为 NMI 非屏蔽中断 ) -13 个内部事件中断 复位 - 增强的复位系统 - 上电复位 (POR) 低电压复位(LVR) 看门狗复位(WDR) 外部复位(ERST) 错误地址复位 (IAR) Tel: mcu@sunplus.com.cn 11

18 凌阳 8 位通用单片机 时钟管理 - 3 种时钟源 :RC 振荡器 晶体和外部时钟输入 - 具备时钟频率输出能力 省电模式 - 2 种省电模式 : STOP HALT 模拟外设 - 8 通道带内 / 外部参考电压的 10 位 ADC - 4.0V 或 2.5V 可选的低电压复位系统 2 个 8 位定时 / 计数器 - 定时 计数功能 - 捕获功能 ( 8 位脉宽测量 ) - 8 位比较输出 2 个 16 位定时 / 计数器 - 定时 / 计数器, 事件计数模式 - 捕获功能 ( 8 位脉宽 / 周期测量,16 位脉宽测量 ) - 8 位 /16 位比较输出 - 12 位 PWM 输出 时基 - 频率选择 :1Hz ~ 蜂鸣器输出 - 频率选择 :1kHz to 可编程看门狗定时器 - 频率选择 :1.5Hz to 串行总线接口 - SPI 总线 : 最高 - UART 总线 : 最高波特率 :38400 bps@8mhz 封装形式 : SPMC65P2408A 有两种管脚形式的封装片 :32 管脚和 28 管脚的芯片 每种形式都提供了 PDIP 和 SOP 形式的封装 ; 具体可参考图 1.6 SPMC65P2408A 的最小系统图如图 1.7 所示 12 mcu@sunplus.com.cn Tel:

19 Tel: 第 1 章凌阳通用单片机简介 13 SPMC65P2408A (AN4)PA4 (AN3)PA3 (AN0)PA0 (AN2)PA2 (AN1)PA1 (AN5)PA5 (TC0)PB0 (COMP0) PB2 (PWM1/COMP1)PB3 (INT0/TC2)PB4 (INT1/TC3)PB5 (BUZ) PB6 (AVref)PB7 (AN6)PA6 (AN7)PA7 PC3(SDO) XO VDD VSS XI/RC/ECLK RESET PD0(INT2) PD1(INT3) PD2(PWM3/COMP3) PC0(SRDB) PC1(SCK) PC2(SDI) PC4(TXD) PC5(RXD) PD3(COMP2) PD4 (TC1)PB1 SPMC65P2408A (AN4)PA4 (AN3)PA3 (AN0)PA0 (AN2)PA2 (AN1)PA1 (AN6)PA6 XO (AN5)PA5 (AN7)PA7 VDD VSS XI/RC/ECLK RESET (COMP0)PB2 (AVref)PB7 PC1(SCK) PC2(SDI) PC0(SRDB) PD0(INT2) PD1(INT3) PD2(PWM3/COMP3) PB0(TC0) PB1(TC1) PC3(SDO) (PWM1/COMP1)PB3 (INT0/TC2)PB4 ( INT1/TC3)PB5 (BUZ)PB6 32PIN PDIP/SOP 28PIN PDIP/SOP 图 1.6 SPMC65P2408A 管脚排列示意图 VDD C3 20P VDD C2 20P + C4 10u U1 SPMC65P2408A_32P (AN7)PA7 (AN6)PA6 (AN5)PA5 (AN4)PA4 (AN3)PA3 (AN2)PA2 (AN1)PA1 (AN0)PA0 (AVref)PB7 (BUZ)PB6 (INT1/TC3)PB5 (INT0/TC2)PB4 (PWM1/COMP1)PB3 (COMP0)PB2 (TC1)PB1 (TC0)PB0 PC5(RXD) PC4(TXD) PC3(SDO) PC2(SDI) PC1(SCK) PC0(SRDS) PD4 PD3(COMP2) PD2(PWM3/COMP3) PD1(INT3) PD0(INT2) RESET(Vpp) XO XI(ECLK,XR) VSS VDD C1 104 R1 4.7K 16M C5 104 图 1.7 SPMC65P2408A 最小系统

20 凌阳 8 位通用单片机 第 2 章 SPMC65 系列单片机指令系统 2.1 符号约定 SPMC65 系列单片机指令按其功能可划分为 : 数据传送指令, 包括立即数到寄存器 寄存器到寄存器 寄存器到存储器 存储器到寄存器的数据传送操作 ; 算术运算, 包括加 减 比较运算 ; 逻辑运算, 包括与 或 异或 移位等操作 ; 位操作, 包括位测试 位置位 位清除 位取反等操作 ; 转移指令, 包括条件转移 无条件转移 中断返回 子程序调用等操作 ; 控制指令, 如开中断 关中断 清除进位 清除负标志等操作 ; 为了将指令的用法讲解清楚, 下表将指令系统叙述过程中要用到的符号列出 表 2.1 指令系统叙述过程中要用到的符号 A X Y PC SP P N V D I Z C #dd Label 累加器 (A) X 寄存器 Y 寄存器程序指针 (PC) 堆栈指针 (SP) 状态寄存器 (P) 负标志位 (N): 该位指示一个数据或者运算结果的 bit7 的状态 用户可以通过该位进行条件跳转 溢出标志位 (V): 该位仅用于有符号数的算术运算 如果两个同符号数相加或两个不同符号数相减, 结果大于 127 或者小于 -128, 该位置 1 十进制模式标志位 (D): 在 SPMC65 系列芯片中有两种算术运算模式 : 二进制模式和十进制模式, 该位标明了当前的运算模式 用户可以通过相应的指令来选择一种运算模式 中断屏蔽位 (I): 该位用于使能 / 禁止除 非屏蔽中断源 (NMI) 以外的所有中断源 将该位置 1,CPU 将忽略中断请求, 置 0,CPU 将接受中断请求 零标志位 (Z): 数据和算术运算结果标志位 当数据或算术运算结果为 0 时, 该位被置 1; 为其它值时, 该位被置 0 进位标志 (C): 当加法操作中产生进位或减法操作中没有产生借位时, 该位被置 1 此外, 移位或循环指令也会改变该位的值 8 位 (BIT) 的立即数程序标号 14 mcu@sunplus.com.cn Tel:

21 第 2 章 SPMC65 系列单片机指令系统 ; 程序注释前缀 Adr 08 Adr16 aa aaaa Cycles 8 位存储器地址 16 位存储器地址 8 位存储器地址 16 位存储器地址指令周期数,1 个 Cycle 的时间为 1 个 CPU 时钟周期, 即 1/F SYS SPMC65 系列单片机的汇编指令格式规定汇编指令包括四部分, 格式如下 : [ 标号 : ] 操作码 [ 操作数 ] [ ; 注释 ] [ ] 中的内容为可选项 标号 : 标识了一条指令的位置, 可以使用标号作为访问该指令的地址 标号应以字母或下划线 _ 开头 ( 局部标号还可以用问号? 开头 ), 以冒号 : 结束 ; 标号的命名可以取数字 字母和下划线的组合, 长度为 2~32 个字符, 区分大小写 不要用指令记助符 寄存器名称或系统保留字的字符串作为标号 而宏名可以字母 下划线或百分号 (%) 开头 标号的后缀可以是字母 下划线 问号或井号 # 操作码 : 指令区域, 用于写指令 操作数 : 操作数可以是程序中的数据或地址 当操作码为单字节时, 无操作数 当进行立即数寻址时, 操作数为一个字节数据, 使用一个符号来标识其所在位置 当操作数作为程序地址时, 其实就是一个标号 注释 : 注释可以提高程序的可读性 在注释语句的前面应该加一个分号 ; 例如 : LDA #5 ; 将 8 位立即数 5 载入累加器 A STA Counter ; 将累加器 A 中的数载入变量 Counter 中 数制 汇编器默认数制为十进制, 如果要表示成其它数制, 需要给数字加上后缀或前缀 下表列出了各种数 制的表达方式 应用时, 将其与数值组合即可 二进制 以 % 为前缀或以 B b 为后缀 B 八进制 以 O o 或 Q q 为后缀 253Q 十进制 以 D 或 d 为后缀或无后缀 171 十六进制 以 H h 为后缀或以 $ 0X 0x 为前缀 $AB 字符串定义字符串必须放在双引号 ( ) 或单引号 ( ) 内表示, 除非语法上另有所指 Tel: mcu@sunplus.com.cn 15

22 凌阳 8 位通用单片机 2.2 寻址方式 在计算机中, 寻找操作数的方法定义为指令的寻址方式, 根据这个原则,SPMC65 系列单片机的寻址方式分为以下 11 种 : 立即数寻址 (Immediate addressing mode) 绝对寻址 (Absolute addressing mode) 零页寻址 (Zero page addressing mode) 绝对变址寻址 (Absolute indexed addressing mode) 零页变址寻址 (Zero page indexed addressing mode) 间接跳转寻址 (Indirect addressing mode) 变址间接寻址 (Indexed indirect addressing mode) 间接变址寻址 (Indirect indexed addressing mode) 隐含寻址 (Implied addressing mode) 累加器寻址 (Accumulator addressing mode) 相对寻址 (Relative addressing mode) 立即数寻址 (Immediate Addressing Mode) 这种寻址方式的操作数以 8 位立即数的形式出现, 紧跟在操作码的后面, 立即数用 # 号表示, 以区别直接地址 汇编格式 : 操作码 #dd 例如 : AND #$08 立即数寻址过程如图 2.1 所示, 首先 xx 是由累加器 A 提供, 这是由 AND 的操作数决定的,08 就是立即数, 然后进行逻辑与操作 由于 AND 操作数是两个字节, 所以执行该操作数后 PC 向后移动两个字 就是 mmmm+2, 以下同 $xx AND $08 A X SP PC $xx mm mm 数据存储器 mmmm+2 程序存储器 $29 $08 mmmm mmmm+1 mmmm 绝对寻址 (Absolute addressing mode) 图 2.1 立即数寻址方式示意图 绝对寻址用两个字节 (Adr 16) 来指明目标操作数地址 汇编格式 : 操作码 Adr16 例子 : AND $E mcu@sunplus.com.cn Tel:

23 第 2 章 SPMC65 系列单片机指令系统 绝对寻址过程如图 2.2 所示, 操作码 ( 指令 )AND 的一个操作数从 $E030 指向的存储单元里直接取得 xx AND yy 程序存储器 A xx X yy $E030 SP PC mm mm 零页寻址 (Zero page addressing mode) 图 2.2 绝对寻址过程示意图 零页寻址采用零页 ( 地址范围 $0000~$00FF) 的低字节来指明操作数地址 ( 高位地址默认为零 ) 汇编格式 : 操作码 Adr08 例子 : AND $30 零页寻址过程如图 2.3 所示, 操作码 ( 指令 )AND 的一个操作数从零页存储单元 $30 中直接取得 xx AND yy 数据存储器 A xx X yy $30 SP PC mm mm 图 2.3 零页寻址过程示意图 绝对变址寻址 (Absolute indexed addressing mode) 绝对变址寻址使用一个双字节基址和一个变址指针 ( 寄存器 X 或 Y) 来指明目标操作数地址 汇编格式 : 操作码 Adr 16, X 或 : 操作码 Adr 16, Y 例子 : LDA $E500,X 绝对变址寻址的过程如图 2.4 所示, 由绝对地址 ( 基址 ) 与变址指针 (X 寄存器 ) 的地址相加得到的 地址里的数作为操作数 $E500 + $02 程序存储器 A $A8 X $02 $A8 $E502 SP PC mm mm mmmm+3 图 2.4 绝对变址寻址过程示意图 Tel: mcu@sunplus.com.cn 17

24 凌阳 8 位通用单片机 零页变址寻址 (Zero page indexed addressing mode) 零页变址寻址使用零页地址作为基址, 基址与变址指针 ( 寄存器 X 或 Y) 相加来指明目标操作数地址 汇编格式 : 操作码 Adr 08, X 或 : 操作码 Adr 08, Y 例子 : LDA $75,X 零页变址寻址的过程如图 2.5 所示, 由零页地址 ( 基址 ) 与变址指针 (X 寄存器 ) 的地址相加得到的 地址里的数作为操作数 $75 + $02 数据存储器 A X SP PC $A8 $02 mm mm $A8 $0077 mmmm+2 图 2.5 零页变址寻址过程示意图 间接跳转寻址 (Indirect addressing mode) 间接跳转寻址只能用于 JMP 指令中, 它用 16 位地址作为程序跳转地址的指针 汇编格式 : 操作码 (Adr 16) 例子 : JMP ($F600) 如下图所示, 间接跳转寻址将 $F600 与 $F601 两单元中的数据组成的 16 位地址 $ppqq 作为 PC 的跳转地址 ($pp $qq 为存储器中的数值 ) Data Memory A X SP PC $xx $rr $pp $qq $qq $pp $B6 $77 $F600 $F601 图 2.6 间接跳转寻址过程示意图 变址间接寻址 (Indexed indirect addressing mode) 变址间接寻址采用 8 位地址 + 变址指针 X 来指明目标操作数地址 在此寻址模式下, 只能采用 X 寄存器作为变址指针 汇编格式 : 操作码 (Adr 08, X) 例子 : AND ($30, X) 18 mcu@sunplus.com.cn Tel:

25 第 2 章 SPMC65 系列单片机指令系统 变址间接寻址如图 2.7 所示, 首先 $30 与变址指针 (X 寄存器 ) 中的值 $63 相加, 其结果 $93 作为目标操作数地址的指针, 它所指向的数值 $qq 与下一个存储单元中的数值 $pp 共同组成了 16 位的目标操作数地址 地址 $ppqq 指向的内容 $yy 就是目标操作数 2 $xx AND $yy 数据存储器 A X SP PC $xx $63 mm mm 1 + $qq $pp $yy $0093 $0094 $ppqq mmmm+2 $21 mmmm $30 mmmm+1 程序存储器 图 2.7 变址间接寻址过程示意图 间接变址寻址 (Indirect indexed addressing mode) 间接变址寻址采用 8 位地址 来指明目标操作数的基址, 再加上变址指针 (Y 寄存器 ) 作为目标操作数的地址 在此寻址模式下, 只能采用 Y 寄存器作为变址指针 汇编格式 : 操作码 (aa), Y 例子 : LDA ($20), Y 间接变址寻址如图 2.8 所示, 由地址 $20 里的数据 $32 作为基址地址的低 8 位, 下一个地址 $21 里的数据 $01 作为基址地址的高 8 位, 二者组成的 16 位基址 $0132 加上指针 (Y 寄存器 ) 中的数据 $15 形成目标操作数地址 $0147, 目标操作数地址里的数据作为操作数 $ $15 = $0147 A X Y SP PC $B6 02 $15 mm mm 数据存储器 $B6 $0147 $32 $01 $0020 $0021 图 2.8 间接变址寻址 隐含寻址 (Implied addressing mode) 隐含寻址是特殊指令对应的特殊寻址方式, 它的源操作数和目标操作数的地址都由指令默认 Tel: mcu@sunplus.com.cn 19

26 凌阳 8 位通用单片机 汇编格式 : 操作码 例子 : TAX ; 将累加器内容传送到 X 寄存器中 CLC ; 清除进位标志 累加器寻址 (Accumulator addressing mode) 累加器寻址采用累加器 A 作为指令操作数 汇编格式 : 操作码 A 例子 : ROL A ; 累加器 A 内容循环左移 ASL A ; 累加器 A 的内容算数左移 相对寻址 (Relative addressing mode) 相对寻址使用一个 8 位地址来定义目标操作数的地址, 该寻址方式仅用在条件跳转指令中, 最大的向 前跨度为 127 字节, 最大向后跨度为 128 字节 汇编格式 : 操作码 Adr 08 例子 : BCC M127 BCC P128 相对地址寻址过程如图 2.9 所示, 其中 M127 与 P128 都是标号 M127: LDA #$20... BCC M127 LDA $20 BCC 127 Bytes BCC P P128: LDA #$30 BCC P128 LDA $ Bytes 图 2.9 相对寻址过程示意图 2.3 指令系统 指令概述 指令依照其用途可分为六类 : 数据传送类指令 算术运算类指令 逻辑运算类指令 位操作指令 转移类指令 控制类指令 它们的具体分类及用途详见表 mcu@sunplus.com.cn Tel:

27 第 2 章 SPMC65 系列单片机指令系统 表 2.2 SPMC65 指令分类列表 类别用途指令 数据传送指令 立即数到寄存器 寄存器到寄存器 寄存器到存储器 存储器到寄存器的数据传送操作 LDA LDX LDY STA STX STY TAX TXA TAY TYA TXS TSX PHA PHP PLA PLP 算术运算指令加 减 比较运算 ADC SBC DEC DEX DEY INC INX INY CMP CPX CPY 逻辑运算指令与 或 异或 移位等操作 AND ORA EOR ASL LSR ROL ROR BIT 控制转移指令 位操作指令 处理器控制指令 条件转移 无条件转移 中断返回 子程序调用等操作位置位 位清除 位取反 位测试等操作开中断 关中断 清除进位 清除负标志等操作 BCS BCC BEQ BNE BMI BPL BVS BVC JMP JSR RTS RTI SET CLR INV TST CLC CLD CLI CLV SEC SED SEI NOP 数据传送指令 数据传送是把源操作数传送到目标地址的过程, 是计算机最基本 最重要的一种操作 在实际应用中, 数据传送指令使用的比例是最高的 1. LDA LDA 的作用是将数据送入累加器 A 中, 具体格式参见下表 : 表 2.3 指令 LDA 汇编指令格式 操作码 字节数 指令周期 (Cycles) LDA #dd A9H 2 2 LDA aa A5H 2 3 LDA aa, X B5H 2 4 LDA aaaa ADH 3 4 LDA aaaa, X BDH 3 4* LDA aaaa, Y B9H 3 4* LDA (aa, X) A1H 2 6 LDA (aa), Y B1H 2 6* * 如果数据寻址时超出了一页的范围, 需要再加一个指令周期, 一页的大小为 256 个字节 该指令对 P 标志位的影响见下表 : 表 2.4 LDA 指令对 P 标志位的影响 N: 将 bit7 的值赋给 N Z: 结果为 0 时置 1 N V D I Z C! - - -! - Tel: mcu@sunplus.com.cn 21

28 凌阳 8 位通用单片机 [ 例 ]: LDA #$F0 ; 把立即数 $F0 传送至累加器 A LDA $F0 ; 把位于 $F0 地址的数据复制到累加器 A 2. LDX LDX 的作用是将数据送入 X 寄存器中 具体格式参见下表 : 表 2.5 指令 LDX 汇编指令格式 操作码 字节数 指令周期 (Cycles) LDX #dd A2H 2 2 LDX aa A6H 2 3 LDX aa, Y B6H 2 4 LDX aaaa AEH 3 4 LDX aaaa, Y BEH 3 4* * 如果数据寻址时超出了一页的范围, 需要再加一个指令周期 该指令对 P 标志位的影响见下表 : 表 2.6 LDX 指令对 P 标志位的影响 N V D I Z C! - - -! - N: 将 bit7 的值赋给 N Z: 结果为 0 置 1 [ 例 ]: LDX #$F0 ; 把立即数 $F0 传送至 X 寄存器 LDX $F0 ; 把位于 $F0 地址的数据复制到 X 寄存器 3. LDY LDY 的作用是将数据送入 Y 寄存器中 具体格式参见下表 : 表 2.7 指令 LDY 汇编指令格式 操作码 字节数 指令周期 (Cycles) LDY #dd A0H 2 2 LDY aa A4H 2 3 LDY aa, X B4H 2 4 LDY aaaa ACH 3 4 LDY aaaa, X BCH 3 4* * 如果数据寻址时超出了一页的范围, 需要再加一个指令周期 该指令对 P 标志位的影响见下表 : 表 2.8 LDY 指令对 P 标志位的影响 N V D I Z C! - - -! mcu@sunplus.com.cn Tel:

29 第 2 章 SPMC65 系列单片机指令系统 N: 将 bit7 的值赋给 N Z: 结果为 0 置 1 [ 例 ]: LDY #$F0 ; 把立即数 $F0 传送至 Y 寄存器 LDY $F0 ; 把位于 $F0 地址的数据复制到 Y 寄存器 LDX #$12 ; 把立即数 $12 传送至 X 寄存器 LDY $E005,X ; 把地址为 $E017($E005+$12) 的数据复制到 Y 寄存器 4. STA STA 的作用是将累加器 A 的值送入存储器 具体格式参见下表 : 表 2.9 指令 STA 汇编指令格式操作码 字节数 指令周期 (Cycles) STA aa 85H 2 3 STA aa, X 95H 2 4 STA aaaa 8DH 3 4 STA aaaa, X 9DH 3 4 STA aaaa, Y 99H 3 4 STA (aa, X) 81H 2 6 STA (aa), Y 91H 2 6 该指令对标志寄存器 P 不产生影响 [ 例 ]: LDA #$12 ; 把立即数 $12 送至累加器 STA $78 ; 把累加器中的数据 $12 复制到地址为 $78 的存储单元 5. STX STX 的作用是将寄存器 X 的值送入存储器中 具体格式参见下表 : 表 2.10 指令 STX 汇编指令格式 操作码 字节数 指令周期 (Cycles) STX aa 86H 2 3 STX aa, Y 96H 2 4 STX aaaa 8EH 3 4 该指令对标志寄存器 P 不产生影响 [ 例 ]: LDX #$12 ; 把立即数 12 送至寄存器 X STX $78 ; 把寄存器 X 中的数据 $12 复制到地址为 $78 的存储单元 6. STY STY 的作用是将寄存器 Y 的值送入存储器中 具体格式参见下表 : Tel: mcu@sunplus.com.cn 23

30 凌阳 8 位通用单片机 表 2.11 指令 STY 汇编指令格式 操作码 字节数 指令周期 (Cycles) STY aa 84H 2 3 STY aa, X 94H 2 4 STY aaaa 8CH 3 4 该指令对标志寄存器 P 不产生影响 [ 例 ]: LDY #$12 ; 把立即数 $12 送至寄存器 Y STY $78 ; 把寄存器 Y 中的数据 $12 复制到地址为 $78 的存储单元 LDX #$10 ; 把立即数 $10 送至寄存器 X STY $63,X ; 把寄存器 Y 中的数据 $12 复制到地址为 $73($63+$10) 的存储单元 7. TAX TAX 的作用是将累加器 A 的值送入寄存器 X 中 具体格式参见下表 : 表 2.12 指令 TAX 汇编指令格式操作码 字节数 指令周期 (Cycles) TAX AAH 1 2 该指令对 P 标志位的影响见下表 : 表 2.13 TAX 指令对 P 标志位的影响 N V D I Z C! - - -! - N: 将 bit7 的值赋给 N Z: 运算结果为零置 1 [ 例 ]: LDA #$17 ; 把立即数 $17 送至累加器 A TAX ; 把累加器 A 中的数值 $17 复制到寄存器 X 中 8. TXA TXA 的作用是将 X 寄存器的值送入累加器 A 中 参见下表 : 表 2.14 指令 TXA 汇编指令格式 操作码 字节数 指令周期 (Cycles) TXA 8AH 1 2 该指令对 P 标志位的影响见下表 : 表 2.15 TXA 指令对 P 标志位的影响 N: 将 bit7 的值赋给 N Z: 运算结果为零置 1 N V D I Z C! - - -! mcu@sunplus.com.cn Tel:

31 第 2 章 SPMC65 系列单片机指令系统 [ 例 ]: LDX #$17 ; 把立即数 $17 送至寄存器 X TXA ; 把寄存器 X 中的数值 $17 复制到累加器 A 中 9. TAY TAY 的作用是将累加器 A 的值送入寄存器 Y 中 具体格式参见下表 : 表 2.16 指令 TAY 汇编指令格式 操作码 字节数 指令周期 (Cycles) TAY A8H 1 2 该指令对 P 标志位的影响见下表 : 表 2.17 TAY 指令对 P 标志位的影响 N V D I Z C! - - -! - N: 将 bit7 的值赋给 N Z: 运算结果为零置 1 [ 例 ]: LDA #$17 ; 把立即数 $17 送至累加器 A TAY ; 把累加器 A 中的数值 $17 复制到寄存器 X 中 10. TYA TYA 的作用是将 Y 寄存器的值传送到累加器 A 中 具体格式参见下表 : 表 2.18 指令 TYA 汇编指令格式 操作码 字节数 指令周期 (Cycles) TYA 98H 1 2 该指令对 P 标志位的影响见下表 : 表 2.19 TYA 指令对 P 标志位的影响 N V D I Z C! - - -! - N: 将 bit7 的值赋给 N Z: 运算结果为零置 1 [ 例 ]: LDY #$17 ; 把立即数 $17 送至寄存器 Y TYA ; 把寄存器 Y 中的数值 $17 复制到累加器 A 中 11. TXS TXS 的作用是将 X 寄存器的值传送到堆栈指针 SP 的低 8 位中 具体格式参见下表 : 表 2.20 指令 TXS 汇编指令格式 操作码 字节数 指令周期 (Cycles) TXS 9AH 1 2 Tel: mcu@sunplus.com.cn 25

32 凌阳 8 位通用单片机 TXS 指令对标志寄存器 P 不产生影响 [ 例 ]: LDX #$FC ; 把立即数 $FC 送至寄存器 X TXS ; 把 X 中的值赋给堆栈指针 SP 的低 8 位,SP 的值将变为 $FC 12. TSX TSX 的作用是将堆栈指针 SP 中的值送入 X 寄存器中 具体格式参见下表 : 表 2.21 TSX 指令对 P 标志位的影响 汇编指令格式 操作码 字节数 指令周期 (Cycles) TSX BAH 1 2 该指令对 P 标志位的影响见下表 : 表 2.22 TAY 指令对 P 标志位的影响 N: 将 bit7 的值赋给 N Z: 运算结果为零置 1 N V D I Z C! - - -! PHA PHA 的作用是将累加器 A 的值压入堆栈 该指令产生的操作是 : 首先将累加器 A 的值传送到堆栈指针 SP 所指向的存储单元, 然后使 SP 的值减小 1 具体格式参见下表: 表 2.23 指令 PHA 汇编指令格式 操作码 字节数 指令周期 (Cycles) PHA 48H 1 3 该指令对标志寄存器 P 不产生影响 [ 例 ]: LDX #$FF ; X $FF 立即数 0xFF( 即 $FF) 载入寄存器 X TXS ; SP $FF, 立即数 0xFF( 即 $FF) 载入堆栈寄存器 SP, 堆栈指针指向 $01FF LDA #$35 ; A $35 PHA ; [$1FF] $35, SP SP - 1, 此时 $35 被传送到 $01FF 单元,SP 的值变为 $1FE 14. PHP PHP 的作用是将状态标志寄存器的值压入堆栈, 主要作用是保护现场 该指令产生的操作是 : 首先将标志寄存器 P 的值传送到堆栈指针 SP 所指向的存储单元, 然后使 SP 的值减小 1 具体格式参见下表: 表 2.24 指令 PHP 汇编指令格式操作码字节数 指令周期 (Cycles) 该指令对标志寄存器 P 不产生影响 PHP 08H mcu@sunplus.com.cn Tel:

33 第 2 章 SPMC65 系列单片机指令系统 15. PLA PLA 的作用是将堆栈内容弹出给 A 该指令产生的操作是: 首先使堆栈指针 SP 的值增加 1, 然后把 SP 指向的存储单元中的数值传送给累加器 A 具体格式参见下表: 表 2.25 指令 PLA 汇编指令格式 操作码 字节数 指令周期 (Cycles) PLA 68H 1 4 该指令对 P 标志位的影响见下表 : 表 2.26 PLA 指令对 P 标志位的影响 N: 将 bit7 的值赋给 N Z: 运算结果为零置 1 N V D I Z C! - - -! - [ 例 ]: LDX #$FF ; X $FF 立即数 0xFF( 即 $FF) 载入寄存器 X TXS ; SP $FF 立即数 0xFF( 即 $FF) 载入堆栈寄存器 SP, 堆栈指针指向 $01FF LDA #$35 ; A $35 PHA ; [SP] $35, SP SP 1, 此时 $35 被传送到 $01FF 单元,SP 的值变为 $FE LDA #$78 ; A $78 PLA ; SP SP + 1, A [SP], 此时 SP 变为 $FF,$01FF 单元中的数值 $35 被传 ; 送至累加器 A 16. PLP PLP 的作用是将堆栈中的内容弹出给状态标志寄存器 P 该指令首先将堆栈指针 SP 的值增加 1, 然后 将 SP 指向的存储单元中的数值赋给标志寄存器 P 具体格式参见下表: 表 2.27 指令 PLP 汇编指令格式 操作码 字节数 指令周期 (Cycles) PLP 28H 1 4 该指令对 P 标志位的影响见下表 : 表 2.28 PLP 指令对 P 标志位的影响 PLP 指令影响所有 P 标志 N V D I Z C!!!!!! 算术运算指令 SPMC65 的算术运算指令主要包括带进位加法 减法, 寄存器或存储器的自增 自减, 以及比较运算指令 Tel: mcu@sunplus.com.cn 27

34 凌阳 8 位通用单片机 1. ADC ADC 是累加器 A 的带进位加法指令, 该指令将累加器 A 中的数值与指定的操作数相加, 再加上进位标志 C 的值, 得到的结果赋给累加器 A 具体格式参见下表: 表 2.29 指令 ADC 汇编指令格式操作码字节数指令周期 (Cycles) ADC #dd 69H 2 2 ADC aa 65H 2 3 ADC aa, X 75H 2 4 ADC aaaa 6DH 3 4 ADC aaaa, X 7DH 3 4* ADC aaaa, Y 79H 3 4* ADC (aa, X) 61H 2 6 ADC (aa), Y 71H 2 6* * 如果数据寻址时超出了一页的范围, 需要再加一个指令周期 该指令对 P 标志位的影响见下表 : 表 2.30 指令 ADC 对 P 标志位的影响 N V D I Z C!! * -!! N: 将 bit7 的值赋给 N V: 仅用于有符号数算术运算, 两个同符号数相加或异符号数相减, 结果大于 127 或小于 -128 时, 该位置 1 Z: 结果为 0 时置 1 C: 最高位产生进位时, 该位被置 1 D:* 为 1 表示当前处于十进制模式 [ 例 1]: LDA #$45 ; A $45 CLC ; 将进位标志 C 设置为 0, 参见 节关于 CLC 指令的介绍 ADC #$32 ; A A + $32 + C, 此时累加器 A 的值变为 $77,N=0, V=0, Z=0, C=0 [ 例 2]: LDA #$25 ; A $25 SEC ; 将进位标志 C 设置为 1, 参见 节关于 SEC 指令的介绍 ADC #$18 ; A A + $18 + C, 此时累加器 A 的值变为 $3E,N=0, V=0, Z=0, 由于未发 ; 生进位,C 的值变为 0 [ 例 3]: LDA #$45 ; A $45 STA $68 ; [$68] A, 该句将 $45 传送到地址为 $68 的存储单元 28 mcu@sunplus.com.cn Tel:

35 第 2 章 SPMC65 系列单片机指令系统 CLC ; 将进位标志 C 设置为 0, 参见 节关于 CLC 指令的介绍 LDA #$72 ; A $72 ADC $68 ; A A + [$68] + C, 即 ($72 + $45 + 0), 此时累加器 A 的值变为 $B7,Z=0, ; C=0, 由于相当于两个同符号数相加, 结果大于 127, 所以 V=1, 由于结果 ; 最高位为 1, 所以 N=1 [ 例 4]: SED ; 将十进制模式标志 D 设置为 1, 切换到十进制运算模式, 参见 节关于 SED ; 指令的介绍 LDA #$25 ; A $25 SEC ; 将进位标志 C 设置为 1, 参见 节关于 SEC 指令的介绍 ADC #$18 ; 十进制运算,A (BCD)A + (BCD)$18 + C, 累加器 A 的值变为 $44,C=0, ; N=0, Z=0, V=0, 可与例 2 对比 2. SBC SBC 是累加器 A 的带借位减法指令, 该指令将累加器 A 中的数值与指定的操作数相减, 若进位标志 C 的值是 0 则再减去 1, 得到的结果赋给累加器 A, 即 A A - data - C 具体格式参见下表: 表 2.31 指令 SBC 汇编指令格式操作码字节数指令周期 (Cycles) SBC #dd E9H 2 2 SBC aa E5H 2 3 SBC aa, X F5H 2 4 SBC aaaa EDH 3 4 SBC aaaa, X FDH 3 4* SBC aaaa, Y F9H 3 4* SBC (aa, X) E1H 2 6 SBC (aa), Y F1H 2 6* * 如果数据寻址时超出了一页的范围, 需要再加一个指令周期 该指令对 P 标志位的影响见下表 : 表 2.32 指令 SBC 对 P 标志位的影响 N V D I Z C!! * -!! N: 将 bit7 的值赋给 N V: 仅用于有符号数算术运算, 两个同符号数相加或异符号数相减, 结果大于 127 或小于 -128 时, 该位置 1 Z: 结果为 0 时置 1 C: 计算过程未发生借位则 C 置 1, 发生借位则 C 置 0 D: * 为 1 表示当前处于十进制模式 [ 例 1]: LDA #$45 ; A $45 CLC ; 将进位标志 C 设置为 0, 参见 节关于 CLC 指令的介绍 Tel: mcu@sunplus.com.cn 29

36 凌阳 8 位通用单片机 SBC #$32 ; A A - $32 - C, 此时累加器 A 的值变为 $12,N=0, V=0, Z=0, 由于未发生 ; 借位, 所以 C=1 [ 例 2]: LDA #$39 ; A $39 SEC ; 将进位标志 C 设置为 1, 参见 节关于 SEC 指令的介绍 SBC #$47 ; A A - $47 - C, 此时累加器 A 的值变为 $F2( 借位, 相当于 $139-$47),V=0, ; Z=0, 由于发生了借位, 所以 C=0, 由于结果的 bit7 为 1, 所以 N=1 [ 例 3]: LDA #$62 ; A $62 STA $68 ; [$68] A, 该句将 $62 传送到地址为 $68 的存储单元 SEC ; 将进位标志 C 设置为 1, 参见 节关于 SEC 指令的介绍 LDA #$94 ; A $94 SBC $68 ; A A [$68] - C, 即 ($94 - $62-0), 此时累加器 A 的值变为 $32,Z=0, N=0, ; 由于未发生借位, 所以 C=1, 由于相当于两个不同符号数相减 ($94 作为有符 ; 号数使用时相当于 ,$68 相当于 ) 结果小于 , 所以 V=1 [ 例 4]: SED ; 将十进制模式标志 D 设置为 1, 切换到十进制运算模式, 参见 节关于 SED ; 指令的介绍 LDA #$39 ; A $39 SEC ; 将进位标志 C 设置为 1, 参见 节关于 SEC 指令的介绍 SBC #$47 ; 十进制运算,A (BCD)A - (BCD)$47 - C, 累加器 A 的值变为 $92( 发生 ; 借位, 相当于 ),C=0, Z=0, V=0, N=1( 结果的最高位为 1), 可 ; 以与例 2 对比 3. DEC DEC 的作用是对存储器中的数值进行减 1 操作, 具体格式参见下表 : 表 2.33 指令 DEC 汇编指令格式操作码字节数指令周期 (Cycles) DEC aa C6H 2 5 DEC aa, X D6H 2 6 DEC aaaa CEH 3 6 DEC aaaa, X DEH 3 6 该指令对 P 标志位的影响见下表 : 表 2.34 指令 DEC 对 P 标志位的影响 N V D I Z C! - - -! mcu@sunplus.com.cn Tel:

37 第 2 章 SPMC65 系列单片机指令系统 N: 将 bit7 的值赋给 N Z: 结果为 0 置 1 [ 例 1]: LDA #$45 ; A $45 STA $68 ; [$68] A, 此时 $68 存储单元内的数值是 $45 DEC $68 ; [$68] [$68] 1, 此时 $68 存储单元内的数值变为 $44 [ 例 2]: SED ; 将十进制模式标志 D 设置为 1, 切换到十进制运算模式, 参见 节关于 SED ; 指令的介绍 LDA #$30 ; A $30 LDX #$12 ; X $12 STA $63,X ; [$63 + X] A, 此时 $30 被传送到 $75 存储单元中 DEC $63,X ; [$63 + X] [$63 + X] 1, 此时 $75 存储单元内的数值变为 $2F, 证明十进 ; 制运算模式对 DEC 指令无效 4. DEX DEX 的作用是使 X 寄存器内的数值减 1, 具体格式参见下表 : 表 2.35 指令 DEX 汇编指令格式操作码字节数指令周期 (Cycles) DEX CAH 1 2 该指令对 P 标志位的影响见下表 : 表 2.36 指令 DEX 对 P 标志位的影响 N V D I Z C! - - -! - N: 将 bit7 的值赋给 N Z: 结果为 0 置 1 [ 例 ]: LDX #$36 ; X $36 DEX ; X X 1, 此时寄存器 X 内的数值变为 $35 5. DEY DEY 的作用是使 Y 寄存器内的数值减 1, 具体格式参见下表 : 表 2.37 指令 DEY 汇编指令格式操作码字节数指令周期 (Cycles) DEY 88H 1 2 该指令对 P 标志位的影响见下表 : Tel: mcu@sunplus.com.cn 31

38 凌阳 8 位通用单片机 表 2.38 指令 DEY 对 P 标志位的影响 N V D I Z C! - - -! - N: 将 bit7 的值赋给 N Z: 结果为 0 置 1 [ 例 ]: LDY #$00 ; Y $00,N=0, Z=1 DEY ; Y Y 1, 此时寄存器 Y 内的数值变为 $FF,N=1,Z=0 6. INC INC 的作用是对存储器中的数值进行加 1 操作, 具体格式参见下表 : 表 2.39 指令 INC 汇编指令格式操作码字节数指令周期 (Cycles) INC aa E6H 2 5 INC aa, X F6H 2 6 INC aaaa EEH 3 6 INC aaaa, X FEH 3 6 该指令对 P 标志位的影响见下表 : 表 2.40 指令 INC 对 P 标志位的影响 N V D I Z C! - - -! - N: 将 bit7 的值赋给 N Z: 结果为 0 置 1 [ 例 1]: LDA #$45 ; A $45 STA $68 ; [$68] A, 此时 $68 存储单元内的数值是 $45 INC $68 ; [$68] [$68] + 1, 此时 $68 存储单元内的数值变为 $46 [ 例 2]: LDA #$FF ; A $FF LDX #$12 ; X $12 STA $63,X ; [$63 + X] A, 此时 $FF 被传送到 $75 存储单元中 INC $63,X ; [$63 + X] [$63 + X] + 1, 此时 $75 存储单元内的数值变为 $00 7. INX INX 的作用是使 X 寄存器内的数值加 1, 具体格式参见下表 : 表 2.41 指令 INX 汇编指令格式操作码字节数指令周期 (Cycles) INX E8H mcu@sunplus.com.cn Tel:

39 第 2 章 SPMC65 系列单片机指令系统 该指令对 P 标志位的影响见下表 : 表 2.42 指令 INX 对 P 标志位的影响 N: 将 bit7 的值赋给 N Z: 结果为 0 置 1 N V D I Z C! - - -! - [ 例 ]: LDX #$36 ; X $36 INX ; X X + 1, 此时寄存器 X 内的数值变为 $37 8. INY INY 的作用是使 Y 寄存器内的数值加 1, 具体格式参见下表 : 表 2.43 指令 INY 该指令对 P 标志位的影响见下表 : 汇编指令格式操作码字节数指令周期 (Cycles) INY C8H 1 2 N: 将 bit7 的值赋给 N Z: 结果为 0 置 1 N V D I Z C! - - -! - [ 例 ]: LDY #$36 ; Y $36 INY ; Y Y + 1, 此时寄存器 Y 内的数值变为 $37 9. CMP CMP 的作用是将累加器 A 的值与指定操作数进行比较, 方法是 : 累加器 A 的值与指定的操作数相减, 若结果为负, 则 C 标志置 0, 否则 C 置 1; 若结果为 0, 则 Z 标志置 1 CMP 指令只改变标志寄存器, 而不会改变累加器 A 的值 该指令通常与条件转移类指令配合使用 ( 参见 节 ) 具体格式如下: 表 2.44 指令 CMP 汇编指令格式操作码字节数指令周期 (Cycles) CMP #dd C9H 2 2 CMP aa C5H 2 3 CMP aa, X D5H 2 4 CMP aaaa CDH 3 4 CMP aaaa, X DDH 3 4* CMP aaaa, Y D9H 3 4* CMP (aa, X) C1H 2 6 CMP (aa), Y D1H 2 6* Tel: mcu@sunplus.com.cn 33

40 凌阳 8 位通用单片机 * 如果数据寻址时超出了一页的范围, 需要再加一个指令周期该指令对 P 标志位的影响见下表 : 表 2.45 指令 CMP 对 P 标志位的影响 N V D I Z C! - - -!! N: 将 A - data 结果的 bit7 的值赋给 N Z:A = data 时置 1 C:A data 时置 1;A < data 时置 0 [ 例 1]: LDA #$36 ; A $36 CMP #$47 ; A - $47, 结果为负, 因此 C=0,Z=0, 由于 $36-$47=$EF,bit7 为 1, 所以 N=1 [ 例 2]: LDA #$36 ; A $36 CMP #$36 ; A - $36, 结果为 0, 因此 C=1,Z=1,N=0 10. CPX CPX 指令将寄存器 X 的值与指定的操作数进行比较, 比较方法与 CMP 指令类似 具体格式参见下表 : 表 2.46 指令 CPX 汇编指令格式操作码字节数指令周期 (Cycles) CPX #dd E0H 2 2 CPX aa E4H 2 3 CPX aaaa ECH 3 4 该指令对 P 标志位的影响见下表 : 表 2.47 指令 CPX 对 P 标志位的影响 N V D I Z C! - - -!! N: 将 X data 结果的 bit7 的值赋给 N Z:X = data 时置 1 C:X data 时置 1;X < data 时置 0 [ 例 ]: LDX #$A6 ; X $A6 CPX #$17 ; A - $17, 结果为正, 因此 C=1,Z=0, 因 $A6-$17=$8F, 最高位为 1, 所以 N=1 11. CPY CPY 指令将寄存器 Y 的值与指定的操作数进行比较, 比较方法与 CMP 指令类似 具体格式参见下表 : 34 mcu@sunplus.com.cn Tel:

41 第 2 章 SPMC65 系列单片机指令系统 表 2.48 指令 CPY 汇编指令格式操作码字节数指令周期 (Cycles) CPY #dd C0H 2 2 CPY aa C4H 2 3 CPY aaaa CCH 3 4 该指令对 P 标志位的影响见下表 : 表 2.49 指令 CPY 对 P 标志位的影响 N V D I Z C! - - -!! N: 将 Y data 结果的 bit7 的值赋给 N Z:Y = data 时置 1 C:Y data 时置 1;Y < data 时置 0 [ 例 ]: LDA #$C2 ; A $C2 STA $68 ; [$68] A, 此句将 $C2 存入地址为 $68 的存储单元 LDY #$24 ; Y $24 CPY $68 ; Y [$68], 即 $24 - $C2, 结果为负,C=0,Z=0, 因 $24-$C2=$62, 所以 N= 逻辑运算指令 1. AND 这条指令对累加器 A 中的数值与指定的操作数进行按位的逻辑 与 运算, 即两操作数对应位中的任一个为 0, 则该位的结果为 0; 两个都为 1 时该位的结果为 1 与 运算后的结果送至累加器 A 具体格式参见下表 : 表 2.50 指令 AND 汇编指令格式操作码字节数指令周期 (Cycles) AND #dd 29H 2 2 AND aa 25H 2 3 AND aa, X 35H 2 4 AND aaaa 2DH 3 4 AND aaaa, X 3DH 3 4* AND aaaa, Y 39H 3 4* AND (aa, X) 21H 2 6 AND (aa), Y 31H 2 6* * 如果数据寻址时超出了一页的范围, 需要再加一个指令周期 该指令对 P 标志位的影响见下表 : Tel: mcu@sunplus.com.cn 35

42 凌阳 8 位通用单片机 表 2.51 指令 AND 对 P 标志位的影响 N: 将 bit7 的值赋给 N Z: 结果为 0 时置 1 N V D I Z C! - - -! - [ 例 ]: LDA #% ; A % AND #% ; A A and % , 执行此句后累加器的值为 ORA 对累加器 A 中的操作数与指定的操作数进行逻辑 或 运算 即两操作数对应位中的任一个为 1( 或 两个都为 1), 则该位的结果为 1, 否则为 0 或 运算的结果送回累加器 A 具体格式参见下表: 表 2.52 指令 ORA 汇编指令格式操作码字节数指令周期 (Cycles) ORA #dd 09H 2 2 ORA aa 05H 2 3 ORA aa, X 15H 2 4 ORA aaaa 0DH 3 4 ORA aaaa, X 1DH 3 4* ORA aaaa, Y 19H 3 4* ORA (aa, X) 01H 2 6 ORA (aa), Y 11H 2 6* * 如果数据寻址时超出了一页的范围, 需要再加一个指令周期 该指令对 P 标志位的影响见下表 : 表 2.53 指令 ORA 对 P 标志位的影响 N: 将 bit7 的值赋给 N Z: 结果为 0 置 1 N V D I Z C! - - -! - [ 例 ]: LDA #% ; A % STA $68 ; [$68] A, 此句将 % 存入地址为 $68 的单元 LDA #% ; A % ORA $68 ; A A or [$68], 即 % 和 % 进行 或 运算, 执行此句后 ;A 的值将变为 % EOR 这条指令对累加器 A 的值与指定的操作数进行 异或 运算 当两数的对应位不相同时 ( 即一个为 1, 36 mcu@sunplus.com.cn Tel:

43 第 2 章 SPMC65 系列单片机指令系统 另一个为 0), 该位的异或结果为 1; 否则该位的异或结果为 0 异或运算的结果送回到累加器 A 中 具体格式参见下表 : 表 2.54 指令 EOR 汇编指令格式操作码字节数指令周期 (Cycles) EOR #dd 49H 2 2 EOR aa 45H 2 3 EOR aa, X 55H 2 4 EOR aaaa 4DH 3 4 EOR aaaa, X 5DH 3 4* EOR aaaa, Y 59H 3 4* EOR (aa, X) 41H 2 6 EOR (aa), Y 51H 2 6* * 如果数据寻址时超出了一页的范围, 需要再加一个指令周期 该指令对 P 标志位的影响见下表 : 表 2.55 指令 EOR 对 P 标志位的影响 N: 将 bit7 的值赋给 N Z: 结果为 0 置 1 N V D I Z C! - - -! - [ 例 ]: LDA #% ; A % EOR #% ; A A ^ % , 执行此句后 A 的值将变为 % ASL ASL 指令的作用是对累加器或存储器中的数据进行左移, 每执行一次 ASL, 数据向左移动一位, 低位补零, 高位移进标志位 C 中 如图 2.10 所示 : C 图 2.10 ASL 移位示意图 指令的具体格式参见下表 : 表 2.56 指令 ASL 汇编指令格式操作码字节数指令周期 (Cycles) ASL A 0AH 1 2 ASL aa 06H 2 5 ASL aa, X 16H 2 6 ASL aaaa 0EH 3 6 ASL aaaa, X 1EH 3 6* Tel: mcu@sunplus.com.cn 37

44 凌阳 8 位通用单片机 * 如果数据寻址时超出了一页的范围, 需要再加一个指令周期 该指令对 P 标志位的影响见下表 : 表 2.57 指令 ASL 对 P 标志位的影响 N V D I Z C! - - -!! N: 将 bit7 的值赋给 N Z: 结果为 0 置 1 C: 最高位 bit7 移出的值赋给 C [ 例 ]: LDA #% ; A % ASL A ; C A.bit7, A A << 1, 执行此句后 A 的值将变为 % , ; C=1(% 的最高位移至 C) 5. LSR 指令 LSR 的作用是对指定的操作数进行右移操作, 高位补零, 低位向 C 标志位移动 每执行一次 LSR, 使操作数向右移动一位 移动过程参考图 C 指令的具体格式参见下表 : 图 2.11 LSR 移位过程示意图 表 2.58 指令 LSR 汇编指令格式操作码字节数指令周期 (Cycles) LSR A 4AH 1 2 LSR aa 46H 2 5 LSR aa, X 56H 2 6 LSR aaaa 4EH 3 6 LSR aaaa, X 5EH 3 6* * 如果数据寻址时超出了一页的范围, 需要再加一个指令周期 该指令对 P 标志位的影响见下表 : 表 2.59 指令 LSR 对 P 标志位的影响 N V D I Z C! - - -!! N: 将 bit7 的值赋给 N Z: 结果为 0 置 1 C: 将最低位 bit0 移出的数据赋给 C [ 例 ]: LDA #% ; A % mcu@sunplus.com.cn Tel:

45 第 2 章 SPMC65 系列单片机指令系统 STA $68 ; [$68] A, 此句将 % 存入地址为 $68 的单元 LSR $68 ; C [$68].bit0, [$68] [$68] >> 1, 执行此句后, 地址为 $68 的存储单元的 ; 值将变为 % ,C=0(% 的末位移至 C) 6. ROL 这条指令的作用是对指定的操作数进行循环向左移动, 标志位 C 的值移至操作数地最低位, 而最高位的值移入标志位 C 每执行一次 ROL, 操作数将循环左移一位 移动过程参考图 C 图 2.12 ROL 移位过程示意图 指令的具体格式参见下表 : 汇编指令格式操作码字节数指令周期 (Cycles) ROL A 2AH 1 2 ROL aa 26H 2 5 ROL aa, X 36H 2 6 ROL aaaa 2EH 3 6 ROL aaaa, X 3EH 3 6* * 如果数据寻址时超出了一页的范围, 需要再加一个指令周期 该指令对 P 标志位的影响见下表 : N V D I Z C! - - -!! N: 将 bit7 的值赋给 N Z: 结果为 0 时置 1 C: 将最高位移出的数据 bit7 赋给 C [ 例 1]: CLC ; 将进位标志 C 设置为 0, 参见 节关于 CLC 指令的介绍 LDA #% ; A % ROL A ; A (A << 1) + C, 执行此句后 A 的值将变为 % ,C=1 ;(% 的最高位移至 C) [ 例 2]: SEC ; 将进位标志 C 设置为 1, 参见 节关于 SEC 指令的介绍 LDA #% ; A % STA $68 ; [$68] A, 此句将 % 存入地址为 $68 的单元 ROL $68 ; [$68] ([$68] << 1) + C, 执行此句后 $68 存储单元的值将变为 % , ; C=1(% 的最高位移至 C) 7. ROR 这条指令的作用是对指定的操作数进行循环向右移动, 标志位 C 的值移入操作数的最高位, 而操作数 Tel: mcu@sunplus.com.cn 39

46 凌阳 8 位通用单片机 最低位的值移入标志位 C 每执行一次 ROR, 使操作数循环右移一位 移动过程参考图 C 指令的具体格式参见下表 : 图 2.13 ROR 移位过程示意图 汇编指令格式操作码字节数指令周期 (Cycles) ROR A 6AH 1 2 ROR aa 66H 2 5 ROR aa, X 76H 2 6 ROR aaaa 6EH 3 6 ROR aaaa, X 7EH 3 6* * 如果数据寻址时超出了一页的范围, 需要再加一个指令周期 该指令对 P 标志位的影响见下表 : 表 2.60 指令 ROR 对 P 标志位的影响 N V D I Z C! - - -!! N: 将 bit7 的值赋给 N Z: 结果为 0 置 1 C: 将最低位移出的数据赋给 C [ 例 1]: CLC ; 将进位标志 C 设置为 0, 参见 节关于 CLC 指令的介绍 LDA #% ; A % ROR A ; A (A >> 1) + (C << 7), 执行此句后 A 的值将变为 % ,C=1 ;(% 的最低位移至 C) [ 例 2]: SEC ; 将进位标志 C 设置为 1, 参见 节关于 SEC 指令的介绍 LDA #% ; A % STA $68 ; [$68] A, 此句将 % 存入地址为 $68 的单元 ROR $68 ; [$68] ([$68] >> 1) + (C << 7), 执行此句后 $68 存储单元的值将变 ; 为 % ,C=0(% 的最低位移至 C) 8. BIT 本指令的作用是对累加器 A 进行测试, 方法是将累加器 A 和指定的操作数相 与, 从而改变标志寄存器 P 的值, 而不会改变累加器 A 的值 BIT 指令通常用来判断累加器或变量的某一位 ( 或某几位 ) 是否为 0, 一般与条件转移类指令 ( 参见 节 ) 配合使用 指令的具体格式参见下表 : 40 mcu@sunplus.com.cn Tel:

47 第 2 章 SPMC65 系列单片机指令系统 表 2.61 指令 BIT 汇编指令格式操作码字节数指令周期 (Cycles) BIT aa 24H 2 3 BIT aaaa 2CH 3 4 该指令对 P 标志位的影响见下表 : 表 2.62 指令 BIT 对 P 标志位的影响 N V D I Z C!! - -! - N: 将 bit7 的值赋给 N V: 将 bit6 的值赋给 V Z: 将存储器 aa/aaaa 的数值和累加器 A 相 与, 若结果为 0, 则置标志 Z 为 1, 否则置 0 [ 例 1]: LDA #% ; A % STA $68 ; [$68] A, 此句将 % 存入地址为 $68 的单元 LDA #% ; A % BIT $68 ; A and [$68], 此句用来判断 $68 存储单元的最低位是否为 0, 由于 ; % and % = % , 所以 Z=0, N=0, V=0 [ 例 2]: LDA #% ; A % STA $68 ; [$68] A, 此句将 % 存入地址为 $68 的单元 LDA #% ; A % BIT $68 ; A and [$68], 此句用来判断累加器 A 的最低两位是否为 0, 由于 控制转移指令 ; % and % = % , 所以 Z=1, N=0, V=0 1. 条件转移指令 BCS BCC BEQ BNE BMI BPL BVS BVC SPMC65 指令系统中有一系列条件转移指令, 它以某些标志位作为依据, 若满足指令所规定的条件, 则程序转移至指定目标 ; 若不满足条件, 则程序顺序执行条件转移指令的下一条指令 这类条件指令转移的目标地址是采用相对寻址方式, 即以转移指令为基准的 +127 或 -128 字节的范围之内 指令的具体格式参见下表 : 表 2.63 条件转移指令 汇编指令格式转移条件操作码字节数指令周期 (Cycles) BCS aa C=1 B0H 2 2* BCC aa C=0 90H 2 2* BEQ aa Z=1 F0H 2 2* BNE aa Z=0 D0H 2 2* BMI aa N=1 30H 2 2* BPL aa N=0 10H 2 2* Tel: mcu@sunplus.com.cn 41

48 凌阳 8 位通用单片机 BVS aa V=1 70H 2 2* BVC aa V=0 50H 2 2* 注 *. 发生跳转时, 需要再加一个指令周期 该指令对标志寄存器 P 不产生影响 [ 例 ]: LDX #$A6 ; X $A6 CPX #$17 ; A - $17, 比较后 C=1,Z=0,N=1 BCS Lb1 ; 若 C=1 则跳转到标号 Lb1 处 ; 此处的指令被跳过 Lb1: BNE Lb2 ; 若 Z=1 则跳转到标号 Lb2 处, 但由于 Z=0, 所以未发生跳转 BMI Lb3 ; 若 N=1 则跳转到标号 Lb3 处 Lb2: ; 此处的指令被跳过 Lb3: LDA #% ; A % LSR A ; C A.bit0, A (A >> 1), 此时 C=0 BCC Lb1 ; 若 C=0 则跳转到标号 Lb1 2. JMP JMP 是无条件转移指令, 它使程序无条件地跳转到目标地址 指令的具体格式参见下表 : 表 2.64 指令 JMP 汇编指令格式操作码字节数指令周期 (Cycles) JMP aaaa 4CH 3 3 JMP (aaaa) 6CH 3 5 其中 JMP (aaaa) 采用间接跳转方式, 由地址 aaaa 与地址 aaaa+1 中的数据组成 16 位跳转地址, 如 下图所示, 执行 JMP ($F600) 后, 程序将跳转到 $F824 地址处 JMP ($F600) PC XXXX $F600 $F601 $24 $F8 $F824 图 2.14 间接跳转示意图 JMP 指令不影响标志寄存器 P [ 例 1]: JMP Lb1 ; 无条件跳转到指定的标号处 ; 此处的指令被跳过 Lb1: ; 跳转到此处 [ 例 2]: JMP (Lb1) ; 间接跳转, 跳转到 Lb1 中的数据所指向的地址 42 mcu@sunplus.com.cn Tel:

49 第 2 章 SPMC65 系列单片机指令系统 ; 此处的指令被跳过 Lb2: ; 跳转到此处 Lb1:.DW Lb2 ; Lb1 处定义了一个 16 位常量, 其内容是 Lb2 的地址 参见.DW 伪指令 3. JSR 本指令是子程序调用指令, 执行该指令将使程序跳转到指定的子程序所在的地址 与 JMP 指令不同的是, 在跳转之前, 硬件自动将子程序的返回地址 ( 下一条指令的地址 ) 压入堆栈, 然后跳转到子程序处执行 一般地, 子程序执行完毕, 应执行 RTS 指令从子程序返回 JSR 指令的具体格式参见下表 : 表 2.65 指令 JSR 汇编指令格式操作码字节数指令周期 (Cycles) JSR aaaa 20H 3 6 该指令不影响 P 寄存器标志位 [ 例 ]: 略, 参见 RTS 指令 4. RTS 子程序返回指令 RTS 通常作为一个子程序的最后一条指令, 它用以返回到调用这个子程序的断点处 RTS 首先从堆栈中弹出即将返回到的程序地址, 然后跳转到该地址, 实现子程序返回 指令的具体格式参 见下表 : 表 2.66 指令 RTS 汇编指令格式操作码字节数指令周期 (Cycles) RTS 60H 1 6 该指令不影响标志寄存器 P 的标志位 [ 例 ]: JSR Sub1 ; 子程序调用, 程序将跳转到 Sub1 标号处 LDA #$35 ; 子程序调用之后, 由子程序中的 RTS 指令返回, 执行本条语句 Sub1: RTS ; 定义一个名为 Sub1 的子程序 ; 该子程序的程序体 ; 子程序返回指令, 返回到子程序调用语句的下一条语句 5. RTI 当程序运行在中断过程 ( 中断服务程序 ) 时, 遇到 RTI 指令, 将从中断过程退出, 返回到断点处 指令的具体格式参见下表 : Tel: mcu@sunplus.com.cn 43

50 凌阳 8 位通用单片机 表 2.67 指令 RTI 汇编指令格式操作码字节数指令周期 (Cycles) RTI 40H 1 6 执行指令 RTI 后, 标志寄存器 P 的值从堆栈中弹出, 将当前的 P 值覆盖, 所以 N V D Z C 标志位均恢复到中断前的状态 [ 例 ]: V_IRQ: RTI ; 此处定义 IRQ 中断服务程序 ; 中断服务程序内容 ; 中断服务返回指令, 执行该指令后将返回到断点处 位操作指令 1. SET 本指令的作用是将指定地址的指定位设置为 1 它的语法是 SET aa,b, 用以将变量 aa 的 bit b 置 1 其中 b 的取值范围是 0~7 SET 指令只能对地址位于 $00~$FF 的数据进行操作, 具体格式参见下表 : 表 2.68 指令 SET 汇编指令格式操作码字节数指令周期 (Cycles) SET aa, 0 8FH 2 5 SET aa, 1 9FH 2 5 SET aa, 2 AFH 2 5 SET aa, 3 BFH 2 5 SET aa, 4 CFH 2 5 SET aa, 5 DFH 2 5 SET aa, 6 EFH 2 5 SET aa, 7 FFH 2 5 该指令不影响标志寄存器 P 的标志位 [ 例 ]: LDA #% ; A % STA $68 ; [$68] A, 把 % 送入地址为 $68 的存储单元 SET $68,1 ; [$68].bit1 1, 此句将 $68 存储单元的值改变为 % CLR 本指令的作用是将指定存储器地址的指定位设置为 0 它的语法是 CLR aa,b, 用以将变量 aa 的 bit b 置 0 其中 b 的取值范围是 0~7 CLR 指令只能对地址位于 $00~$FF 的数据进行操作, 具体格式参见 下表 : 44 mcu@sunplus.com.cn Tel:

51 第 2 章 SPMC65 系列单片机指令系统 表 2.69 指令 CLR 汇编指令格式操作码字节数指令周期 (Cycles) CLR aa, 0 0FH 2 5 CLR aa, 1 1FH 2 5 CLR aa, 2 2FH 2 5 CLR aa, 3 3FH 2 5 CLR aa, 4 4FH 2 5 CLR aa, 5 5FH 2 5 CLR aa, 6 6FH 2 5 CLR aa, 7 7FH 2 5 该指令不影响标志寄存器 P 的标志位 [ 例 ]: LDA #% ; A % STA $68 ; [$68] A, 把 % 送入地址为 $68 的存储单元 CLR $68,5 ; [$68].bit5 0, 此句将 $68 存储单元的值改变为 % INV 本指令的作用是将指定地址的指定位取反 它的语法是 INV aa,b, 如果变量 aa 的 bit b 为 0, 则将 其翻转为 1; 反之, 如果原来是 1 则翻转成 0 其中 b 的取值范围是 0~7 INV 指令只能对地址位于 $00~$FF 的数据进行操作, 具体格式参见下表 : 表 2.70 指令 INV 汇编指令格式操作码字节数指令周期 (Cycles) INV aa, 0 87H 2 5 INV aa, 1 97H 2 5 INV aa, 2 A7H 2 5 INV aa, 3 B7H 2 5 INV aa, 4 C7H 2 5 INV aa, 5 D7H 2 5 INV aa, 6 E7H 2 5 INV aa, 7 F7H 2 5 该指令不影响标志寄存器 P 的标志位 [ 例 ]: LDA #% ; A % STA $68 ; [$68] A, 把 % 送入地址为 $68 的存储单元 INV $68,5 ; [$68].bit5 [$68].bit5, 此句将 $68 存储单元的值改变为 % INV $68,7 ; [$68].bit7 [$68].bit7, 此句将 $68 存储单元的值改变为 % TST TST 是位测试指令, 该指令的作用是判断指定地址的指定位是否为 0 若该位为 0 则将标志 Z 置为 1, Tel: mcu@sunplus.com.cn 45

52 凌阳 8 位通用单片机 否则置 0 TST 指令只能对地址位于 $00~$FF 的数据进行位测试, 通常与条件转移类指令配合使用 指令 的具体格式参见下表 : 表 2.71 指令 TST 汇编指令格式操作码字节数指令周期 (Cycles) TST aa, 0 07H 2 3 TST aa, 1 17H 2 3 TST aa, 2 27H 2 3 TST aa, 3 37H 2 3 TST aa, 4 47H 2 3 TST aa, 5 57H 2 3 TST aa, 6 67H 2 3 TST aa, 7 77H 2 3 该指令对 P 标志位的影响见下表 : 表 2.72 指令 TST 对 P 标志位的影响 N V D I Z C ! - Z: 若变量 aa 的 bit n 为 0, 则标志位 Z 置 1, 否则置 0 [ 例 ]: LDA #% ; A % STA $68 ; [$68] A, 把 % 送入地址为 $68 的存储单元 TST $68,0 ; 由于 [$68] 的 bit0 位为 1, 所以 Z= 处理器控制指令 1. CLC 本指令的作用是对进位标志位 C 清零 指令的具体格式参见下表 : 表 2.73 指令 CLC 该指令对 P 标志位的影响见下表 : 汇编指令格式操作码字节数指令周期 (Cycles) CLC 18H 1 2 C: 进位标志位清零 N V D I Z C ! 2. CLD 本指令的作用是对十进制模式标志位 D 清零, 退出十进制模式 指令的具体格式参见下表 : 表 2.74 指令 CLD 汇编指令格式操作码字节数指令周期 (Cycles) CLD D8H mcu@sunplus.com.cn Tel:

53 第 2 章 SPMC65 系列单片机指令系统 该指令对 P 标志位的影响见下表 : 表 2.75 指令 CLD 对 P 标志位的影响 D: 十进制模式标位清零 N V D I Z C - -! CLI 该条指令的作用是对中断屏蔽标志位 I 清零, 即打开总的中断开关 但如果要开启某个具体的中断, 还需设置相应的中断控制寄存器 ( 参见中断系统一章的相关内容 ) 指令的具体格式如下: 表 2.76 指令 CLI 汇编指令格式操作码字节数指令周期 (Cycles) CLI 58H 1 2 该指令对 P 标志位的影响见下表 : 表 2.77 指令 CLI 对 P 标志位的影响 I: 中断屏蔽标志位清零 N V D I Z C - - -! CLV 该指令的作用是对溢出标志位 V 清零 指令的具体格式参见下表 : 表 2.78 指令 CLV 汇编指令格式操作码字节数指令周期 (Cycles) CLV B8H 1 2 该指令对 P 标志位的影响见下表 : 表 2.79 指令 CLV 对 P 标志位的影响 V: 溢出标志位清零 N V D I Z C -! SEC 该指令的作用是将进位标志 C 置 1 指令的具体格式参见下表: 表 2.80 指令 SEC 汇编指令格式操作码字节数指令周期 (Cycles) SEC 38H 1 2 该指令对 P 标志位的影响见下表 : 表 2.81 指令 SEC 对 P 标志位的影响 N V D I Z C ! Tel: mcu@sunplus.com.cn 47

54 凌阳 8 位通用单片机 C: 进位标志位置 1 6. SED 该指令的作用是将十进制模式标志位 D 置 1, 使 CPU 切换到十进制模式 在该模式下, 进行加法或减法运算时, 参与运算的操作数以及运算结果将以 BCD 码的形式存在 使用指令 CLD 可以退出十进制模式 指令的具体格式参见下表 : 表 2.82 指令 SED 该指令对 P 标志位的影响见下表 : 汇编指令格式操作码字节数指令周期 (Cycles) SED F8H 1 2 D: 十进制模式标志位置 1 N V D I Z C - -! [ 例 ]: SED ; 切换到十进制运算模式 CLC ; C 0 LDA #$37 ; A $37 ADC #$45 ; A (BCD)A + (BCD)$45 + C, 执行此句后 A=$82 7. SEI SEI 指令的作用是使中断屏蔽标志位 I 置 1 执行该指令后, 除 NMI 之外的所有中断都将被禁止, 它相当于所有可屏蔽中断的总开关 指令的具体格式参见下表 : 表 2.83 指令 SEI 汇编指令格式操作码字节数指令周期 (Cycles) SEI 78H 1 2 该指令对 P 标志位的影响见下表 : 表 2.84 指令 SEI 对 P 标志位的影响 I: 无条件置 1 N V D I Z C - - -! NOP 该指令是空操作, 不影响 P 标志位, 不产生返回值, 只起到延时作用 指令的具体格式参见下表 : 表 2.85 指令 NOP 汇编指令格式操作码字节数指令周期 (Cycles) NOP EAH mcu@sunplus.com.cn Tel:

55 第 2 章 SPMC65 系列单片机指令系统 2.4 常用伪指令 SPMC65 汇编伪指令与汇编指令不同, 它不会被 CPU 执行, 而是在汇编器对程序进行汇编期间实现对汇编器的控制 使用伪指令可以完成分配存储区 定义宏 指导汇编器汇编指定的代码等功能, 从而增加程序的可读性和可维护性 SPMC65 伪指令的语法格式及分类 SPMC65 伪指令可以出现在程序文件的任意位置, 为了与汇编指令区分, 建议伪指令的前面加上一个句点., 例如.CODE SPMC65 伪指令不必区分字母的大小写, 也就是说, 在 SPMC65 程序中,.code.CODE.cODe 是等价的, 建议伪指令全部大写 但是利用伪指令定义的标号 ( 包括段名 宏名 变量名 结构名等 ) 则要区分其字母的大小写, 例如标号 Temp 与标号 temp 代表两个不同的标号 为便于对 SPMC65 伪指令的语法进行描述, 我们采用了下列符号约定 : lable count value args 标号 数量 常量数值 参数 [ ] 可缺省项目 如果出现 [[ ]] 的形式, 则表示可缺省项的内容本身就带有方括号 SPMC65 伪指令依照其用途可分为五类 : 存储类 定义类 条件类 汇编链接类以及调试类 详见表 2.86 表中用斜线 / 隔开的伪指令是同义伪指令, 它们虽然名字不同, 但实现的功能是相同的 例如 ORG/ORGIN 表示 ORG 与 ORGIN 两条伪指令可以相互替换 表 2.86 伪指令分类列表 类别 用途 伪指令 存储类 定义变量和常量 DB / BYTE / DEFB / STRING,DW / DEFW / WORD, DD / LONG,FLOAT,DOUBLE,DS / DEFS,DUP, ASCII,BLKB,BLKL,BLKW 定义类 标号定义段定义过程和结构的定义宏定义 VAR / DEFL / SET EQU / EQUAL CODE,DATA,PAGE0,SECTION,ORG / ORGIN PROC,ENDP,STRUCT,ENDST MACRO,ENDM / MACEND, MACEXIT 条件类 对汇编指令进行条件汇编 IF / IFN / IFNFALSE / IFNZ / IFTRUE, IFE / IFFALSE / IFNTRUE / IFZ,IFDIFF / IFNSAME IFNDIFF / IFSAME,IFDEF,IFNDEF,IFMA,IFNMA, IFABS / IFNREL,IFNABS / IFREL,IFSSEQ,IFSSNEQ, IFPAGE0,IFNPAGE0,IFCLEAR,IFNEXT, ELSE,ENDIF / ENDC,EXIT Tel: mcu@sunplus.com.cn 49

56 凌阳 8 位通用单片机 汇编链接类 指导汇编器和连接器 PUBLIC / GLOBAL / XDEF,EXTERN / EXTERNAL / XREF, INCLUDE,LINKLIST,SYMBOLS, COMMENT,ASK, MESSAGE / MESSG,ABSOLUTE,RELATIVE,END 调试类 与调试相关的伪指令 STABF,STABN,STABS 下面将分类介绍比较常用的伪指令 存储类伪指令 1. DB [ 功能 ] 以字节型数据的形式来存储常量 ( 定位在 ROM 区, 参见.CODE 伪指令 ) [ 同义伪指令 ] DEFB BYTE STRING [ 格式 ] [label:].db [[count]] [value] [,[count]] [value][, ] [ 说明 ] 本伪指令把一系列 8 位常量值存入连续的数据单元中 多个 value 值用逗号分隔开, 也可在每 个 value 值的前面指定一个 [count] 值, 表示连续存储 count 个相同的 value 如果存储的常量中含有 ASCII 字符或字符串, 则必须用单引号或双引号将其括起来 例如 : Lb1:.DB 17h ;1 个字节, 值为 17h.DB 3,[2] d, ef ;5 个字节, 值为 3, d, d, e, f Lb3:.DB Isn t ; 包含单引号的字符串 上述定义将使汇编器分配一段 ROM 空间用来存储这些数值 : 初值 17h 3 d d e f I s n 单引号 t ROM 区存储内容 17h 03h 64h 64h 65h 66h 49h 73h 6Eh 27h 74h 如果利用.DB 定义变量 ( 在 RAM 区存储, 参见.PAGE0 和.DATA 伪指令 ), 那么.DB 后面的初始 化值将不起作用, 汇编器仅仅在 RAM 中分配相应长度的空间, 而不会存入初值, 因此不建议使用.DB 定义变量 2.DW [ 功能 ] 以 16 位整型数据的形式来存储常量 ( 定位在 ROM 区, 参见.CODE 伪指令 ) [ 同义伪指令 ] DEFW WORD [ 格式 ] [label:].dw [[count]] [value] [,[count]] [value][, ] [ 说明 ] 本伪指令将申请若干连续的 16 位整型数据单元来存储双字节型常量序列 其使用方法与.DB 伪指令相同 例如 : Lb1:.DW 1074h ;1 个双字节, 值为 1074h.DW 3,[2] d, ef ;5 个双字节数据 上述定义将使汇编器分配一段 ROM 空间用来存储这些数值 : 50 mcu@sunplus.com.cn Tel:

57 第 2 章 SPMC65 系列单片机指令系统 初值 1074h 3 d d e f ROM 区存储内容 74h 10h 03h 00h 64h 00h 64h 00h 65h 00h 66h 00h 如果利用.DW 定义变量 ( 在 RAM 区存储, 参见.PAGE0 和.DATA 伪指令 ), 那么.DW 后面的初始 化值将不起作用, 汇编器仅仅在 RAM 中分配相应长度的空间, 而不会存入初值 不建议用.DW 定义 变量 3. DD [ 功能 ] 以 32 位长整型数据的形式来存储常量 ( 定位在 ROM 区, 参见.CODE 伪指令 ) [ 同义伪指令 ] LONG [ 格式 ] [label:].dd [[count]] [value][,value][, ] [ 说明 ] 本伪指令申请若干连续的 32 位长整型数据单元来存储四字节型常量 其使用方法与.DB 伪指 令相同 例如 : Lb1:.DD h ; 占用 1 个 32 位单元.DD 3,[2] d, ef ; 占用 5 个 32 位单元 上述定义将使汇编器分配一段 ROM 空间用来存储这些数值 : 初值 h 3 d ROM 区存储内容 56h 34h 12h 00h 03h 00h 00h 00h 65h 00h 00h 00h 初值 d e f ROM 区存储内容 65h 00h 00h 00h 66h 00h 00h 00h 67h 00h 00h 00h 如果利用.DD 定义变量 ( 在 RAM 区存储, 参见.PAGE0 和.DATA 伪指令 ), 那么.DD 后面的初始 化值将不起作用, 汇编器仅仅在 RAM 中分配相应长度的空间, 而不会存入初值 不建议用.DD 定义 变量 4. FLOAT [ 功能 ] 以单精度浮点型实数的形式来存储常量 ( 定位在 ROM 区, 参见.CODE 伪指令 ) [ 格式 ] [label:].float [[count]] [value][,value][, ] [ 说明 ] 本伪指令用来把实数常量转换为 IEEE 格式表示的单精度浮点型数据并存储, 每个浮点数将占用 4 字节的存储空间.FLOAT 的使用方法与.DB 伪指令相同 同样地, 只用当利用.FLOAT 定义常量时,value 预置的初值才会起作用, 而定义的变量 ( 存储于 RAM 区, 参见.PAGE0 和.DATA 伪指令 ) 不会被相应的 value 值初始化, 仅仅会占用同样大小的 RAM 空间, 因此不建议用.FLOAT 定义变量 例如 : Lb1:.FLOAT ; 将 转换为 IEEE 格式 ( h).FLOAT [2]78 ; 将两个 78 转换为 IEEE 格式 (429C0000h) 上述对常量的定义将使汇编器分配一段 ROM 空间用来存储这些数值 : Tel: mcu@sunplus.com.cn 51

58 凌阳 8 位通用单片机 初值 ROM 区存储内容 75h 93h 06h 43h 00h 00h 9Ch 42h 00h 00h 9Ch 42h 5. DOUBLE [ 功能 ] 以双精度浮点型实数的形式来存储常量 ( 定位在 ROM 区, 参见.CODE 伪指令 ) [ 格式 ] [label:].double [[count]] [value][,value][, ] [ 说明 ] 本伪指令用来把实数常量值转换为 IEEE 格式表示的双精度浮点型数据并存储, 每个浮点数将 占用 8 字节的存储空间.DOUBLE 的使用方法与.DB 伪指令相同 同样地, 只用当利用.DOUBLE 定 义常量时,value 预置的初值才会起作用, 而定义的变量 ( 在 RAM 区存储, 参见.PAGE0 和.DATA 伪 指令 ) 仅会占用同样大小的 RAM 空间, 不会被相应的 value 值初始化 不建议用.DOUBLE 定义变量 例如 : Lb1:.DOUBLE ; 转换为 IEEE(4060D26E978D4FDFh) 若上述定义处于常量区, 那么将占用一段 ROM 空间用来存储这些数值 : 初值 DFh 4Fh 8Dh 97h 6Eh D2h 60h 40h ROM 区存储内容 DUP [ 功能 ] 与.DB.DW.DD.FLOAT.DOUBLE 等常量存储类伪指令配合使用, 用来存放若干个具有 相同数值的常量 [ 格式 ] [label:].db count.dup (value) [label:].dw count.dup (value) [label:].dd count.dup (value) [label:].float count.dup (value) [label:].double count.dup (value) [ 说明 ] 本伪指令将分配 count 个值为 value 的数据单元, 如果 value 值为问号 (?), 则 value 值被初始 化为 0 例如 : Lb1:.DW 11 DUP (20h) // 定义 11 个字的连续空间, 并存入 20h DUP 伪指令可以灵活地出现在存储类伪指令中, 例如 : Lb1:.DB 5, [2]1, 3.DUP (?), 2.DUP (7,8), 2.DUP ( ab ) 上述常量定义将在 ROM 中分配空间来存储下列数值 : 初值 5 [2]1 3.DUP (?) 2.DUP (7,8) 2.DUP ( ab ) ROM 区存储内容 05h 01h 01h 00h 00h 00h 07h 08h 07h 08h 61h 62h 61h 62h 7. DS [ 功能 ] 定义指定长度的变量 ( 定位在 RAM 区, 参见.PAGE0 和.DATA 伪指令 ) 52 mcu@sunplus.com.cn Tel:

59 第 2 章 SPMC65 系列单片机指令系统 [ 同义伪指令 ] DEFS [ 格式 ] [label:].ds count [ 说明 ] 本伪指令用来为变量分配一段 RAM 空间,count 代表这段空间占用的字节数 利用.DS 分配的变量空间不会被初始化, 其中的数据是不确定的 建议定义变量使用 DS 伪指令 例如 : Lb1:.DS 5 ; 定义了变量 Lb1, 占用 5 个字节的 RAM 空间如果在 ROM 区使用.DS 伪指令定义常量 ( 参见.CODE 伪指令 ), 那么将在 ROM 区占用 count 个字节的存储空间, 每个字节的数值都是 FFH 定义类伪指令 1. VAR [ 功能 ] 为标号赋值 [ 同义伪指令 ] DEFL SET( 由于 SET 是 SPMC65 的位操作指令, 所以当.SET 作为伪指令使用时, 前面的句点不能省略 ) [ 格式 ] label:.var value [ 说明 ] 利用.VAR 伪指令可以使标号 label 的值等于 value 利用.VAR 给某一标号赋值后, 可以再次利 用.VAR 为该标号 ( 仅适用于.VAR 赋值过的标号 ) 重新赋值 例如 : Lb1:.VAR 15 ;Lb1=15 Lb2:.VAR Lb1 ;Lb2=15 Lb1:.VAR 16 ;Lb1=16.VAR 伪指令与.DB.DS 等存储类伪指令的区别是,.DB 等存储类伪指令要有一段存储空间 (ROM 或 RAM) 作为载体, 存储类伪指令的标号代表了所存储数据的首地址 ; 而.VAR 仅仅是使标号具有一 个数值, 它不会占用 ROM 或 RAM 空间 2. EQU [ 功能 ] 为标号赋值 [ 同义伪指令 ] EQUAL [ 格式 ] label:.equ value [ 说明 ] 与.VAR 类似,.EQU 的作用也是为标号赋值 但不同的是.EQU 无法为已经定义过的标号重新 赋值 例如 : Lb1:.EQU 15 ;Lb1=15 Lb1:.EQU 16 ; 试图为 Lb1 重新赋值, 汇编时将出现错误 3. CODE [ 功能 ] 将.CODE 下的程序指令和数据定位到 代码段 Tel: mcu@sunplus.com.cn 53

60 凌阳 8 位通用单片机 [ 格式 ].CODE [ 说明 ] 代码段的所有程序指令和数据都将存放在 ROM 中 代码段的起始地址在工程文件夹下的 prog.lik 文件中定义 对于 SPMC65P2408A 单片机, 默认的代码段是地址为 $E000~$FFF9 的 ROM 区域 例如 :.CODE Var1:.DB 12H Lb1: LDA #78H Var1 标号下的数据与 Lb1 标号下的指令都将被定位在 ROM 区 4. DATA [ 功能 ] 将.DATA 下的数据定位到 数据段 [ 格式 ].DATA [ 说明 ].DATA 下定义的所有数据都将存放在 RAM 中, 因此数据段可作为变量存储段使用 数据段的起始地址在工程文件夹下的 prog.lik 文件中定义 对于 SPMC65P2408A 单片机, 默认的数据段是地址为 $01A0~$01E0 的 RAM 区域 例如 :.DATA Var1:.DS 3 上述语句将为变量 Var1 在数据段分配 3 个字节的空间 5. PAGE0 [ 功能 ] 将.PAGE0 下的数据定位到 零页段 [ 格式 ].PAGE0 [ 说明 ] 在.PAGE0 下定义的数据会被定位到 SPMC65 寻址空间的第 0 页, 即 00h~FFh 的区域 事实上, 对于 SPMC65 系列单片机,PAGE0 是指地址在 $0060~$00FF 区间内的 RAM 空间 零页 RAM 空间也通常用于变量的存储 例如 :.PAGE0 Var1:.DS 1 变量 Var1 被分配了 1 个字节的零页 RAM 空间 ($0060~$00FF 区间内的某一地址 ) 来存储 6. ORG [ 功能 ] 为程序或数据指定一个 段偏移量 [ 同义伪指令 ] ORGIN [ 格式 ] 54 mcu@sunplus.com.cn Tel:

61 第 2 章 SPMC65 系列单片机指令系统.ORG value [ 说明 ].ORG 伪指令下的程序或数据被定位到由 value 指定的存储地址 value 是一个段的地址偏移量, 可以是标号也可以是数字 在链接时, 会将段的起始地址加上偏移量 value 作为这些程序或数据的重定位地址 例如 :.PAGE0.ORG 20H Var1:.DS 1.CODE.ORG 600H Var2:.DB 34H 变量 Var1 将被定位到 $80(.PAGE0 的起始地址 $60 加上偏移量 20h), 对于 SPMC65P2408A, 常量 Var2 将被定位到 $E600(.CODE 的起始地址 $E000 加上偏移量 600h) 7. PROC [ 功能 ] 定义一个过程 [ 格式 ] label:.proc [ 说明 ].PROC 作为一个过程的起始标志, 它应与过程结束标志.ENDP 成对使用 参见 ENDP 8. ENDP [ 功能 ] 结束一个过程的定义 [ 格式 ] [label:].endp [ 说明 ] 结束由.PROC 定义的过程 label 与.PROC 定义的过程名称相同, 也可省略 例如 : Lb1:.PROC LDA #56h STA 68h RTS.ENDP 9. STRUCT [ 功能 ] 定义一个结构 [ 格式 ] label:.struct [ 说明 ].STRUCT 用于定义一个结构, 它应与结束结构定义的伪指令.ENDST 成对使用 与 ANSI-C 类似, 汇编器可以把不同类型的数据组织在一个结构里, 为处理复杂的数据结构提供了便利 使用.STRUCT 创建的结构仅仅是定义出一个数据存储模板, 本身不会占用存储空间 例如 : Tel: mcu@sunplus.com.cn 55

62 凌阳 8 位通用单片机 MySt:.STRUCT T1:.DB 3 ; 成员 1 是字节型, 默认值为 3 T2:.DW 4 ; 成员 2 是字型, 默认值为 4.ENDST 定义了结构后, 可声明使用该结构的具体对象 ( 结构实体 ), 其一般形式如下 : 结构实体名 : 结构名 [ 结构成员表 ] 其中 [ 结构成员表 ] 用来存放结构变量中成员的值, 也可保留空的方括号 ([ ]), 使用结构的默认值 结构成员表中的各成员之间用逗号隔开 对于上例中定义的结构, 可以声明若干个结构实体 :.CODE St1: MySt [5,1F6h] ; 声明 MySt 型结构实体 St1, 并为两个成员赋初值 St2: MySt [ k, ] ; 为成员 T1 赋初值, 而成员 T2 使用默认初值 4 St3: MySt [ ] ;St3 的两个成员都使用默认初值 对于定位在 RAM 区的结构实体, 仅会占用相应长度的存储空间, 而不会对其赋初值 结构实体是不同数据类型的若干数据的集合, 在程序中不能做为一个整体来参加数据处理 参加 各种运算的应该是结构实体中各个成员项数据 结构成员项引用的一般形式为 : 成员名 例如 : LDA St2@T1 上述语句将把结构实体 St2 的成员 T2 中存储的字符 k 传送到累加器中 10. ENDST [ 功能 ] 结构定义结束标志 [ 格式 ] [label:].endst [ 说明 ] 结束由.STRUCT 定义的结构 label 与.STRUCT 定义的结构名称相同, 也可省略 参见.STRUCT 伪指令 11. MACRO [ 功能 ] 定义一个宏 [ 格式 ] label:.macro args [ 说明 ] 本伪指令用来定义一个宏 宏 是指在源程序里将一系列的源代码行用一个简单的宏名 (label) 所取代, 当在某一行源程序中调用宏时, 该宏的所有代码便会映射到此行, 作为一段源程序被执行 宏必须以伪指令.MACRO 作为起始, 在结尾处以.ENDM 或.MACEND 结束 宏定义可以包含参数 (args), 参数可以是标号 寄存器 立即数等, 多个参数之间要用逗号分隔, 本身包含逗号的参数要外加大括号 { } 例如 : Math_Add: LDA.MACRO var1, var2, sum var1 56 mcu@sunplus.com.cn Tel:

63 第 2 章 SPMC65 系列单片机指令系统 CLC ADC STA var2 sum.endm 上述代码定义了一个名为 Math_Add 的宏 定义了宏之后, 可以在程序中对宏进行调用 : Math_Add #5,{S_Table, X},S1 上述宏调用相当于产生如下代码 : LDA #5 ; 参数 1( 立即数 ) CLC ADC S_Table, X ; 参数 2( 带有逗号 ) STA S1 ; 参数 3( 标号 ) 在宏里可以定义显式标号 ( 由用户定义 ), 也可以定义隐含标号 ( 由汇编器自动定义 ) 汇编器不 会改变用户定义的显示标号, 当程序多次调用该宏时, 会在程序体中出现重复的标号, 导致汇编出错 例如下面这个名为 M_IsOdd 的宏定义 : M_IsOdd: LDA.MACRO var1 var1 AND #01h BNE Odd Even: LDA #0 JMP Out Odd: LDA #1 Out:.ENDM 若在程序中两次调用该宏 : M_IsOdd #3 M_IsOdd #4 宏被展开后将由于标号 Even Odd Out 被重复定义而出错 解决的方法是使用隐含标号, 即在标号后加一个井号 (#) 作为后缀, 汇编器会自动将 # 替换为一个后缀数字符号 _x_xxxx(x 代表一位数字 ) 因此,M_IsOdd 宏可修改为 : M_IsOdd: LDA.MACRO var1 var1 AND #01h BNE Odd# Even#: LDA #0 Tel: mcu@sunplus.com.cn 57

64 凌阳 8 位通用单片机 JMP Out# Odd#: LDA #1 Out#:.ENDM 此外, 在宏定义中还可以使用字符串连接操作符 ( ) 与数字连接操作符 (< 数字 >), 例如 : Mac1.MACRO arg value:.var value+1 arg <value>:.equ value.endm 对该宏的调用语句 : value:.var 0 Mac1 Mac1 Label Label 宏调用语句被展开后将得到这样的结果 : Label1:.EQU 1 Label2:.EQU ENDM [ 功能 ] 宏定义结束 [ 同义伪指令 ] MACEND [ 格式 ].ENDM [ 说明 ] 结束由.MACRO 定义的宏 参见.STRUCT 伪指令 条件类伪指令 1. IF [ 功能 ] 当条件为真时进行汇编 [ 同义伪指令 ] IFNZ IFNFALSE IFN IFTRUE [ 格式 ].IF value [ 说明 ] 当 value 的值不为 0 时 ( 条件为真 ), 汇编器将对.IF 下的语句进行汇编 value 可以是数值 标号或算术表达式.IF 应与条件结束伪指令.ENDIF 成对使用, 多组.IF 与.ENDIF 也可嵌套使用 下面是一个两层.IF 嵌套的示例 : Lb1:.VAR 3 ;Lb1=3.IF Lb1 ; 如果 Lb1 不为 0 Lb1:.VAR Lb1 1 ;Lb1=Lb1-1( 即 Lb1=2).IF Lb1 ; 如果 Lb1 仍不为 mcu@sunplus.com.cn Tel:

65 第 2 章 SPMC65 系列单片机指令系统 Lb1:.VAR Lb1 1 ;Lb1=Lb1-1( 即 Lb1=1).ENDIF.ENDIF.CODE LDA #Lb1 ; 相当于 LDA #1 2. IFZ [ 功能 ] 当条件为假时进行汇编 [ 同义伪指令 ] IFFALSE IFE IFNTRUE [ 格式 ].IFZ value [ 说明 ] 当 value 的值为 0 时 ( 条件为假 ), 汇编器将对.IFZ 下的语句进行汇编 value 可以是数值 标 号或算术表达式 与.IFZ 对应的条件结束伪指令仍然是.ENDIF 的与.IF 类似,.IFZ 也可嵌套使用, 而且.IF 与.IFZ 可相互嵌套 例如 : Lb1:.VAR 3 ;Lb1=3.IF Lb1 ; 如果 Lb1 不为 0 Lb1:.VAR Lb1 3 ;Lb1=Lb1-3( 即 Lb1=0).IFZ Lb1 ; 如果 Lb1 为 0 Lb1:.VAR Lb1 + 1 ;Lb1=Lb1+1( 即 Lb1=1).IFZ Lb1 1 ; 如果 Lb1-1 不为 0 Lb1:.VAR 2 ;Lb1=2.ENDIF.ENDIF.ENDIF.CODE LDA #Lb1 ; 相当于 LDA #2 3. IFDEF [ 功能 ] 如果标号已经被定义过, 则进行汇编 [ 格式 ].IFDEF label [ 说明 ] 如果标号 label 已经被定义过, 汇编器将对.IFDEF 下的语句进行汇编 与.IFDEF 对应的条件结 束伪指令是.ENDIF 例如 : Lb1:.VAR 3 ; 定义标号 Lb1.IFDEF Lb2 ; 如果定义过标号 Lb2 Lb3:.VAR 4 ; 由于 Lb2 没被定义, 此句被汇编器忽略.ENDIF Tel: mcu@sunplus.com.cn 59

66 凌阳 8 位通用单片机.IFDEF Lb1 ; 如果定义过标号 Lb1 Lb2:.VAR 0 ; 定义标号 Lb2.IFDEF Lb2 ; 如果定义过标号 Lb2 Lb3:.VAR 5 ; 由于 Lb2 已被定义过, 条件成立,Lb3=5.ENDIF.ENDIF.CODE LDA #Lb3 ; 相当于 LDA #5 如果将上述示例的第一行 Lb1:.VAR 3 改为 Lb2:.VAR 3, 那么第三行变为有效, 最 后 LDA #Lb3 则相当于 LDA #4 4. IFNDEF [ 功能 ] 如果标号没有被定义过, 则进行汇编 [ 格式 ].IFNDEF label [ 说明 ] 如果标号 label 还没有被定义过, 汇编器将对.IFNDEF 下的语句进行汇编 其效果与.IFDEF 伪指令相反 例如 : Lb1:.VAR 3 ; 定义标号 Lb1.IFNDEF Lb2 ; 如果没有定义过标号 Lb2 Lb1:.VAR 4 ;Lb1=4.ENDIF.CODE LDA #Lb1 ; 相当于 LDA #4 5. ELSE [ 功能 ] 引出条件汇编结果为假时所要汇编的程序指令 [ 格式 ].ELSE [ 说明 ] 若本伪指令前面的条件伪指令 ( 如.IF.IFDEF 等 ) 中的条件不成立, 则可以用.ELSE 引出另 一部分汇编程序指令 本伪指令必须与.IF 或.IF*( 如.IFDEF.IFZ 等 ) 条件伪指令结合使用 例如 : Lb1:.VAR 3 ; 定义标号 Lb1.IFDEF Lb1 ; 如果已定义 Lb1.IFZ Lb1 ; 如果 Lb1 为 0 Lb2:.VAR 0 ;Lb2=0.ELSE ; 如果 Lb1 不为 0 Lb2:.VAR 1 ;Lb2=1.ENDIF.ELSE ; 如果未定义 Lb1 60 mcu@sunplus.com.cn Tel:

67 第 2 章 SPMC65 系列单片机指令系统 Lb2:.VAR 2 ;Lb2=2.ENDIF.CODE LDA #Lb2 ; 相当于 LDA #1 6. ENDIF [ 功能 ] 用来结束条件汇编组合的定义 [ 同义伪指令 ] ENDC [ 格式 ].ENDIF [ 说明 ] 本伪指令用来结束条件汇编组合定义, 它必须与 IF 或 IF*( 如.IFDEF.IFZ 等 ) 条件伪指令结 合使用 汇编链接类伪指令 1. PUBLIC [ 功能 ] 将标号声明为公有属性, 使其可以被其他文件中的程序引用 [ 同义伪指令 ] GLOBAL XDEF [ 格式 ].PUBLIC label [,label][, ] [ 说明 ].PUBLIC 将每个 label 声明为公有标号, 这些标号可以在其他文件中被程序引用 注意, 利用.VAR 伪指令定义的标号不能声明为公有标号 多个标号间要用逗号隔开 参见.EXTERN 伪指令 例如 :.PUBLIC Lb1, Lb2 ; 将 Lb1 和 Lb2 声明为公有标号 2. EXTERN [ 功能 ] 声明引用其他文件中已经定义过的公有标号 [ 同义伪指令 ] EXTERNAL XREF [ 格式 ].EXTERN label [,label][, ] [ 说明 ] 对于其他文件中声明的公有标号, 可利用.EXTERN 引用到当前文件中 label 是在其他文件中 定义过, 且已经被声明为公有的标号 经.EXTERN 声明后, 这些标号就可以在当前文件中引用了 注意, 汇编器不支持两个或两个以上外部标号之间的算术或逻辑运算 多个标号之间要用逗号隔开 例如 : [File1.asm].PUBLIC Lb1, Lb2 ; 将标号 Lb1 和 Lb2 声明为公有标号 Lb1:.EQU 3 ;Lb1=3 Lb2:.EQU 4 ;Lb2=4 [File2.asm].EXTERN Lb1, Lb2 ; 声明在 File1.asm 中定义的两个全局标号 Lb3:.EQU 5 ;Lb3=5 Tel: mcu@sunplus.com.cn 61

68 凌阳 8 位通用单片机 Lb4:.EQU Lb2 ;Lb4=Lb2=4 Lb5:.EQU Lb3 + Lb4 ;Lb5=5+4=9 Lb6:.EQU Lb1 + Lb4 ; 由于 Lb1 和 Lb4 都涉及到外部标号, 相当于有两个外 ; 部标号参与了算术运算, 因此汇编器将提示本行出错 3. INCLUDE [ 功能 ] 将其他文件包含到当前位置 [ 格式 ].INCLUDE.INCLUDE filename filename [ 说明 ] 该伪指令将指定的文件内容包含到当前文件的当前位置 filename 可以是相对路径, 也可以是 绝对路径 当 filename 使用长文件名格式 ( 例如文件路径中含有空格 ) 时,filename 外必须加上双引 号 例如 :.INCLUDE file1.asm ; 包含与当前文件同路径的文件.INCLUDE..\src\files\file1.inc ; 使用相对路径.INCLUDE c:\my Documents\file1.inc ; 包含路径为长格式的文件 4. END [ 功能 ] 定义程序的结束位置 [ 格式 ].END [ 说明 ] 使用.END 可以强行结束一个程序文件, 使汇编器忽略该文件中.END 下面的内容 对于被包含 文件,.END 作用范围仅限于被包含文件本身 例如 : [file1.inc] Lb1:.VAR 3 ;Lb1=1.END ; 强行结束 file1.inc Lb1:.VAR 4 ; 此句将被忽略 [file2.asm].include file1.inc ; 包含 file1.inc 文件的内容 Lb3:.VAR Lb1 ;Lb3=3 从上面的例子可以看出,file1.inc 中的.END 伪指令使汇编器忽略了.END 下面的内容, 但是尽管 file2.asm 将 file1.inc 包含进来,file1.inc 中的.END 不能使 file2.asm 强行结束 2.5 常用程序实例 二进制无符号数 16 位与 16 位的加法运算 程序 : 程序流程图见图 2.15 所示 : 62 mcu@sunplus.com.cn Tel:

69 第 2 章 SPMC65 系列单片机指令系统 开始 和的最高位清零 加数与被加数低 8 位相加, 结果送入和的低 8 位 加数与被加数高 8 位带进位相加, 结果送入和的中间 8 位 是否进位? N Y 和的高 8 位中送 #$1 返回 图 2.15 二进制无符号数 16 位与 16 位加法程序流程图 函数原型 F_Bin16Add16 功能描述 二进制无符号数 16 位与 16 位的加法运算, 和为 24 位 入口参数 GB_BinAugendAddr bit 被加数的地址 GB_BinAddendAddr bit 加数的地址 GB_BinSumAddr bit 和的地址 出口参数 GB_BinSumAddr bit 和的地址.PUBLIC F_Bin16Add16 F_Bin16Add16: ldx #2 ;2 字节相加 ldy #2 lda #0 sta (GB_BinSumAddr),y ; 清除和的高 8 位 ldy #0 clc?l_add_loop: lda adc (GB_BinAugendAddr),y (GB_BinAddendAddr),y Tel: mcu@sunplus.com.cn 63

70 凌阳 8 位通用单片机 sta (GB_BinSumAddr),y iny dex ; 两个字节是否加完? bne?l_add_loop ; 没有, 返回 bcc?l_add_end ; 没有进位, 直接跳出 lda #1 sta (GB_BinSumAddr),y?L_Add_End: rts 二进制无符号数 16 位与 16 位的减法运算 程序 : 程序流程图见图 2.16 所示 : 开始 低 8 位相减, 结果送入差的低 8 位 高 8 位带借位相减, 结果送入差的高 8 位 结果为负数? N Y Z 置 1 Z 置 0 返回 图 2.16 二进制无符号数 16 位与 16 位的减法程序流程图 函数原型 F_Bin16Sub16 功能描述 二进制无符号数 16 位与 16 位的减法运算, 差为 16 位 入口参数 GB_BinMinuendAddr bit 被减数的地址 GB_BinSubtrahendAddr bit 减数的地址 GB_BinSubAddr bit 差的地址 出口参数 GB_BinSubAddr bit 差的地址 Z Z =0, 结果为正数 ; Z =1, 结果为负数 64 mcu@sunplus.com.cn Tel:

71 第 2 章 SPMC65 系列单片机指令系统.PUBLIC F_Bin16Sub16 F_Bin16Sub16: ldx #2 ;2 字节相减 ldy #0 sec?l_sub_loop: lda sbc sta (GB_BinMinuendAddr),y (GB_BinSubtrahendAddr),y (GB_BinSubAddr),y iny dex ; 两个字节的数是否相减完? bne?l_sub_loop ; 否则跳转 bcc?l_sub_end ; 有借位 (C=0), 则 Z=1, 跳转 lda #$FF ; 无借位则 Z=0?L_Sub_End: rts 二进制无符号数 8 位与 8 位的乘法运算 函数设计方法 : 模拟手动乘法, 其计算方法如下图 2.17, 乘数一共右移八次, 每移出一位, 被乘数同时也左移一位 ( 第 一次除外 ), 并且进行一次判断, 若乘数移出位为 1, 进行一次相加 例如 #95h 乘以 #CDh, 乘积为 #7751h 其流程图如图 2.18 所示 第一次右移第三次右移第四次右移第七次右移第八次右移相加后乘积为 (#7751h) 图 2.17 二进制无符号数 8 位与 8 位的乘法运算式 Tel: mcu@sunplus.com.cn 65

72 凌阳 8 位通用单片机 开始 存放乘积的变量清 0 设置循环次数为 8 乘数右移一位 移出位为 1? N Y 被乘数与乘积相加 被乘数左移一位 循环次数减 1 N 循环次数 =0? Y 返回 图 2.18 二进制无符号数 8 位与 8 位的乘法程序流程图 函数原型 F_Bin8Mul8 功能描述 二进制无符号数 8 位与 8 位的乘法运算 入口参数 X 二进制被乘数 Y 二进制乘数 出口参数 X 二进制乘积的高 8 位 Y 二进制乘积的低 8 位注 : 以下程序中 IB_BinMultor IB_BinMul IB_BinMulnd IB_BinMulndH 都是定义的变量 66 mcu@sunplus.com.cn Tel:

73 第 2 章 SPMC65 系列单片机指令系统.PUBLIC F_Bin8Mul8 F_Bin8Mul8: stx IB_BinMulnd ; 被乘数存入 IB_BinMulnd sty IB_BinMultor ; 乘数存入 IB_BinMultor ldx #0 stx IB_BinMulndH ; 保存被乘数移位产生的高 8 位变量清零 stx IB_BinMul ; 乘积高 8 位清零 ldy #0 ; 乘积低 8 位清零 ldx #08 ; 循环次数?L_Hex_Loop: ror IB_BinMultor ; 乘数右移一位 bcc?l_noadd ;c=0, 跳转 clc tya ; 乘积的低 8 位 adc IB_BinMulnd tay lda IB_BinMul ; 乘积的高 8 位 adc sta IB_BinMulndH IB_BinMul?L_NoAdd: asl IB_BinMulnd ; 被乘数左移一位 rol IB_BinMulndH?L_Hex_Con_Loop: dex ; 循环是否结束 bne?l_hex_loop ; 否 ldx IB_BinMul ; 载入乘积高 8 位到 x 寄存器?L_Mul_88: rts 二进制无符号数 8 位与 8 位的除法运算 函数设计方法 : 模拟手动除法, 即 : 被除数从最高位开始不断的向余数 ( 初始值为 0) 的最低位移入, 余数也不断的 向左移动, 每移一位, 余数与除数比较一次, 大于或等于除数时, 余数减去除数, 差存在余数中, 同时商 加一, 然后商向左移动一位, 最低位补 0, 若余数小于除数, 则商直接向左移动一位, 最低位补 0 此时, 一个循环结束, 共有 8 个循环, 最后一个循环商不左移一位 其流程如图 2.20 所示 例如 (#F7h) 除以 (#19h), 商为 (#09h), 余数为 (#16h), 计算方法如图 2.19 所示 : Tel: mcu@sunplus.com.cn 67

74 凌阳 8 位通用单片机 第一次循环 第二次循环 第三次循环 第四次循环 第五次循环 第六次循环 第七次循环 第八次循环 除数 商 被除数 余数 图 2.19 二进制无符号数 8 位与 8 位除法运算式 开始 Y 除数为 0 吗? N 商和余数清 0 Z 置 1 被除数左移一位到余数中 余数大于等于除数? N Y 余数 = 余数减去除数 商加 1 左移次数等于 8? Y N 商左移一位, 最低位补 0 Z 置 0 返回 图 2.20 二进制无符号数 8 位与 8 位除法程序流程图 68 mcu@sunplus.com.cn Tel:

75 第 2 章 SPMC65 系列单片机指令系统 函数原型 F_Bin8Div8 功能描述 二进制无符号数 8 位与 8 位的除法运算 入口参数 X 被除数 Y 除数 出口参数 X 商 Y 余数 Z 出错标志, Z 值为 1, 结果出错 ; Z 值为 0, 结果正确注 : 以下程序中 IB_BinDividend IB_BinDividendH IB_BinDivisor 都是定义的变量.PUBLIC F_Bin8Div8 F_Bin8Div8: cpy #0 ; 除数 =0? beq?l_div_end ; 是则跳转 stx IB_BinDividend ; 被除数载入 x 寄存器 ldx #0 stx IB_BinDividendH ;IB_BinDividendH 将用于保存余数 sty IB_BinDivisor ; 除数载入 y 寄存器 ldy #8 ; 被除数移位次数?L_Shift_Div: rol IB_BinDividend rol IB_BinDividendH ; 被除数移一位到余数中 lda IB_BinDividendH cmp IB_BinDivisor ; 余数 > 除数? bcc?l_div_nextbit ; 否则跳转?L_Result1: inx ; 商加 1 sec lda IB_BinDividendH sbc IB_BinDivisor ; 余数 除数 sta IB_BinDividendH?L_Div_NextBit: dey ; 移位上否结束? beq?l_div_exit ; 是则跳转退出 txa asl a tax jmp?l_shift_div ; 再进入循环?L_Div_Exit: lda IB_BinDividendH ; 取出余数 tay Tel: mcu@sunplus.com.cn 69

76 凌阳 8 位通用单片机 lda #$FF ;z=0, 结果是正确的?L_Div_End: rts 70 mcu@sunplus.com.cn Tel:

77 第 3 章 I/O 端口原理及应用 第 3 章 I/O 端口原理及应用 3.1 I/O 端口概述 SPMC65 系列单片机最多有 6 组 8 位并行端口 : 端口 A 端口 B 端口 C 端口 D 端口 E 和端口 F SPMC65 系列单片机 I/O 端口具有 4mA 的推电流能力 (driving) 及 10mA 的灌电流 (sinking) 能力, 其中有两个 I/O 端口的灌电流能力可达 20mA 详细情况见表 3.1 和表 3.2: 表 3.1 端口 A 的直流特性 (VDD=5.0V) PIN 输入等效上拉 / 下拉电阻 输入 输出推电流 / 灌电流 PA7 100K 上拉 / 下拉 施密特触发器 4/10mA PA6 100K 上拉 / 下拉 施密特触发器 4/10mA PA5 100K 上拉 / 下拉 施密特触发器 4/10mA PA4 100K 上拉 / 下拉 施密特触发器 4/10mA PA3 100K 上拉 / 下拉 施密特触发器 4/10mA PA2 100K 上拉 / 下拉 施密特触发器 4/10mA PA1 100K 上拉 / 下拉 施密特触发器 4/10mA PA0 100K 上拉 / 下拉 施密特触发器 4/10mA 表 3.2 端口 B 的直流特性 (VDD=5.0V) PIN 输入等效上拉 / 下拉电阻 输入 输出推电流 / 灌电流 PB7 100K 上拉 / 下拉 施密特触发器 4/20mA PB6 100K 上拉 / 下拉 施密特触发器 4/20mA PB5 100K 上拉 / 下拉 施密特触发器 4/10mA PB4 100K 上拉 / 下拉 施密特触发器 4/10mA PB3 100K 上拉 / 下拉 施密特触发器 4/10mA PB2 100K 上拉 / 下拉 施密特触发器 4/10mA PB1 100K 上拉 / 下拉 施密特触发器 4/10mA PB0 100K 上拉 / 下拉 施密特触发器 4/10mA 端口 C 端口 D 端口 E 端口 F 的驱动能力及输入方式与端口 A 的一样 Tel: mcu@sunplus.com.cn 71

78 凌阳 8 位通用单片机 3.2 I/O 端口结构 SPMC65 系列单片机的每一位 I/O 端口都可独立地设置为输入或输出状态, 并且每个端口都内置有弱上拉 弱下拉电阻, 可以通过寄存器设置为上拉或下拉输入状态, 也可设置为悬浮输入状态 SPMC65 系列单片机的 I/O 端口结构如图 3.1 所示 : P_IOX _Buf( 读 ) P_IOX_Buf( 写 ) P_IOX_Data( 写 ) 数据寄存器 上拉 I/O 引脚 P_IOX_Dir( 读 / 写 ) 控制逻辑 下拉 P_IOX_Attrib( 读 / 写 ) P_IOX_Data( 读 ) 图 3.1 I/O 结构 读 P_IOX_Data(X=A~F) 寄存器将得到管脚的电平状态, 向 P_IOX_Data 写入数据, 会存入数据寄存器中 P_IOX_Data 单元和 P_IOX_Buf 单元的区别 : 对输出而言两者没有区别, 但对输入而言, 读 P_IOX_Data 单元读的是当前 I/O 的电平值, 读 P_IOX_Buf 单元是读的是上次写入的数据 3.3 I/O 端口寄存器 IO 端口的设置 SPMC65 系列单片机的 I/O 控制寄存器分别为 : 数据寄存器 P_IOX_Data 方向寄存器 P_IOX_Dir 属性寄存器 P_IOX_Attrib 和数据锁存寄存器 P_IOX_Buf(X=A~F) 通常, 对某一个 I/O 端口的设置包括以下 3 个基本项 : 数据寄存器 Data 属性寄存器 Attribution 和方向控制寄存器 Direction 其具体作用如下 : 方向控制寄存器 P_IOX_Dir 将管脚设置为输入或输出 属性寄存器 P_IOX_Attrib 将管脚设置为悬浮或不悬浮 当管脚作为输入时, 数据寄存器 P_IOX_Data 将其设置为上拉或下拉 ; 当管脚作为输出时, 写入数值到数据寄存器 Data 里, 便可在端口输出相应的的电平 I/O 端口的组合控制设置如表 3.3 所列 72 mcu@sunplus.com.cn Tel:

79 第 3 章 I/O 端口原理及应用 表 3.3 I/O 端口的组合控制设置 方向寄存器 属性寄存器 数据寄存器 功能 描述 P_IOX_Dir P_IOX_Attrib P_IOX_Data 下拉输入 带下拉电阻的输入管脚 上拉输入 带上拉电阻的输入管脚 输出状态 ( 高电平 ) 输出高电平 输出状态 ( 低电平 ) 输出低电平 悬浮输入 悬浮输入管脚 其它 保留 IO 口的默认状态需要设置芯片配置选项, 具体设置方法请参考第十章中的介绍 (X=A~F) 端口 A 端口 A 的控制寄存器为 : 数据寄存器 P_IOA_Data 方向寄存器 P_IOA_Dir 属性寄存器 P_IOA_Attrib 和数据锁存寄存器 P_IOA_Buf 1. P_IOA_Data($00,R/W) A 口的数据寄存器, 用于向 A 口写入或从 A 口读出数据 当 A 口处于输入状态时, 读 P_IOA_Data 寄存器将得到管脚的电平状态, 向 P_IOA_Data 写入数据, 其值将会存入数据锁存器 (P_IOA_Buf) 中 当 A 口处于输出状态时, 写数据到 A 口的数据寄存器会存入数据锁存器 (P_IOA_Buf), 同时在管脚输出相对应电平状态 ; 读 P_IOA_Data 寄存器也将得到管脚的电平状态 P_IOA_Data 数据寄存器单元的默认初值为 #00h 端口 A 数据寄存器 P_IOA_Data 的设置见表 3.4 表 3.4 端口 A 数据寄存器 P_IOA_Data($00,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 P_IOA_Data R/W Bit [7:0] P_IOA_Data: 端口 A 数据寄存器读 : 读取端口 A 外部管脚上的电平状态值写 : 写入数据到端口 A 的数据锁存器中 ($59) 2. P_IOA_Buf($59,R/W) A 口的数据锁存寄存器,P_IOA_Buf 是一个专门用于存储端口数据的寄存器, 并用来对端口各管脚进行位操作, 而不直接用 P_IOA_Data 寄存器来操作 而读取 P_IOA_Buf 的值则可得到上次写入寄存器 P_IOA_Data 或 P_IOA_Buf 的值 端口 A 数据锁存器 P_IOA_Buf 的默认初值为 #00h 端口 A 数据锁存器 P_IOA_Buf 的设置见表 3.5 Tel: mcu@sunplus.com.cn 73

80 凌阳 8 位通用单片机 表 3.5 端口 A 数据锁存器 P_IOA_Buf($59,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 P_IOA_Buf R/W 3. P_IOA_Dir($04,R/W) A 口的方向寄存器, 用来设置 A 口是输入 / 输出状态 该方向控制寄存器可以写入或从该寄存器内读出方向控制向量 方向寄存器的每一个位决定了对应口位的输入 / 输出状态 :0 为输入,1 为输出 P_IOA_Dir 方向寄存器单元的默认初值为 #00h 端口 A 方向寄存器 P_IOA_Dir 的设置见表 3.6: 表 3.6 端口 A 方向寄存器 P_IOA_Dir($04,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 P_IOA_Dir R/W Bit [7:0] P_IOA_Dir: 端口 A 方向寄存器 0 = 输入 1 = 输出 4. P_IOA_Attrib($08,R/W) A 口的属性寄存器, 用于 A 口属性的设置 端口 A 属性寄存器 P_IOA_Attrib 的设置见表 3.7: 表 3.7 端口 A 属性寄存器 P_IOA_Attrib($08,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 P_IOA_Attrib R/W Bit [7:0] P_IOA_Attrib: 端口 A 属性寄存器 0 = 不悬浮 1 = 悬浮输入 例 4-1 : 将端口 A[7:0] 设置为输出状态, 并输出数据 : lda #00h ; 将 #00h 写入累加器 sta P_IOA_Attrib ; 设置端口 A 的属性 lda #FFh ; 将 #FFh 写入累加器 sta P_IOA_Dir ; 将累加器值送入 P_IOA_Dir 寄存器中,IOA 端口为输出状态 lda #00h sta P_IOA_Data ; 设置端口 A 的数据,PA8~0 输出低电平 对应的口位的设置见表 3.8: 74 mcu@sunplus.com.cn Tel:

81 第 3 章 I/O 端口原理及应用 表 3.8 I/O 口位设置 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Dir Attrib Data 状态 低电平输出 例 4-2 : 将端口 A[7:0] 设置为下拉输入 : lda #00h ; 将 #00h 写入累加器 sta P_IOA_Dir ; 将累加器值送入 P_IOA_Dir 寄存器中 sta P_IOA_Attrib ; 设置端口 A 的属性 sta P_IOA_Data ; 设置端口 A 的数据 对应的口位的设置见表 3.9 表 3.9 I/O 口位设置 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Dir Attrib Data 状态 下拉电阻输入 端口 B 端口 B 的控制寄存器为 : 数据寄存器 P_IOB_Data 方向寄存器 P_IOB_Dir 属性寄存器 P_IOB_Attrib 和数据锁存寄存器 P_IOB_Buf 端口 B 数据寄存器 P_IOB_Data($01,R/W); 端口 B 方向寄存器 P_IOB_Dir($05,R/W); 端口 B 属性寄存器 P_IOB_Attrib($09,R/W); 端口 B 数据锁存器 P_IOB_Buf($5A,R/W) 端口 C 端口 C 的控制寄存器为 : 数据寄存器 P_IOC_Data 方向寄存器 P_IOC_Dir 属性寄存器 P_IOC_Attrib 和数据锁存寄存器 P_IOC_Buf 端口 C 数据寄存器 P_IOC_Data($02,R/W); 端口 C 方向寄存器 P_IOC_Dir($06,R/W); 端口 C 属性寄存器 P_IOC_Attrib($0A,R/W); 端口 C 数据锁存器 P_IOC_Buf($5B,R/W) 端口 D 端口 D 的控制寄存器为 : 数据寄存器 P_IOD_Data 方向寄存器 P_IOD_Dir 属性寄存器 P_IOD_Attrib Tel: mcu@sunplus.com.cn 75

82 凌阳 8 位通用单片机 和数据锁存寄存器 P_IOD_Buf 端口 D 数据寄存器 P_IOD_Data($03,R/W); 端口 D 方向寄存器 P_IOD_Dir($07,R/W); 端口 D 属性寄存器 P_IOD_Attrib($0B,R/W); 端口 D 数据锁存器 P_IOD_Buf($5C,R/W) 端口 E 端口 E 的控制寄存器为 : 数据寄存器 P_IOE_Data 方向寄存器 P_IOE_Dir 属性寄存器 P_IOE_Attrib 和数据锁存寄存器 P_IOE_Buf 端口 E 数据寄存器 P_IOE_Data($40,R/W); 端口 E 方向寄存器 P_IOE_Dir($42,R/W); 端口 E 属性寄存器 P_IOE_Attrib($44,R/W); 端口 E 数据锁存器 P_IOE_Buf($5D,R/W) 端口 F 端口 F 的控制寄存器为 : 数据寄存器 P_IOF_Data 方向寄存器 P_IOF_Dir 属性寄存器 P_IOF_Attrib 和数据锁存寄存器 P_IOF_Buf 端口 F 数据寄存器 P_IOF_Data($41,R/W); 端口 F 方向寄存器 P_IOF_Dir($43,R/W); 端口 F 属性寄存器 P_IOF_Attrib($45,R/W); 端口 F 数据锁存器 P_IOF_Buf($5E,R/W) 3.4 特殊功能 SPMC65 系列单片机的 I/O 端口除了具有一般的输入 / 输出功能外, 还提供了一些特殊功能或与片内硬件功能模块复用 ; 其中, 端口 F 没有特殊功能或复用功能 端口 A 特殊功能 : 端口 A 可以作为 A/D 转换的输入通道, 具体见表 3.11, 端口 A 的特殊功能详细见 A/D 部分 端口 B 特殊功能 : PB7 既可以作为 A/D 转换的输入通道, 也可以作为 A/D 转换的外部参考电压输入 ;PB6 可以驱动频率式蜂鸣器 ;PB[5:4] 可以作为 Timer 外部事件输入或中断输入管脚 ;PB[3:2] 可以作为比较输出或 PWM 输出管脚 ;PB[1:0] 可以为捕获输入或 Timer 外部事件输入管脚 SPMC65 系列单片机支持慢速输出功能,PB[7:6] 通常情况下作为普通 I/O 口, 但是如果将信号斜率控制寄存器 P_IO_Opt ($35) 的 bit0 设置为 1, 便会打开 PB[7:6] 的慢速输出功能 ; 此时当 PB[7:6] 输出从高电平变为低电平, 将会延迟 250ns 左右, 具体延迟时间由系统时钟 (F SYS ) 决定 当单片机在进行远距离通信时, 慢速输出功能可以防止电磁干扰 P_IO_Opt 寄存器见表 3.10 端口 B 的复用情况见表 mcu@sunplus.com.cn Tel:

83 第 3 章 I/O 端口原理及应用 表 3.10 慢速输出功能控制寄存器 P_IO_Opt($35,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit SLOWE R/W Bit [7:1] 保留 Bit 0 SLOWE: 慢速输出功能使能位 1=PB[7:6] 开启慢速输出功能 0=PB[7:6] 关闭慢速输出功能注 : 该寄存器必须连续写两次相同的值才能将值写入, 该寄存器默认初值为 #00h 端口 C 特殊功能 : PC[7:6] 可以用作 IIC 总线的复用端口 PC[5:4] 可用于 UART 通讯接口 PC[3:0] 用作 SPI 通讯接口 端口 C 各个管脚复用的特殊功能见表 端口 D 特殊功能 : PD[7:6] 可作为比较输出或 PWM 输出管脚 PD[5:4] 可作为外部中断输入或 Timer 外部事件输入管脚 PD[3:2] 可用于比较输出或 PWM 输出管脚 PD[1:0] 可用作外部中断输入管脚 端口 D 各个管脚复用的特殊功能见表 3.11, 详细描述见相应的章节 端口 E 特殊功能 : PE6 可以作为 D/A 转换的输出管脚,PE[5:2] 可以用于模拟电压比较器输入及比较参考电压输入 端口 E 各个管脚复用的特殊功能见表 3.11, 详细描述见相应的章节 表 3.11 端口特殊功能 管脚 特殊功能 管脚 特殊功能 PA7 ADC 模拟电压输入 PC3 SPI 数据输出 PA6 ADC 模拟电压输入 PC2 SPI 数据输入 PA5 ADC 模拟电压输入 PC1 SPI 时钟输出 / 时钟输入 PA4 ADC 模拟电压输入 PC0 SPI 片选 PA3 ADC 模拟电压输入 PD7 Timer 5 比较输出 /PWM 输出 PA2 ADC 模拟电压输入 PD6 Timer 4 比较输出 /PWM 输出 PA1 ADC 模拟电压输入 PD5 外部中断 5 输入 /Timer 5 的捕获输入 /Timer 5 的外部事件输入 PA0 ADC 模拟电压输入 PD4 外部中断 4 输入 /Timer 4 的捕获输入 /Timer 4 的外部事件输入 PB7 ADC 模拟电压输入或 A/D 外部参考电压输入 PD3 Timer 2 比较输出 /PWM 输出 PB6 蜂鸣器输出 PD2 Timer 3 比较输出 /PWM 输出 Tel: mcu@sunplus.com.cn 77

84 凌阳 8 位通用单片机 PB5 PB4 外部中断 1 输入 /Timer 3 的捕获输入 /Timer3 PD1 的外部事件输入外部中断 0 输入 /Timer 2 的捕获输入 /Timer2 PD0 的外部事件输入 外部中断 3 输入 外部中断 2 输入 PB3 Timer 1 比较输出 / PWM 输出 PE7 PB2 Timer 0 比较输出 /PWM 输出 PE6 D/A 输出 PB1 Timer 1 的捕获输入 /Timer 1 的外部事件输入 PE5 比较器 1 输入 PB0 Timer 0 的捕获输入 /Timer 0 的外部事件输入 PE4 比较器 1 参考输入 PC7 IIC 数据线 PE3 比较器 0 输入 PC6 IIC 时钟线 PE2 比较器 0 参考输入 PC5 UART 接收信号 PE1 PC4 UART 发送信号 PE0 SPMC65 系列单片机的端口在使用前一般都需要对端口进行初始化, 比如要使用端口 A 作为带下拉电 阻的输入口时, 就要在使用之前对端口进行初始化 ; 而对于端口的复用功能在使用前, 也有部分复用功能 需要先初始化 I/O 口状态, 比如需要用到外部中断输入的复用功能时, 就要事先把对应的 I/O 端口设置为 输入状态 ; 类似的还有捕获输入 串行通讯接口 而部分复用功能在使用前是无需初始 I/O 端口状态的, 如 ADC 输入 DAC 输出 电压比较器功能 蜂鸣器输出 PWM 输出 比较输出 具体的复用功能所需 要的端口初始化要求请参考后面章节的介绍 3.5 I/O 端口应用 例 4-3 : 采用 32 管脚的 SPMC65P2408A, 外接四个按键, 当按键按下或放开时, 相应的发光二极 管便会被熄灭或点亮用作指示 此例主要介绍 I/O 口的简单应用 程序如下 : 子函数 Switchx4.asm CB_CmpTimers EQU 6 ; 最大比较次数.PAGE0 GB_KeyValue DS 1 ; 键值 GB_KeyDownFlag DS 1 ; 键值改变标志 IB_LastValue DS 1 ; 最后一次的键值 IB_CmpTimers DS 1 ; 键值的平均比较次数.DATA.CODE.PUBLIC F_PAInit 78 mcu@sunplus.com.cn Tel:

85 第 3 章 I/O 端口原理及应用 F_PAInit: lda #0 sta P_IOA_Attrib lda #$F0 sta P_IOA_Dir sta P_IOA_Data rts ;===================================================.PUBLIC F_SWx4 F_SWx4: lda P_IOA_Data ; 扫描键盘 and #$0F ; 得到键盘值 cmp GB_KeyValue ; 键盘改变否 beq?l_swx4exit ; 没有改变 cmp IB_LastValue ; 和上次取得键值比较 beq?l_timersinc ; 相等? sta IB_LastValue jmp?l_cmpclr?l_timersinc: inc IB_CmpTimers ; lda IB_CmpTimers ; cmp #CB_CmpTimers ; 比较 6 次键值, 去抖采用 4ms 每次读取键盘值 bcc?l_swx4exit ; lda IB_LastValue ; sta GB_KeyValue ; lda #1 sta GB_KeyDownFlag ; 设置键值改变标志?L_CmpClr: lda #0 sta IB_CmpTimers?L_SWx4Exit: rts ;==================================================.PUBLIC F_Light: lda asl asl asl F_Light GB_KeyValue a a a ; 根据相应的键值, 点亮对应的数码管 Tel: mcu@sunplus.com.cn 79

86 凌阳 8 位通用单片机 asl eor sta rts a #$F0 P_IOA_Data 硬件原理如图 3.2 所示 : VDD LED3 1 2 R5 330 VDD LED2 1 2 LED1 1 2 LED0 1 2 R4 330 R3 330 R2 330 S3 S2 S1 S U1 PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0 PB7 PB6 PB5 PB4 PB3 PB2 VDD VSS XI XO RESET PD0 PD1 PD2 PD PD4 22 PC0 21 PC1 20 PC2 19 PC PB1 PC4 17 PB0 PC5 SPMC65P2408A-32P RESET Y1 C3 20p C M C4 20p RESET + C1 10u 1 2 VDD D C5 104 R1 4.7K S_R 图 3.2 键盘及 LED 原理图 例 4-4 : 本例采用 28 管脚的 SPMC65P2408A, 外接四个数码管作为显示部分 在程序中开辟了一 个四字节的连续空间作为显示缓冲区, 往这四个地址里分别写入数据 (0~F) 便可以通过外接数码管显示 出来 程序如下 : C_4MsOver EQU 1 ;4ms 中断标志.PAGE0 GB_ShowBuf DS 4 ; 定义一个 4 字节显示空间 GB_IndexCom DS 1 ; 控制 LED 顺序.DATA.CODE F_LED_4Disp: ldx GB_IndexCom inx ;LED 扫描 cpx #4 ;LED 扫描结束? bcs?l_clearx ; 结束 stx GB_IndexCom jmp?l_show?l_clearx: ldx #$ mcu@sunplus.com.cn Tel:

87 第 3 章 I/O 端口原理及应用 stx GB_IndexCom ; 从第一个 LED 开始显示?L_Show: lda #$00 sta P_IOA_Data ; 清屏 lda T_SevenComTable,x sta P_IOC_Data ; lda GB_ShowBuf,x ; 从缓冲区得到数据 tax lda T_SevenSegTable,x ; 得到段码 sta P_IOA_Data ; 将段码送到 A 口?L_Div_End: rts ;========================================================= F_IO_Init: lda #$00 ; sta P_IOA_Data ; sta P_IOA_Buf ; 初始化 A 口为低电平输出 sta P_IOA_Attrib lda #$FF sta P_IOA_Dir lda #0 sta P_IOC_Data sta P_IOC_Buf lda #0 ; 初始化 C 口为低电平输出 sta P_IOC_Attrib lda #$F sta P_IOC_Dir rts ;================================================================ F_DispBuf_Init: lda #$1 ; sta GB_ShowBuf ; lda #$2 ; sta GB_ShowBuf+1 ; 缓冲区初始化 lda #$3 ; sta GB_ShowBuf+2 ; lda #$4 ; sta GB_ShowBuf+3 ; rts Tel: mcu@sunplus.com.cn 81

88 凌阳 8 位通用单片机 ;=========================================================== T_SevenComTable: ; 位码 DB % ;LED '1' DB % ;LED '2' DB % ;LED '3' DB % ;LED '4' T_SevenSegTable: ; 段码 DB % ; 字符 '0' DB % ; 字符 '1' DB % ; 字符 '2' DB % ; 字符 '3' DB % ; 字符 '4' DB % ; 字符 '5' DB % ; 字符 '6' DB % ; 字符 '7' DB % ; 字符 '8' DB % ; 字符 '9' DB % ; 字符 'A' DB % ; 字符 'B' DB % ; 字符 'C' DB % ; 字符 'D' DB % ; 字符 'E' DB % ; 字符 'F' 硬件原理如图 3.3 所示 : 82 mcu@sunplus.com.cn Tel:

89 Tel: 第 3 章 I/O 端口原理及应用 83 SPMC65P2408A*28P PB7 PB6 PB1 PB0 PD3 PD1 PD0 RESET XO XI VSS VDD PC0 PC1 PC2 PC3 PB2 PB3 PB4 PB5 PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PA5 PA7 VDD 4.7K PC1 XI PA1 1K PA6 PA6 Q VSS PC2 PC2 PA0 a b c d e f g. LED1 a b c d e f g com dp 330 1K +5V VSS 16MHz a b c d e f g. LED3 a b c d e f g com dp PA7 PC1 330 PA5 PA2 330 XO PC3 XO 330 1K PA4 Q p PA4 PA1 Q V a b c d e f g. LED4 a b c d e f g com dp RESET 330 PA2 330 PC3 RESET VDD PA3 Q K PA3 20p a b c d e f g. LED2 a b c d e f g com dp XI PC0 PC0 PA0 图 3.3 LED 扫描原理图

90 凌阳 8 位通用单片机 第 4 章中断系统 4.1 SPMC65 系列单片机中断系统 SPMC65 系列单片机共有 7 种中断源 : 定时 / 计数器溢出中断 捕获中断 外部中断 模拟中断 (ADC 电压比较器 ) 通讯中断 看门狗中断和时基中断 各中断简述见表 4.1 每个中断都有各自的标志位和控制寄存器, 用于标志中断是否发生和设置中断的禁止 / 使能 具体参考相关章节 表 4.1 中断源列表 中断源 中断状态寄存器 中断控制寄存 器 中断源中断状态寄存器中断控制寄存器 Timer0 T0OIF ($0E.0) T0OIE ($0F.0) IRQ0 IRQ0IF ($0C.0) IRQ0IE ($0D.0) Timer1 T1OIF ($0E.1) T1OIE ($0F.1) IRQ1 IRQ1IF ($0C.1) IRQ1IE ($0D.1) 定时 / 计数器溢出中断 Timer2 T2OIF ($0E.2) T2OIE ($0F.2) IRQ2 IRQ2IF ($0C.2) IRQ2IE ($0D.2) 外部中断 Time3 T3OIF ($0E.3) T3OIE ($0F.3) IRQ3 IRQ3IF ($0C.3) IRQ3IE ($0D.3) Timer4 T4OIF ($0E.4) T4OIE ($0F.4) IRQ4 IRQ4IF ($0C.4) IRQ4IE ($0D.4) Timer5 T5OIF ($0E.5) T5OIE ($0F.5) IRQ5 IRQ5IF ($0C.5) IRQ5IE ($0D.5) Capture0 CAP0IF ($0E.6) CAP0IE ($0F.6) ADC ADIF ($0C.7) ADIE ($0D.7) Capture1 CAP1IF ($0E.7) CAP1IE ($0F.7) 模拟中断 Comparator0 CMP0IF ($26.0) CMP0IE ($27.0) Capture2 CAP2IF ($0C.0) CAP2IE ($0D.0) Comparator1 CMP1IF ($26.1) CMP1IE ($27.1) 捕获中断 Capture3 CAP3IF ($0C.1) CAP3IE ($0D.1) SPI SPIIF ($26.2) SPIIF ($3A.7) SPIIE ($3A.6) Capture4 CAP4IF ($0C.4) CAP4IE ($0D.4) 通讯中断 UART UARTIF ($26.3) RXIF ($48.7) TXIF ($48.6) RXIE ($46.7) TXIE ($46.6) Capture5 CAP5IF ($0C.5) CAP5IE ($0D.5) IIC IICIF($26.4) IICIF($4B.4) IICIE ($4A.4) 看门狗中断 WDIF ($0C.6) WDIE ($0D.6) 时基中断 ITVALIF ($26.5) ITVALIE ($27.5) 外部中断 INT0~5( 即 IRQ0~5) 共有 6 个通道, 输入引脚与通用 I/O 口引脚复用, 详细见表 mcu@sunplus.com.cn Tel:

91 第 4 章中断系统 表 4.2 外部中断与通用 I/O 复用表 管脚 PD5 特殊功能 外部中断 5 输入 / 捕获器 5 输入 定时 / 计数器 5 外部时钟输入 PD4 外部中断 4 输入 / 捕获器 4 输入 定时 / 计数器 4 外部时钟输入 PD1 PD0 PB5 外部中断 3 输入 外部中断 2 输入 外部中断 1/ 捕获器 3 输入 定时 / 计数器 3 外部时钟输入 PB4 外部中断 0/ 捕获器 2 输入 定时 / 计数器 2 外部时钟输入在 SPMC65 系列单片机中, 外部中断分为两种 : 非屏蔽中断 (NMI) 和可屏蔽中断 (IRQ) 每当 CPU 执行完一条指令, 微处理器会自动检查当时的中断状态 首先检查非屏蔽中断 NMI, 若该中断发生, 则立即做非屏蔽中断 NMI 的处理 若非屏蔽中断 NMI 中断没有发生, 并且状态寄存器 (P) 中的中断标志 (I) 为 0, 则微处理器接着检查可屏蔽中断请求 IRQ 非屏蔽中断 NMI 和可屏蔽中断 IRQ 有几点区别需要注意 : 1. 非屏蔽中断 NMI 优先级高于可屏蔽中断 IRQ, 并且不论状态寄存器 (P) 的中断标志 (I) 的内容值如何,CPU 均会接受 NMI 中断 ; 可屏蔽中断只有在状态寄存器 (P) 的中断标志 (I) 为 0 时才会被接受 2. 非屏蔽中断 NMI 只有上升沿 / 下降沿触发, 没有电平触发 ; 可屏蔽中断 IRQ 可以设置为上升沿 / 下降沿触发, 也可以设置为高 / 低电平触发 3. 非屏蔽中断 NMI 只能选择其中的一个中断作为非屏蔽中断使用, 不能同时使用两个或两个以上 ; 可屏蔽中断 IRQ 无此限制, 可以同时使用多个 当外部中断被设置为沿触发模式时, 一个有效的边沿输入便会触发中断 如果设置为电平触发, 一个持续有效的电平会令中断产生, 直到该电平被去掉 非屏蔽中断的设置需要在芯片配置选项中设置, 具体参考第十章中的介绍 P_IRQ_Opt1 P_IRQ_Opt0 是中断的触发方式选择寄存器, 可以将外部中断设置为上升沿触发, 也可以设置为下降沿的触发 为了提高抗干扰性, 设置这两个寄存器时需要连续写两次才能将内容写进去 定时 / 计数器溢出中断 时基中断 看门狗中断 模拟中断 (ADC) 捕获中断 比较中断和通讯中断在后续章节都有详细描述 4.2 中断控制寄存器 P_INT_Ctrl0($0D,R/W) P_INT_Ctrl0 控制寄存器具有可读和可写的属性, 其读写时的意义是不同的 其各位如表 4.3 所列 Tel: mcu@sunplus.com.cn 85

92 凌阳 8 位通用单片机 P_INT_Ctrl0 控制寄存器的默认初始值为 #00h 表 4.3 控制寄存器单元 P_INT_Ctrl0($0D,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 ADIE WDIE IRQ5E/ CAP5E IRQ4E/ CAP4E IRQ3IE IRQ2IE IRQ1IE/ CAP3IE IRQ0IE/ CAP2IE R/W R/W R/W R/W R/W R/W R/W R/W Bit 7 ADIE:AD 转换中断使能位 0 = 禁止 1 = 使能 Bit 6 WDIE: 看门狗中断使能位 0 = 禁止 1 = 使能 Bit 5 IRQ5IE/CAP5IE:IRQ5/CAP5 使能位 0 = 禁止 1 = 使能 Bit 4 IRQ4IE/CAP4IE:IRQ4/CAP4 使能位 0 = 禁止 1 = 使能 Bit 3 IRQ3IE:IRQ3 使能位 0 = 禁止 1 = 使能 Bit 2 IRQ2IE:IRQ2 使能位 0 = 禁止 1 = 使能 Bit 1 IRQ1IE/ CAP3IE:IRQ1/CAP3 使能位 0 = 禁止 1 = 使能 Bit 0 IRQ0IE/ CAP2IE:IRQ0/CAP2 使能位 0 = 禁止 1 = 使能注 : 1. IRQ5 IRQ4 分别和 CAP5 CAP4 共用中断控制位 2. IRQ1 IRQ0 分别和 CAP3 CAP2 共用中断控制位 3. IRQx(x=0~5) 为外部中断 x,capx(x=0~5) 为捕获器 x 当写中断控制寄存器 P_INT_Ctrl0 的某位为 1 时, 即允许该位所代表的中断被开放, 此时当有中断申 86 mcu@sunplus.com.cn Tel:

93 第 4 章中断系统 请时,CPU 会响应 如果该位被置 0 则禁止该位所代表的中断 即使有中断申请,CPU 也不会响应 当读取中断控制寄存器单元时,P_INT_Ctrl0 寄存器的每一位均代表一个中断 可以通过读取该位确 定中断是否使能 例如下面的程序中使能外部中断 2: lda # B sta P_INT_Ctrl0 ; 使能 INT P_INT_Ctrl1($0F,R/W) 该寄存器与 P_INT_Ctrl0 功能相似, 差别在于该寄存器与寄存器 P_INT_Ctrl0 分别对不同的中断源操作 具体见表 4.4 该寄存器默认初始值为#00h 表 4.4 中断控制寄存器 1 P_INT_Ctrl1($0F,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 CAP1IE CAP0IE T5OIE T4OIE T3OIE T2OIE T1OIE T0OIE R/W R/W R/W R/W R/W R/W R/W R/W Bit 7 CAP1IE: 捕获 1 中断使能位 0 = 禁止 1 = 使能 Bit 6 CAP0IE: 捕获 0 中断使能位 0 = 禁止 1 = 使能 Bit 5 T5OIE: 定时 / 计数器 5 溢出中断使能位 0 = 禁止 1 = 使能 Bit 4 T4OIE: 定时 / 计数器 4 溢出中断使能位 0 = 禁止 1 = 使能 Bit 3 T3OIE: 定时 / 计数器 3 溢出中断使能位 0 = 禁止 1 = 使能 Bit 2 T2OIE: 定时 / 计数器 2 溢出中断使能位 0 = 禁止 1 = 使能 Bit 1 T1OIE: 定时 / 计数器 1 溢出中断使能位 0 = 禁止 1 = 使能 Bit 0 T0OIE: 定时 / 计数器 0 溢出中断使能位 Tel: mcu@sunplus.com.cn 87

94 凌阳 8 位通用单片机 0 = 禁止 1 = 使能 P_INT_Ctrl2($27,R/W) 该寄存器与 P_INT_Ctrl0 P_INT_Ctrl1 功能相似, 差别在于该寄存器与寄存器 P_INT_Ctrl0 P_INT_Ctrl1 分别对不同的中断源操作 具体见表 4.4 该寄存器默认初始值为#00h 表 4.5 中断控制寄存器 2 P_INT_Ctrl2($27,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 - - ITVALIE CMP1IE CMP0IE - - R/W R/W R/W Bit [7:6] 保留 Bit 5 ITVALIE: 时基中断使能位 0 = 禁止 1 = 使能 Bit [4:0] 保留 Bit 1 CMP1IE: 比较器 1 使能位 0 = 禁止 1 = 使能 Bit 0 CMP0IE: 比较器 0 使能位 0 = 禁止 1 = 使能 P_INT_Flag0($0C,R/W) P_INT_Flag0 是中断标志寄存器, 当中断产生时, 相应的标志位便会被置 1 当 CPU 查询到该标志位被置 1 后便转到中断服务子程序中去执行 中断服务子程序退出前, 需要将该标志位清零, 清零的方法是将相应的标志位写 1 P_INT_Flag0 寄存器中各个位所对应的中断源与 P_INT_Ctrl0 寄存器是一样的, 所以其各个位的功能可以参考表 4.6, 以及前面对 P_INT_Ctrl0 的描述 该寄存器默认初始值为 #00h 表 4.6 中断标志寄存器 0 P_INT_Flag0($0C,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 ADIF WDIF IRQ5IF/ CAP5IF IRQ4IF/ CAP4IF IRQ3IF IRQ2IF IRQ1IF/ CAP3IF IRQ0IF/ CAP2IF R/W R/W R/W R/W R/W R/W R/W R/W 注 : 写入 1 清除相应标志 1. IRQ5 IRQ4 分别和 CAP5 CAP4 共用中断标志位 2. IRQ1 IRQ0 分别和 CAP3 CAP2 共用中断标志位 88 mcu@sunplus.com.cn Tel:

95 第 4 章中断系统 P_INT_Flag1($0E,R/W) 与 P_INT_Flag0 一样, 中断标志寄存器 1(P_INT_Flag1) 对应着中断控制寄存器 1(P_INT_Ctrl1) 的各个中断源的中断标志,P_INT_Flag1 中各个位的具体功能可以参考表 4.7 以及 P_INT_Ctrl1 中的描述 该寄存器默认初始值为 #00h 表 4.7 中断标志寄存器 1 P_INT_Flag1($0E,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 CAP1IF CAP0IF T5OIF T4OIF T3OIF T2OIF T1OIF T0OIF R/W R/W R/W R/W R/W R/W R/W R/W 注 : 向相应位写 1 清除该标志 P_INT_Flag2($26,R/W) 中断标志寄存器 2(P_INT_Ctrl2) 除了对应中断控制寄存器 2(P_INT_Ctrl2) 的中断源的中断标志外, 还多出了 UART 中断标志 SPI 中断标志位以及 IIC 中断标志位, 具体请参考表 4.8 该寄存器默认初始 值为 #00h 表 4.8 中断标志寄存器 2 P_INT_Flag2($26,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 - - ITVALIF IICIF UARTIF SPIIF CMP1IF CMP0IF - - R/W R R R R/W R/W Bit [7:6] 保留 Bit 5 ITVALIF: 时基中断标志 0 = 中断没有发生 1 = 中断发生 Bit 4 IICIF:IIC 中断标志 0 = 中断没有发生 1 = 中断发生 Bit 3 UARTIF:UART 中断标志 0 = 中断没有发生 1 = 中断发生 Bit 2 SPIIF:SPI 中断标志 0 = 中断没有发生 1 = 中断发生 Bit 1 CMP1IF: 比较器 1 中断标志 0 = 中断没有发生 1 = 中断发生 Bit 0 CMP0IF: 比较器 0 中断标志 0 = 中断没有发生 Tel: mcu@sunplus.com.cn 89

96 凌阳 8 位通用单片机 1 = 中断发生注 : 向相应位写 1 清除该标志 但 SPIIF UARTIF IICIF 标志不能通过此寄存器清除, 它们要通过对另外的寄存器操作进行清除, 具体请参考后面介绍串行接口的章节 P_IRQ_Opt0($33,R/W) 写 IRQ 和 Capture 设置寄存器 0 可以对外部中断 4 5 或捕获中断 4 5 的属性设置, 该寄存器默认初始值为 #00h; 具体各位的设置请参考表 4.9: 表 4.9 IRQ 和 Capture 设置寄存器 0 P_IRQ_Opt0($33,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit IRQ5ES/ CAP5ES IRQM5 IRQ4ES/ CAP4ES IRQM R/W R/W R/W R/W Bit [7:4] 保留 Bit 3 外部中断 5 极性控制位或捕获器 5 控制位 IRQ5ES: IRQM5=1:( 电平触发 ) 0= 低电平触发 1= 高电平触发 IRQM5=0:( 边沿触发 ) 0= 下降沿触发 1= 上升沿触发 CAP5ES: 捕获器 5 的触发沿极性选择位 0= 上升沿触发并清除计数器 1= 下降沿触发并清除计数器 Bit 2 IRQM5:INT5 触发模式选择位 0= 边沿触发 1= 电平触发 Bit 1 外部中断 4 极性控制位或捕获器 4 控制位 IRQ4ES: RQM4=1:( 电平触发 ) 0= 低电平触发 1= 高电平触发 IRQM4=0: ( 边沿触发 ) 0= 下降沿触发 1= 上升沿触发 CAP4ES: 捕获器 4 的触发沿极性选择位 90 mcu@sunplus.com.cn Tel:

97 第 4 章中断系统 0= 上升沿触发并清除计数器 1= 下降沿触发并清除计数器 Bit 0 IRQM4:INT4 触发模式选择位 0= 边沿触发 1= 电平触发注 : 以上所有位都需要写两次才能设置成功 P_IRQ_Opt1($34,R/W) 写 IRQ 和 Capture 设置寄存器 1 可以对外部中断 或捕获中断 3 2 的属性设置, 该寄存器默认初始值为 #00h; 具体各位的设置请参考表 4.10: 表 4.10 IRQ 和 Capture 设置寄存器 1 P_IRQ_Opt1($34,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 IRQ3ES IRQM3 IRQ2ES IRQM2 IRQ1ES/ CAP3ES IRQM1 IRQ0ES/ CAP2ES IRQM0 R/W R/W R/W R/W R/W R/W R/W R/W Bit 7 IRQ3ES: 外部中断 3 极性控制位 IRQM3=1:( 电平触发 ) 0= 低电平触发 1= 高电平触发 IRQM3=0:( 边沿触发 ) 0 = 下降沿触发 1 = 上升沿触发 Bit 6 IRQM3:INT3 触发模式选择位 0 = 边沿触发 1 = 电平触发 Bit 5 IRQ2ES: 外部中断 2 极性控制位 IRQM2=1:( 电平触发 ) 0 = 低电平触发 1 = 高电平触发 IRQM2=0:( 边沿触发 ) 0 = 下降沿触发 1 = 上升沿触发 Bit 4 IRQM2:INT2 触发模式选择位 0 = 边沿触发 1 = 电平触发 Bit 3 IRQ1ES/CAP3ES: 外部中断 1 极性控制位或捕获器 3 控制位 Tel: mcu@sunplus.com.cn 91

98 凌阳 8 位通用单片机 IRQ1: IRQM1=1: ( 电平触发 ) 1= 高电平触发 0= 低电平触发 IRQM1=0: ( 边沿触发 ) 1= 上升沿触发 0= 下降沿触发 CAP3ES: 捕获器 3 的触发沿极性选择位 1= 下降沿触发并清除计数器 0= 上升沿触发并清除计数器 Bit 2 IRQM1:INT1 触发模式选择位 0 = 边沿触发 1 = 电平触发 Bit 1 IRQ0ES/CAP2ES: 外部中断 0 极性控制位或捕获器 2 控制位 IRQ0: IRQM0=1:( 电平触发 ) 1= 高电平触发 0= 低电平触发 IRQM0=0:( 边沿触发 ) 1= 上升沿触发 0= 下降沿触发 CAP2ES: 捕获器 2 的触发沿极性选择位 1= 下降沿触发并清除计数器 0= 上升沿触发并清除计数器 Bit 0 IRQM0:INT0 触发模式选择位 0 = 边沿触发 1 = 电平触发 注 : 以上所有位都需要写两次才能设置成功 4.3 中断应用 中断设置步骤 SPMC65 系列单片机中, 中断的设置步骤如下 : 1. 用 SEI 指令关闭总的中断开关 2. 向中断控制寄存器的相应位写入 1 使能中断 3. 用 CLI 指令打开总的中断开关 4. 等待中断产生 92 mcu@sunplus.com.cn Tel:

99 第 4 章中断系统 发生中断时, 系统自动将程序返回地址和状态寄存器 (P) 压入堆栈 进入中断服务程序, 如果用户还希望保存关键的寄存器 ( 例如 : 累加器 A X 寄存器 Y 寄存器 ), 则需要软件完成 通过查询中断标志位便可以知道是哪个中断源发生了中断 在退出中断服务程序前必须由软件清除对应中断标志位, 以避免中断程序的重复调用 执行中断返回指令 RTI 中断返回 通常中断设置 例 5-1 : 使能 IRQ0 中断, 上升沿触发 lda # B sta sta P_IOB_Data P_IOB_Attrib lda # B ; 将 PB4 设置为下拉输入, 作为 IRQ0 的中断输入 sta P_IOB_Dir lda # B ; 设置 IRQ0 为上升沿触发 sta sta lda P_IRQ_Opt1 P_IRQ_Opt1 #$FF sta P_INT_Flag0 ; 清除中断标志位 lda # B ; 使能 IRQ0 sta P_INT_Ctrl0 cli ; 打开总的中断开关 V_IRQ: pha ; 将累加器 A 压栈 txa pha ; 将 X 寄存器压栈 lda P_INI_Flag0 and # B beq jmp L_IRQ0 L_IRQL1 L_IRQ0: ; 中断服务程序 lda # B sta P_INT_Flag0 ; 清除 IRQ0 中断标志 L_IRQL1: pla tax pla ; 将 X 寄存器出栈 ; 将累加器 A 出栈 rti Tel: mcu@sunplus.com.cn 93

100 凌阳 8 位通用单片机 非屏蔽中断的设置 非屏蔽中断的设置分为两步 : 1. 设置芯片配置选项寄存器 ( 在 FortisIDE 的 Mask Option 选项设置 ), 选定非屏蔽中断所用的 IO 口 ; 2. 在程序中对寄存器进行设置 在程序中对寄存器进行设置步骤 : 1. 将中断口设置为输入 ; 2. 在寄存器 P_INT_Ctrl0 中打开中断使能 ; 3. 在寄存器 P_IRQ_Opt1 或 P_IRQ_Opt0 中设置触发模式 ; 4. 在寄存器 P_INT_Flag0 清除中断标志位, 等待外部中断地来临 例 5-2 : 下面以 32 管脚的 SPMC65P2408A 为例, 设置 PD0 为非屏蔽中断 当 PD0 口接收到上升沿后, 便会产生中断, 进入中断服务子程序 在 Fortis IDE 的 Mask Option 选项中选择 NMI Source Selection 选项, 选中 PD0 在程序中进行设置, 具体程序如下 :.CODE.PUBLIC V_Reset V_Reset: sei ; 关闭中断 ldx #C_STACK_BOTTOM ; 初始化堆栈指针在 $00FF txs F_Main: lda and sta lda P_IOD_Buf # B P_IOD_Data P_IOD_Attrib and # B sta lda P_IOD_Attrib P_IOD_Dir and # B sta P_IOD_Dir ; 端口 D0 设置为下拉输入 lda # B sta P_INT_Ctrl0 ; 使能 INT2 lda # B sta P_IRQ_Opt1 ; 设置为上升沿触发 sta P_IRQ_Opt1 lda # B sta P_INT_Flag0 ; 清除 INT2 标志位 94 mcu@sunplus.com.cn Tel:

101 第 4 章中断系统 L_Loop: Nop jmp V_IRQ: rti V_NMI: pha L_Loop ; 等 INT2 中断 txa pha lda P_INT_Flag0 and # B ; 判断是否 INT2? beq V_NMI_Exit ; 不是返回 lda #FFh ; 点亮数码管 sta P_IOA_Dir lda #00h sta P_IOA_Attrib lda #FFh sta P_IOA_Data nop nop ; 中断处理 lda # B sta P_INT_Flag0 ; 清除 INT2 标志位 V_NMI_Exit: pla tax pla rti VECTOR DW DW DW.SECTION V_NMI V_Reset V_IRQ.END 可屏蔽中断的设置 使用可屏蔽中断时分为以下三步 : 1. 在 Fortis IDE 的 Mask Option 选项中确认所使用的 I/O 口没有被设置为非屏蔽中断 ; 2. 在程序中对寄存器进行设置, 该步骤与非屏蔽中断的设置方法相同 3. 在程序中将状态寄存器 (P) 的中断标志 (I) 清零, 即执行指令 :cli 例 5-3 : 下面以 32 管脚的 SPMC65P2408A 为例, 设置 PD1 为可屏蔽中断 当 PD1 口接收到下降 Tel: mcu@sunplus.com.cn 95

102 凌阳 8 位通用单片机 沿后, 便会产生中断, 进入中断服务子程序 在 Fortis IDE 的 Mask Option 选项中确认 PD1 口没有被设置为非屏蔽中断 在程序中进行设置, 具体程序如下 :.CODE.PUBLIC V_Reset V_Reset: sei ; 关闭中断 ldx #C_STACK_BOTTOM ; 设置堆栈指针在 $00FF txs F_Main: lda P_IOD_Buf and # B sta P_IOD_Data lda P_IOD_Attrib and # B sta P_IOD_Attrib lda P_IOD_Dir and # B sta P_IOD_Dir ; 端口 D1 为下拉输入 lda # B sta P_INT_Ctrl0 ; 使能中断 IRQ3 lda # B sta P_IRQ_Opt1 ; 设置为下降沿触发 sta P_IRQ_Opt1 lda # B sta P_INT_Flag0 ; 清除 IRQ3 中断标志位 cli L_Loop: nop jmp L_Loop V_IRQ: pha txa pha lda P_INT_Flag0 and # B ; 是 IRQ3 中断吗? beq V_IRQ_Exit ; 不是返回 lda #FFh sta P_IOA_Dir 96 mcu@sunplus.com.cn Tel:

103 第 4 章中断系统 lda #00h sta P_IOA_Attrib lda #FFh sta P_IOA_Data nop nop ; 点亮数码管 set P_INT_Flag0,4 ; 清除 IRQ0 中断标志 V_IRQ_Exit: pla tax pla rti V_NMI: rti VECTOR DW DW DW.SECTION V_NMI V_Reset V_IRQ.END Tel: mcu@sunplus.com.cn 97

104 凌阳 8 位通用单片机 第 5 章定时 / 计数器原理及应用 5.1 SPMC65 系列单片机的定时 / 计数器 SPMC65 系列单片机共有 6 个定时 / 计数器 (Timer), 每个 Timer 都分别具备 CCP(Capture/Compare/PWM) 功能, 即捕获 比较和 PWM 输出功能 Timer 有 4 种工作模式 :8 位 /16 位定时 / 计数器模式 捕获模式 ( 捕获器 ) 比较模式和 PWM 模式 另外, 除了 PWM 模式外, 其它三种模式都可以以 8 位或 16 位的方式工作 所有功能通过相应控制寄存器进行设置, 见表 5.1 简介 : 表 5.1 SPMC65 系列单片机定时 / 计数器功能简介 定时 / 计数器模式捕获器比较模式 8 位 16 位 8 位 16 位 8 位 16 位 PWM 模式 Timer 0 是是脉宽 / 周期脉宽是是 8 位 Timer 1 是是脉宽 / 周期脉宽是是 12 位 Timer 2 是是脉宽 / 周期脉宽是是 8 位 Timer 3 是是脉宽 / 周期脉宽是是 12 位 Timer 4 是是脉宽 / 周期脉宽是是 8 位 Timer 5 是是脉宽 / 周期脉宽 / 周期是是 16 位 SPMC65 系列单片机最多共有 6 个 Timer, 而这 6 个 Timer 分为三种类型, 其主要是在功能 结构上有一定的区别, 具体请参考下面的描述 : 1. 类型 I:(Timer 0 Timer 2 Timer 4) 8 位或 16 位定时 / 计数器 8 位或 16 位捕获模式 (8 位脉宽 / 周期测量,16 位脉宽测量 ) 8 位或 16 位比较模式 8 位 PWM 模式 2. 类型 II:(Timer 1 Timer 3) 8 位或 16 位定时 / 计数器 8 位或 16 位捕获模式 (8 位脉宽 / 周期测量,16 位脉宽测量 ) 8 位或 16 位比较模式 12 位 PWM 模式 3. 类型 III:(Timer5) 8 位或 16 位定时 / 计数器 8 位或 16 位捕获模式 (8 位 /16 位脉宽 / 周期测量 ) 8 位或 16 位比较模式 98 mcu@sunplus.com.cn Tel:

105 第 5 章定时 / 计数器原理及应用 16 位 PWM 模式这些功能通过控制寄存器 P_TMRx_Ctrl0 (x=0~5) 设置, 本章会从三种定时 / 计数器各选出一个定时 / 计数器进行详细介绍, 如会详细介绍类型 I 的 Timer 0 类型 II 的 Timer 1 以及类型 III 的 Timer 5 而其它 Timer 的应用 功能设置等请参考同类型 Timer 的介绍 而 SPMC65 系列单片机中, 具体型号芯片的 Timer, 除了在数量上会有所删减外, 具体的 Timer 的工作模式还会有一定的删减, 请参考具体型号芯片的数据手册 ; 但其在功能设置上与本章所述描的是一样的 5.2 Timer 控制寄存器 Timer 相关寄存器简述 SPMC65 系列单片机 Timer 的功能很强大, 而它的使用 设置却很简单, 下面分别介绍 SPMC65 系列单片机有关 Timer 的寄存器分类 : 基本功能寄存器 : Timer 控制寄存器 0:P_TMRy_z_Ctrl0, 主要用于设置 Timer 的工作模式 ;(y=0,2,4;z=1,3,5) Timer 控制寄存器 1:P_TMRy_z_Ctrl1, 主要用于设置 Timer 的计数频率 ;(y=0,2,4;z=1,3,5) Timer x 计数值寄存器 (R):P_TMRx_Count P_TMRx_CountHi, 分高低字节 ;(x=0~5) Timer x 重载值寄存器 (W):P_TMRx_Preload P_TMRx_PreloadHi, 分高低字节 ;(x=0~5) CCP 功能相关寄存器 : Timer x 脉宽捕获值寄存器 :P_TMRx_Cap P_TMRx_CapHi, 分高低字节 ;(x=0~5) Timer x 周期捕获值寄存器 :P_TMRx_CapCycle8 1 ;(x=0~4) 捕获控制寄存器 :P_CAP_Ctrl; Timer x 比较值寄存器 :P_TMRx_Comp P_TMRx_CompHi, 分高低字节 ;(x=0~5) Timer xpwm 周期寄存器 : 分 8 位 12 位以及 16 位模式 ( 具体请参考后面的介绍 );(x=0~5) Timer xpwm 占空比寄存器 : 分 8 位 12 位以及 16 位模式 ( 具体请参考后面的介绍 );(x=0~5) 注 1:Timer 5 工作在 16 位捕获器模式下时, 周期捕获值寄存器分高低字节寄存器 本小节将详细介绍 SPMC65 系列单片机的 Timer 基本功能寄存器 ( 即基本的定时 / 计数功能相关的寄存器 ), 而与 CCP 功能相关的寄存器介绍将在后面的小节中介绍 Timer 控制寄存器 Timer 控制寄存器 0 P_TMRy_z_Ctrl0(y=0,2,4;z=1,3,5) 写 Timer 控制寄存器 0(P_TMRy_z_Ctrl0) 可以完成对 Timer 的工作模式设置, 要启动 Timer( 包括 Timer 的各种工作模式 ) 时要设置好相对的模式选择位即可, 而相应的模式选择位写入 000 时, 则 Timer 停止 P_TMRy_z_Ctrl0 默认初始值为 #00h, 其各个位的功能请参考下面介绍 : 表 5.2 Timer0-1 控制寄存器 0 P_TMR0_1_Ctrl0($11,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 - T1FC2 T1FC1 T1FC0 - T0FC2 T0FC1 T0FC0 - R/W R/W R/W - R/W R/W R/W Tel: mcu@sunplus.com.cn 99

106 凌阳 8 位通用单片机 表 5.3 Timer 2-3 控制寄存器 0 P_TMR2_3_Ctrl0($18,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 - T3FC2 T3FC1 T3FC0 - T2FC2 T2FC1 T2FC0 - R/W R/W R/W - R/W R/W R/W 表 5.4 Timer 4-5 控制寄存器 0 P_TMR4_5_Ctrl0($1F,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 - T5FC2 T5FC1 T5FC0 - T4FC2 T4FC1 T4FC0 - R/W R/W R/W - R/W R/W R/W TxFC[2:0]:Timer x 模式设置位 (x=0~5) Timer 控制寄存器 0 各个位设置时, 对应的工作模式请参考下表 : 表 5.5 Timer 模式设置对照表 TxFC2 TxFC1 TxFC0 Timer0/2/4 模式 Timer1/3 模式 Timer5 模式 位 PWM 12 位 PWM 16 位 PWM 位脉宽捕获 16 位脉宽捕获 16 位脉宽 / 周期捕获 位比较模式 16 位比较模式 16 位比较模式 位定时 / 计数器 16 位定时 / 计数器 16 位定时 / 计数器 位脉宽 / 周期捕获 8 位脉宽 / 周期捕获 8 位脉宽 / 周期捕获 位比较模式 8 位比较模式 8 位比较模式 位定时 / 计数器 8 位定时 / 计数器 8 位定时 / 计数器 停止 停止 停止 Timer 控制寄存器 1 P_TMRy_z_Ctrl1(y=0,2,4;z=1,3,5) 写 Timer 控制寄存器 1(P_TMRy_z_Ctrl1) 可以设置对应 Timer 的预分频数, 即可完成对 Timer 计数 频率的设置 ;P_TMRy_z_Ctrl1 默认初始值为 #00h, 其各个位的具体功能请参考下面介绍 : 表 5.6 Timer 0-1 控制寄存器 1 P_TMR0_1_Ctrl1($12,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 - T1PSS2 T1PSS1 T1PSS0 - T0PSS2 T0PSS1 T0PSS0 - R/W R/W R/W - R/W R/W R/W 表 5.7 Timer 2-3 控制寄存器 1 P_TMR2_3_Ctrl1($19,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 - T3PSS2 T3PSS1 T3PSS0 - T2PSS2 T2PSS1 T2PSS0 - R/W R/W R/W - R/W R/W R/W 100 mcu@sunplus.com.cn Tel:

107 第 5 章定时 / 计数器原理及应用 表 5.8 Timer 4-5 控制寄存器 1 P_TMR4_5_Ctrl1($20,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 - T5PSS2 T5PSS1 T5PSS0 - T4PSS2 T4PSS1 T4PSS0 - R/W R/W R/W - R/W R/W R/W TxPSS[2:0]:Timer x 预分频设置位 ( 计数频率设置 )(x=0~5) 111 = 外部事件 110 = F SYS = F SYS = F SYS = F SYS = F SYS = F SYS = F SYS F SYS : 系统时钟频率 Timer x 计数值低字节寄存器 P_TMRx_Count(x=0~5) Timer x 重载值低字节寄存器 P_TMRx_Preload(x=0~5) SPMC65 系列单片机中,Timer 的计数值寄存器与重载值寄存器是映射到同一个地址的, 而这两组寄存器分别是只读 只写的, 即读该寄存器时为读取当前计数值, 写该寄存器时为写入数据到重载值寄存器 计数值 / 重载值寄存器的低字节寄存器默认初始值为 #00h 表 5.9 Timer x 计数值 / 重载值低字节寄存器 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 W TxPL7 TxPL6 TxPL5 TxPL4 TxPL3 TxPL2 TxPL1 TxPL0 R TxCN7 TxCN6 TxCN5 TxCN4 TxCN3 TxCN2 TxCN1 TxCN0 Bit [7:0] 写 :Timer x 重载值的低字节 Bit [7:0] 读 :Timer x 计数值的低字节 Timer x 计数值高字节寄存器 P_TMRx_CountHi(x=0~5) Timer x 重载值高字节寄存器 (P_TMRx_PreloadHi(x=0~5) 与其相对的低字节寄存器一样, 这两个寄存器实际上是映射到了同一个地址上, 分别是只读 只写的寄存器, 读取时为读取当前 Timer 的计数值, 写入时为写入数据到重载值寄存器 计数值 / 重载值高字节寄存器默认初始值为 #00h 表 5.10 Timer 0 计数值 / 重载值高字节寄存器 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 W TxPL15 TxPL14 TxPL13 TxPL12 TxPL11 TxPL10 T0xPL9 TxPL8 R TxCN15 TxCN14 TxCN13 TxCN12 TxCN11 TxCN10 TxCN9 TxCN8 Tel: mcu@sunplus.com.cn 101

108 凌阳 8 位通用单片机 Bit [7:0] 写 :Timer x 重载值的高字节 Bit [7:0] 读 :Timer x 计数值的高字节注 : 写入数据顺序要按照从高字节到低字节的顺序写 例如 : 要设置 16 位定时器模式先设置位于高字节的 P_TMR0_PreloadHi 然后设置位于低字节的 P_TMR0_Preload 而读取数据的顺序正好相后, 要按照选读取低字节寄存器, 再读取高字节寄存器的顺序 5.3 定时 / 计数器 定时 / 计数器的结构 SPMC65 系列单片机的 6 个 Timer 都可工作在 8 位 /16 位可重载的定时 / 计数器模式下 在作定时 / 计数器时, 需要设置几个寄存器, 如下 : 1. 定时 / 计数器功能选择 ( 设置 Timer 控制寄存器 0); 2. 8 位预分频寄存器 ( 设置 Timer 控制寄存器 1); 3. 8 位 /16 位重载值寄存器 定时 / 计数器的计数频率共有 8 种选择, 可以通过设置 Timer 控制寄存器 1( 设置对应定时 / 计数器的预分频设置位 ) 来选择 其中 7 种时钟频率由系统时钟的 1~512 分频得到, 因而频率输入范围非常广 而在定时 / 计数器的控制寄存器设置中, 可以设置定时器的计数频率信号来自于外部事件, 即可对外部信号进行计数 而各定时 / 计数器对应的外部事件输入端口如表 5.11 所示 : 表 5.11 定时 / 计数器外部事件输入端口 定时 / 计数器 外部事件端口 定时 / 计数器 外部事件端口 定时 / 计数器 0 与 PB0 复用 定时 / 计数器 3 与 PB5 复用 定时 / 计数器 1 与 PB1 复用 定时 / 计数器 4 与 PD4 复用 定时 / 计数器 2 与 PB4 复用 定时 / 计数器 5 与 PD5 复用 8 位 /16 位重载值寄存器的作用是在定时 / 计数器开始工作或者溢出后重新赋初值 定时器的 8 位 /16 位计数值寄存器每收到一个外部或内部时钟输入后加一 以一个 8 位定时器为例, 当其计数到 255 时, 这时再来一个时钟信号, 计数器便会溢出 此时, 如果定时 / 计数器的溢出中断已经使 能了, 便会产生溢出中断 同时, 在计数器从 255 即将变为 0 时, 重载值寄存器中的值会被取出, 载入计 数器, 重新从载入的初值开始计数 图 5.1 为定时 / 计数器结构图 102 mcu@sunplus.com.cn Tel:

109 第 5 章定时 / 计数器原理及应用 P_TMRy_z_Ctrl0 - TzFS2 TzFS1 TzFS0 - TyFS2 TyFS1 TyFS0 P_TMRy_z_Ctrl1 - TzPSS2 TzPSS1 TzPSS0 - TyPSS2 TyPSS1 TyPSS0 P_TMRx_Preload TxPL7 TxPL6 TxPL5 TxPL4 TxPL3 TxPL2 TxPL1 TxPL0 P_TMRx_PreloadHi TxPL15 TxPL14 TxPL13 TxPL12 TxPL11 TxPL10 TxPL9 TxPL8 TxFS[2:0] 系统时钟 SYS_CLK Timer x 使能 EXT_CLK SYS_CLK/512 SYS_CLK/128 SYS_CLK/32 SYS_CLK/8 SYS_CLK/4 SYS_CLK/2 SYS_CLK MUX TxPSS[2:0] Edge Detecto r 重载 P_TMRx_Preload 重载 P_TMRx_PreloadHi Timer x 使能 TxFS0 TxFS1 TxFS2 计数频率 8/16-BIT 选择切换 计数频率 Timer x 使能 E N Timer 重载 Timer Timer x 使能 0 : 停止 1 : 重载 & 开始 重载 溢出检测 Timer x 中断 注 : 1. x : 0~5, y : 0, 2, 4, z : y+1 2. TxPSS : Timer x 预分频设置 3. TxFS : Timer x 功能选择 4. TxPL : Timer x 预置 / 重载值 5. SYS_CLK : 系统时钟 图 5.1 定时 / 计数器结构框图 位定时 / 计数器 SPMC65 系列单片机的 Timer 都可以在 8 位定时 / 计数器模式下工作, 设置寄存器 P_TMRy_z_Ctrl0 (y=0, 2, 4; z=1, 3, 5) 可以使相对应的 Timer 工作在 8 位定时 / 计数器模式下 下面以一个 8 位定时 / 计数器 Timer0 为例, 分析定时 / 计数器工作在 8 位模式下的机制 8 位定时 / 计数器定时长度的计算如下 : 8 位定时 / 计数器 DATA = P_TMRx_Preload T_TMRx = Timer x(x = 0~5) 时钟分频后的周期 中断周期 = {$100 - DATA} * T_TMRx 以 Timer 0 为例, 图 5.2 为 8 位定时 / 计数器的结构图 : Tel: mcu@sunplus.com.cn 103

110 凌阳 8 位通用单片机 PB0(TC0) 滤波 EXT_CLK SYS_CLK SYS_CLK/512 SYS_CLK/128 SYS_CLK/32 SYS_CLK/8 SYS_CLK/4 SYS_CLK/2 SYS_CLK MUX T0FS0 T0FS1 T0FS2 edge Timer0 使能 计数频率 CK 重载 重载 P_TMR0_Preload Timer 溢出检测 Timer0 中断 Timer0 使能 T0PSS[2:0] 图 位定时 / 计数器结构 而图 5.3 中所示的是定时 / 计数器溢出和中断发生的信号时序图 系统时钟 P_TMR0_1_Ctrl1.T0P SS[2:0]( 计数频率 ) P_TMR0_Preload F0 P_TMR0_Count FB FC FD FE FF F0 F1 P_INT_Ctrl1.T0OIE 图 5.3 溢出和中断发生信号时序图 如果 P_TMR0_1_Ctrl0[2:0]=001 且 PB0 设置为输入 ( 即设置了定时 / 计数器的计数频率信号为外部事件 ), 那么 PB0 就可以作为定时 / 计数器 0 的外部时钟输入端, 进行外部脉冲计数 定时 / 计数器 0 的低字节寄存器 P_TMR0_Count ($13) 可以自动装入初值并负责计数 (8 位定时 / 计数器模式下时, 其相关寄存器低字节的有效 ), 在其计数的过程中, 可以从中读取当前的计数值 一旦计数溢出, 如果该溢出中断使能, 则会产生溢出中断, 同时, 计数寄存器会自动的被载入初值 ( 重载值 ) 如图 5.4 所示, 为 8 位计数器计数情况和中断发生的关系 P_TMRx_Preload=0xFA FFh FFh FAh FCh FBh FAh FCh FBh 计数频率信号 溢出中断信号 图 位计数器计数情况和中断发生的关系 104 mcu@sunplus.com.cn Tel:

111 第 5 章定时 / 计数器原理及应用 例 5-1 : 将 Timer 0 设置成 8 位定时 / 计数器模式 lda # B ; 将 Timer0 设置 8 位定时 / 计数器模式, 并启动 Timer0 sta P_TMR0_1_Ctrl0 lda # B ; 设置 Timer0 时钟频率 Fsys/128 sta P_TMR0_1_Ctrl1 lda #156 ; 设置 Timer0 重载计数值 = = 100 sta P_TMR0_Preload ; Fsys(8MHz)/128/100= 625Hz 位定时 / 计数器一般 8 位的 CPU, 总线宽度为 8 位, 通常无法直接访问 16 位的数据 为了克服这样的局限性问题, 在 SPMC65 系列单片机中设计了一个数据寄存器 Timer x MSB(x = 0~5), 用于 16 位数据高 8 位的读写操作, 如图 5.5 所示, 它有专门的读 / 写缓冲器 在读取 16 位数据时, 用户需要先读出低字节, 与此同时, 高字节被锁存在缓冲器里, 低字节读取结束, 然后再读取高字节, 这时相当于读取缓冲器中保存的定时 / 计数器高字节数据 相反的, 在写 16 位数据时, 用户需要先写入高字节并被缓冲器自动保存, 然后再写入低字节, 直到 16 位数据全部写入, 缓冲器中的高字节和低字节将会同时载入定时 / 计数器中去 读缓冲 2 Timer(MSB) 1 Timer(LSB) 数据部线 16 位数据读操作 : 1. 先读低字节寄存器 (LSB) ; 同时, 高字节寄存器 读缓冲 2. 后读高字节寄存器 ( 读缓冲中的值 ) 16 位数据载入操作 : 1. 先载入高字节寄存器 ( 载入到缓冲器 ) Timer(MSB) Timer(LSB) 2. 后载入低字节寄存器 ; 同时, 写缓冲 高字节寄存器 写缓冲 数据总线 重载值高字节寄存器 重载值低字节寄存器 1 2 数据寄存器和中断周期之间的关系如下 : 图 位定时 / 计数器的寄存器读写操作示意图 Tel: mcu@sunplus.com.cn 105

112 凌阳 8 位通用单片机 16 位定时 / 计数器 DATA={ P_TMRx_PreloadHi, P_TMRx_Preload } T_TMRx = Timer x(x = 0~5) 时钟分频后的周期, 中断周期 = {$ DATA} * T_TMRx 以 Timer 0 工作在 16 位定时 / 计数器模式下为例, 图 5.6 为 16 位定时 / 计数器的结构图 : 而图 5.7 中所示的是定时 / 计数器溢出和中断发生的信号时序图 : PB0(TC0) SYS_CLK 滤波 EXT_CLK SYS_CLK/512 SYS_CLK/128 SYS_CLK/32 SYS_CLK/8 SYS_CLK/4 SYS_CLK/2 SYS_CLK MUX 重载 P_TMR0_Preload 重载 P_TMR0_PreloadHi T0FS0 T0FS1 T0FS2 edge Timer0 使能 8BIT/16BIT 选择功换 Timer Speed T0FS[2:0] CK 重载 重载数据 Timer 溢出检测 Timer0 中断 Timer0 使能 T0PSS[2:0] 图 位定时 / 计数器结构 系统时钟 P_TMR0_1_Ctrl1.T0P SS[2:0]( 计数频率 ) P_TMR0_PreloadHi FE P_TMR0_Preload F0 P_TMR0_CountHi P_TMR0_Count FFFB FFFC FFFD FFFE FFFF FEF0 FEF1 P_INT_Ctrl1.T0OIE 图 5.7 定时 / 计数器溢出和中断发生的信号时序图 如果 P_TMR0_1_Ctrl0 [2:0]=100 且 PB0 设置为输入, 那么 PB0 就可以作为定时 / 计数器 0 的时钟输入端, 进行外部脉冲计数 定时 / 计数器 0 有两个计数寄存器 : 高字节寄存器 P_TMR0_CountHi ($14) 和低字节寄存器 P_TMR0_Count ($13), 这两个寄存器可以自动的载入初值进行计数, 在计数的过程中随时可以读 106 mcu@sunplus.com.cn Tel:

113 第 5 章定时 / 计数器原理及应用 取当前的计数值 当该 16 位定时 / 计数器 0 溢出时, 如果溢出中断使能, 则会产生溢出中断, 同时定时 / 计数器 0 会自动重载初值继续计数 如图 5.8 所示, 为 16 位计数器计数情况和中断发生的关系示意图 P_TMRx_Preload = 0xFFFA FFFFh FFFFh FFFCh FFFBh FFFAh FFFBh FFFCh FFFBh 计数频率信号 溢出中断信号 图 位计数器工作状态和中断之间的关系示意图 例 5-2 : 将 Timer 0 设置为 16 位定时 / 计数器工作方式 : lda # B ; 将 Timer0 设置为 16 位定时 / 计数器模式 sta P_TMR0_1_Ctrl0 lda # B ; 设定 Timer0 时钟频率为 Fsys/128 sta P_TMR0_1_Ctrl1 lda #253 ; 首先设定 Timer0 计数重载值高字节为 253=$FD sta P_TMR0_PreloadHi lda #143 ; 然后设定 Timer0 计数重载值低字节为 143=$8F sta P_TMR0_Preload ; 设定 Fsys(8Mhz)/128/($10000-$FD8F)= 100Hz(10ms) 定时 / 计数器中断 定时 / 计数器有以下五种中断源 : 定时 / 计数器 0 溢出中断 定时 / 计数器 1 溢出中断 定时 / 计数器 2 溢出中断 定时 / 计数器 3 溢出中断 定时 / 计数器 4 溢出中断 定时 / 计数器 5 溢出中断 下面是设置定时 / 计数器溢出中断的几个步骤 : 1. 执行指令 SEI 关闭总的中断开关 ; 2. 决定采用 8 位还是 16 位的定时 / 计数方式并选择一个合适的定时 / 计数器 ; 3. 设置所选的定时 / 计数器的相关寄存器 ; 4. 在寄存器 P_INT_Ctrl1($0F) 中使能该定时器中断 ; 5. 执行指令 CLI 打开总的中断开关 ; 6. 设置完毕, 等待中断产生 例 5-3 : 将 Timer 0 设置为 8 位定时 / 计数器工作方式并产生 1ms 的溢出中断 lda # B ; 将 Timer0 设置为 8 位工作方式 sta P_TMR0_1_Ctrl0 Tel: mcu@sunplus.com.cn 107

114 凌阳 8 位通用单片机 lda # B ; 设定 Timer0 时钟频率为 Fsys/32 sta P_TMR0_1_Ctrl1 lda #6 ; 设定 Timer0 计数重载值为 256-6= 250 sta P_TMR0_Preload ; 设定 Fsys(8MHz)/32/250= 1KHz(1ms) lda #$FF ; 清除所有的中断标志位 sta P_INT_Flag1 set P_INT_Ctrl1,0 ; 使能 Timer0 溢出中断 cli ; 打开总的中断开关 例 5-4 : 将 Timer 1 设置为 16 位定时 / 计数器工作方式并产生 10ms 的周期溢出中断 lda # B ; 将 Timer1 设置为 16 位工作方式 sta P_TMR0_1_Ctrl0 lda # B ; 设定 Timer1 时钟频率为 Fsys/128 sta P_TMR0_1_Ctrl1 lda #253 ; 首先设定 Timer0 计数重载值高字节为 253=$FD sta P_TMR1_PreloadHi lda #143 ; 然后设定 Timer0 计数重载值低字节为 143=$8F sta P_TMR1_Preload ; 设定 Fsys(8Mhz)/128/($10000-$FD8F)= 100Hz(10ms) lda #$FF ; 清除所有的中断标志位 sta P_INT_Flag1 set P_INT_Ctrl1,1 ; 使能 Timer1 溢出中断 cli ; 打开总的中断开关 5.4 捕获器 (Capture) SPMC65 系列单片机的捕获器 SPMC65 系列单片机共有 6 个 Timer, 都具有 8 位 /16 位捕获功能, 支持两种触发模式 : 上升沿触发和下降沿触发 在 8 位捕获模式下, 可以进行脉宽和周期的测量 在 16 位捕获模式下, 只能进行脉宽测量 (Timer 5 可进行 16 位的脉宽 / 周期测量 ) 所有功能可以通过相应控制寄存器进行设置, 见下表简介 : 表 5.12 SPMC65 系列单片机捕获功能简表 捕获器 8 位 16 位 捕获输入管脚 Timer 0 脉宽 / 周期 脉宽 与 PB0 复用 Timer 1 脉宽 / 周期 脉宽 与 PB1 复用 Timer 2 脉宽 / 周期 脉宽 与 PB4 复用 Timer 3 脉宽 / 周期 脉宽 与 PB5 复用 Timer 4 脉宽 / 周期 脉宽 与 PD4 复用 108 mcu@sunplus.com.cn Tel:

115 第 5 章定时 / 计数器原理及应用 Timer 5 脉宽 / 周期脉宽 / 周期与 PD5 复用 当 Timer 工作于 8 位或 16 位的捕获模式下, 捕获输入管脚 ( 例如定时 / 计数器 0 的 PB0) 必须设置成输入状态, 才能进行事件捕获 而为了保证捕获值的正确, 需要选择合适的计数频率 当需要得到脉宽值或周期值时, 捕获器的触发沿极性和捕获中断触发极性也必须设置正确 除了 Timer 要设置的控制寄存器, 以及相关的捕获值寄存器之外, 捕获器操作相关的寄存器还有如下 :P_CAP_Ctrl ($58) P_IRQ_Opt0 ($33) 和 P_IRQ_Opt1 ($34) 如图 5.9 所示为捕获器原理框图 P_TMRy_z_Ctrl0 - TzFS2 TzFS1 TzFS0 - TyFS2 TyFS1 TyFS0 P_TMRy_z_Ctrl1 - TzPSS2 TzPSS1 TzPSS0 - TyPSS2 TyPSS1 TyPSS0 P_TMRx_Cap TxCW7 TxCW6 TxCW5 TxCW4 TxCW3 TxCW2 TxCW1 TxCW0 P_TMRx_CapHi TxCW15 TxCW14 TxCW13 TxCW12 TxCW11 TxCW10 TxCW9 TxCW8 P_CAP_Ctrl CAPOPT CAPIP4 CAPIP3 CAPIP2 CAPIP1 CAPIP0 CAP1ES CAP0ES P_IRQ_Opt0 IRQ5ES/ IRQM5 IRQ4ES/ - CAP5ES CAP4ES IRQM4 P_IRQ_Opt1 IRQ3ES IRQM3 IRQ2ES IRQM2 IRQ1ES/ IRQM1 IRQ0ES/ CAP3ES CAP2ES IRQM0 EXTI 输入上升沿 输入下降沿 捕获中断触发极性控制 捕获器 x 中断 计数频率 EN Timer Timer x 使能 0 : 停止 1 : 重载 & 开始 重载 0000H 溢出检测 高字节载入 Timer x 中断 CAPxES CAPIPx S1 MUX 低字节输出 P_TMRx_Cap P_TMRx_CapHi S0 CAPxES S1 MUX 8/16- BIT 选择切换 高字节输出 TxFS0 TxFS1 TxFS2 低字节载入 Timer x 使能 高字节载入 注 : 1. x : 0~5, y : 0, 2, 4, z : y+1 2. TxPSS : Timer x 预分频选择 3. TxFS : Timer x 工作模式选择 4. TxPL : Timer x 重载值设置 S0 图 5.9 捕获器原理框图 控制寄存器 SPMC65 系列单片机的 6 个 Timer 可通过设置 Timer 控制寄存器 (P_TMRy_z_Ctrl0:y=0,2,4;z=1,3,5) 使其工作在捕获器模式下 ; 设置 Timer 控制寄存器 1(P_TMRy_z_Ctrl1:y=0,2,4;z=1,3,5) 可选择计数频率 控制寄存器 0 和 1 的各个位功能, 以及设置方法请参考前面小节中的介绍 当启动 Timer 的捕获模式时, 需要设置对应的工作模式选择位即可, 而相应工作模式选择位写入 000B 时, 即使其停止工作 而每一个捕获器都有对应的脉宽捕获值低字节寄存器 (P_TMRx_Cap:x=0~5), 高字节寄存器 (P_TMRx_CapHi:x=0~5), 以及周期捕获值寄存器 (P_TMRx_CapCycle8:x=0~5); 而定时 / 计数器 5 有 16 位脉宽 / 周期捕获器的工作模式, 所以定时 / 计数器 5 还有两个寄存器分别对应 16 位周期捕获值的寄存器 : 定时 / 计数器 5 周期捕获值的低字节 (P_TMR5_CapCycleLo), 以及定时 / 计数器 5 周期捕获值的高字节 (P_TMR5_CapCycleHi) 捕获器 x 脉宽捕获值的低字节 P_TMRx_Cap(x=0~5) 捕获器 x 脉宽捕获值低字节寄存器 (P_TMRx_Cap) 是与定时 / 计数器 x 的重载值低字节寄存器映射到 Tel: mcu@sunplus.com.cn 109

116 凌阳 8 位通用单片机 了同一地址上 ; 不过, 当定时 / 计数器工作在捕获器的模式下时, 写脉宽捕获值的高 低字节寄存器是没有意义的 与前面所述一样, 当 Timer 工作在 8 位捕获器模式下时, 其相关寄存器中, 低字节寄存器有效, 即捕获器脉宽捕获值寄存器组中, 只有低字节的寄存器 P_TMRx_Cap 有效 ; 其它有高低字节寄存器之分的 Timer 相关寄存器也一样 寄存器 P_TMRx_Cap 和 P_TMRx_CapHi 的默认初始值都为 #00h: 表 5.13 捕获器 x 脉宽捕获值的低字节寄存器 P_TMRx_Cap Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 W TxPL7 TxPL6 TxPL5 TxPL4 TxPL3 TxPL2 TxPL1 TxPL0 R TxCW7 TxCW6 TxCW5 TxCW4 TxCW3 TxCW2 TxCW1 TxCW0 Bit [7:0] 写 :TxPL [7:0] 定时 / 计数器 x 重载值的低字节 TxPL [7:0] (W) Bit [7:0] 读 :TxCW [7:0] 捕获器 x 脉宽捕获值的低字节 TxCW [7:0] (R) 捕获器 x 脉宽捕获值的高字节寄存器 P_TMRx_CapHi(x=0~5) 表 5.14 捕获器 x 脉宽捕获值高字节寄存器 P_TMRx_CapHi Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 W TxPL15 TxPL14 TxPL13 TxPL12 TxPL11 TxPL10 TxPL9 TxPL8 R TxCW15 TxCW14 TxCW13 TxCW12 TxCW11 TxCW10 TxCW9 TxCW8 Bit [7:0] Bit [7:0] 写 :TxPL [15:8] 定时 / 计数器 x 重载值的高字节 TxPL [15:8] (W) 读 :TxCW [15:8] 捕获器 x 脉宽捕获值的高字节 TxCW [15:8] (R) 捕获器 x 周期捕获值寄存器 P_TMRx_CapCycle8(x=0~5) 捕获器 x 周期捕获值寄存器 (P_TMRx_CapCycle8) 映射到了对应的脉宽捕获值高字节寄存器 (P_TMRx_CapHi) 当 Timer 工作在 8 位脉宽 / 周期捕获器模式下时, 读对应的 P_TMRx_CapCycle8 可获取捕获的 8 位周期捕获值, 写该寄存器没有意义 该寄存器默认初始值为 #00h 表 5.15 捕获器 x 周期寄存器 P_TMRx_CapCycle8 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 W TxPL15 TxPL14 TxPL13 TxPL12 TxPL11 TxPL10 TxPL9 TxPL8 R TxCC7 TxCC6 TxCC5 TxCC4 TxCC3 TxCC2 TxCC1 TxCC0 Bit [7:0] Bit [7:0] 写 :TxPL [15:8] 定时 / 计数器 x 重载值 TxPL [15:8] (W) 读 :TxCC [7:0] 捕获器 x 周期捕获值 TxCC [7:0] (R) 而 Timer5 可以工作在 16 位的脉宽 / 周期捕获器模式下, 所以 Timer5 还多出了两个寄存器用于存放捕获的 16 位周期捕获值 这两个寄存器默认初始值都为 #00h 定时 / 计数器 5 周期捕获值的低字节寄存器 P_TMR5_CapCycleLo($25,R) 110 mcu@sunplus.com.cn Tel:

117 第 5 章定时 / 计数器原理及应用 定时 / 计数器 5 周期捕获值的高字节寄存器 P_TMR5_CapCycleHi($5F,R) 捕获控制寄存器 P_CAP_Ctrl($58,R/W) 写捕获控制寄存器 (P_CAP_Ctrl) 可以设置对应的定时 / 计数器工作在捕获器模式下时的一些特性, 如捕获数据保持选择 中断触发极性选择等 P_CAP_Ctrl 在复位后默认值为 #00h, 该寄存器各个位的功能请参考表 5.16: 表 5.16 捕获控制寄存器 P_CAP_Ctrl($58,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 CAPOPT CAPIP4 CAPIP3 CAP1P2 CAPIP1 CAP1P0 CAP1ES CAP0ES R/W R/W R/W R/W R/W R/W R/W R/W Bit 7 CAPOPT: 捕获数据保持选择位 1= 保持原来的捕获数据, 直到对捕获数据寄存器进行读操作 0= 若接收到新数据, 立即更新捕获数据 Bit 6 CAPIP4: 捕获器 4 中断触发极性选择位 1= 与捕获器 4 触发沿极性相同 0= 与捕获器 4 触发沿极性相反 Bit 5 CAPIP3: 捕获器 3 中断触发极性选择位 1= 与捕获器 3 触发沿极性相同 0= 与捕获器 3 触发沿极性相反 Bit 4 CAPIP2: 捕获器 2 中断触发极性选择位 1= 与捕获器 2 触发沿极性相同 0= 与捕获器 2 触发沿极性相反 Bit 3 CAPIP1: 捕获器 1 中断触发极性选择位 1= 与捕获器 1 触发沿极性相同 0= 与捕获器 1 触发沿极性相反 Bit 2 CAPIP0: 捕获器 0 中断触发极性选择位 1= 与捕获器 0 触发沿极性相同 0= 与捕获器 0 触发沿极性相反 Bit 1 CAP1ES: 捕获器 1 的触发沿极性选择位 1= 下降沿触发并清除计数器 0= 上升沿触发并清除计数器 Bit 0 CAP0ES: 捕获器 0 的触发沿极性选择位 1= 下降沿触发并清除计数器 0= 上升沿触发并清除计数器注 :Timer 2~5 作为捕获器时, 其触发沿极性选择位, 以及 Timer5 作为捕获器时的中断触发极性选择位的设置, 在 IRQ 和 Capture 设置寄存器 0(P_IRQ_Opt0, $33) IRQ 和 Capture 设置寄存器 1(P_IRQ_Opt1, Tel: mcu@sunplus.com.cn 111

118 凌阳 8 位通用单片机 $34) 中进行设置 具体可参考中断部分的介绍 位捕获器工作模式当 Timer 处于 8 位捕获模式下时, 建议将中断触发与捕获器的触发沿极性设置成相同的极性 比如, 如果捕获器的触发沿设置为下降沿 (CAPxES=1), 中断触发也是下降沿 (CAPIPx = 1), 并且 CAPOPT=0 ( 收到新数据后更新捕获数据 ), 这样, 一旦捕获器输入管脚上有下降沿输入时, 计数器马上清除 在接下来的一个上升沿来临时, 计数器的值即脉宽值被立即送入寄存器 P_TMRx_Cap 中, 然后接着继续计数 在下一个下降沿到来时, 计数器的值即周期值又被送入寄存器 P_TMRx_CapCycle8 中, 同时中断标志 CAPxIF 置位, 然后计数器清零又重新开始计数, 进行下一个捕获操作 如果 CAPOPT=1, 并且没有对存放脉宽值或周期值的寄存器进行读操作, 那么即使有新数据, 这两个寄存器的值也不会被更新, 除非进行读操作 另外, 如果捕获脉宽大于计数器所能表示的最大值时, 可以用定时 / 计数器的溢出中断来辅助计数 例如 : 如果捕获的脉宽信号大于定时 / 计数器最大计数值 (FFh), 那么, 当定时 / 计数器计数到 FFH 时, 发生溢出中断, 中断次数加 1, 同时, 定时 / 计数器继续计数 当计数完毕, 可以根据中断次数和当前计数值计算出正确的捕获值 8 位捕获模式和 16 位捕获模式有所不同 在 16 位捕获模式下 ( 捕获器 5 除外 ), 只能进行脉宽测量, 因为捕获器必须占用两个字节的 8 位寄存器来保存 16 位的脉宽捕获值 但是在 8 位捕获模式下, 既可以进行脉宽测量也可以进行周期测量 8 位捕获器操作时序请参考图 5.10: Timer x 捕获器 上升沿清除 上升沿清除 输入信号 P_TMRx_CapCycle8 06 P_TMRx_Cap 中断触发沿极性与捕获器相同 中断触发沿极性与捕获器相反 图 位捕获器操作时序 捕获器模块为用户提供了一个输入信号保持功能 将 P_CAP_Ctrl 的捕获数据保持选择位设置为 1 就可以进行一次性输入信号捕获, 捕获器的捕获值 ( 脉宽 / 周期 ) 寄存器一直会保持这个捕获信号的值, 直到将该信号读出 然后再进行第二次捕获 保持 读出, 如此循环 可以利用该功能进行脉宽和周期的测量 8 位脉宽捕获和保持的操作时序请参考图 mcu@sunplus.com.cn Tel:

119 第 5 章定时 / 计数器原理及应用 Timer x 捕获器 上升沿清除 上升沿清除 输入信号 P_TMRx_CapCycle8 P_TMRx_Cap 02 中断触发沿极性与捕获器相反 捕获值保持 图 位脉宽捕获和保持操作 8 位脉宽捕获和周期捕获的计算公式如下 : If T_TMRx = Timer x(x = 0 ~ 5) 分频后的时钟周期, then 8 位捕获器 捕获脉宽值 = [P_TMRx_Cap + 1] * T_TMRx 捕获周期值 = [P_TMRx_CapHi + 1] * T_TMRx 注 : 捕获的脉宽 / 周期值允许有一个时钟周期的误差 例 6-5 : 将 Timer 0 设置为 8 位捕获模式 : lda # B sta sta P_IOB_Data P_IOB_Attrib lda # B ; 将 PB0 设置为输入, 作为捕获器 0 的输入管脚 sta P_IOB_Dir lda # B ; 将 Timer 0 设置为 8 位捕获模式 sta P_TMR0_1_Ctrl0 lda # B ; Timer 0 分频率 Fsys/512 (15.6KHz~61Hz) sta P_TMR0_1_Ctrl1 lda # B ; 设置为下降沿采数据, 捕获器 0 中断为下降沿触发 sta P_CAP_Ctrl 位捕获器工作模式 当 Timer 处于 16 位捕获模式下时, 建议将中断触发极性与捕获器计数清除极性设置成相反 例如 : 如果捕获器触发沿设置为下降沿 (CAPxES=1), 那么捕获中断就设置成上升沿触发 (CAPIPx = 0), 并且 CAPOPT=0( 收到新数据后更新捕获数据 ), 这样, 一旦捕获器输入管脚上有下降沿输入时, 计数器马上 Tel: mcu@sunplus.com.cn 113

120 凌阳 8 位通用单片机 清除 在接下来的一个上升沿来临时, 计数器的值即脉宽值被立即送入寄存器 P_TMRx_Cap 和 P_TMRx_CapHi 中, 并且产生捕获中断, 然后接着继续计数 在下一个下降沿到来时, 计数器清零又重新开始计数, 进行下一个捕获操作 如果 CAPOPT=1, 并且没有对存放捕获值的寄存器进行读操作, 那么即使有新数据, 寄存器的值也不会被更新, 直到对其进行读操作后才会再次更新 另外, 如果捕获脉宽大于定时 / 计数器所能表示的最大值时, 可以用定时 / 计数器的溢出中断来辅助计数 例如 : 如果捕获的脉宽信号大于定时 / 计数器 1 最大计数值 (#FFFFh), 那么, 当定时 / 计数器计数到 #FFFFh 时, 发生溢出中断, 中断次数加 1, 同时, 定时 / 计数器继续计数 当计数完毕, 可以根据中断次数和当前计数值计算出正确的脉宽值 由于 16 位捕获器只能进行脉宽捕获 ( 捕获 5 除外 ), 所以, 当需要测量周期时, 可由软件处理来实现 即 : 改变捕获中断的触发极性 在下一次捕获中断到来的时候捕获到信号的周期值 如图 5.12 所示为 16 位捕获器的操作原理 Timer x 捕获器 上升沿清除 上升沿清除 输入信号 P_TMRx_CapHi 00 P_TMRx_Cap 中断触发沿极性与捕获器相同 中断触发沿极性与捕获器相反 图 位捕获器的操作原理 16 位脉宽捕获计算方法如下 : If then T_TMRx = Timer x(x = 0 ~ 5) 分频后的时钟周期 16 位捕获器 捕获脉宽值 =[{ P_TMRx_CapHi, P_TMRx_Cap }+1] * T_TMRx 注 : 捕获的脉宽 / 周期值允许有一个时钟周期的误差 例 6-6 : 将 Timer 1 设置为 16 位捕获模式 lda # B sta sta P_IOB_Data P_IOB_Attrib lda # B ; 将 PB1 设置为输入, 作为捕获器 1 的输入管脚 114 mcu@sunplus.com.cn Tel:

121 第 5 章定时 / 计数器原理及应用 sta P_IOB_Dir lda # B ; 将 Timer 1 设置为 16 位捕获模式 sta P_TMR0_1_Ctrl0 lda # B ; Timer 1 分频率 Fsys/128 (62.5KHz~1Hz) sta P_TMR0_1_Ctrl1 lda # B ; 设置为下降沿采数据, 捕获 1 中断为下降沿触发 sta P_CAP_Ctrl 捕获中断捕获器相关中断如下 : Timer 0 捕获中断 Timer 1 捕获中断 Timer 2 捕获中断 Timer 3 捕获中断 Timer 4 捕获中断 Timer 5 捕获中断 下面是设置 Timer 捕获中断的几个步骤 : 1. 执行指令 SEI 关闭总的中断开关 ; 2. 决定采用 8 位还是 16 位的捕获方式并选择一个合适的 Timer x (x=0~5); 3. 设置所选的 Timer 的相关寄存器 ; 4. 在寄存器 P_INT_Ctrl0($0D) P_INT_Ctrl1($0F) 中使能该 Timer 捕获中断 ; 5. 执行指令 CLI 打开总的中断开关 ; 6. 设置完毕, 等待捕获中断产生 例 6-7 : 将 Timer 1 设置为 16 位捕获模式并查询捕获中断 lda # B sta P_IOB_Data sta P_IOB_Attrib lda # B ; 将 PB1 设置为输入, 作为捕获器 1 的输入管脚 sta P_IOB_Dir lda # B ; 将 Timer 1 设置为 16 位捕获模式 sta P_TMR0_1_Ctrl0 lda # B ; Timer 1 分频率 Fsys/128 (62.5KHz~1Hz) sta P_TMR0_1_Ctrl1 lda # B ; 设置为下降沿采数据, 捕获 1 中断为下降沿触发 sta P_CAP_Ctrl ; L_TestT1L61: lda P_INT_Flag1 Tel: mcu@sunplus.com.cn 115

122 凌阳 8 位通用单片机 and # B ; 捕获 1 中断? ( 捕获数据就绪 ) beq L_TestT1L61 ; 否 set P_INT_Flag1,7 ; 清除捕获 1 中断标志 lda P_TMR1_Cap ; 将脉宽低字节值送入累加器 A ldx P_TMR1_CapHi ; 将脉宽高字节值送入 X 寄存器 jmp L_TestT1L 比较模式 (Compare) SPMC65 系列单片机 Timer 的比较模式 SPMC65 系列单片机的 6 个 Timer 都可以通过相应控制寄存器的设置, 使其工作在比较模式 (Compare) 即当某一个 Timer 被设置为比较模式时, 相应的管脚就会输出占空比为 50% 的方波 SPMC65 系列单片机的比较模式简介请参考表 5.17 表 5.17 SPCM65 系列单片机比较模式简介 比较模式 8 位 16 位 比较输出端口 Timer 0 是 是 与 PB2 复用 Timer 1 是 是 与 PB3 复用 Timer 2 是 是 与 PD3 复用 Timer 3 是 是 与 PD2 复用 Timer 4 是 是 与 PD6 复用 Timer 5 是 是 与 PD7 复用 当 Timer x 作为 8/16 位比较输出时, 相应的管脚 ( 如 Timer 0 的 PB2) 便会输出精度为 8/16 位的方波, 并且可以进行 7 级分频选择 比较功能的计数初值在 Timer x(x=0~5) 的比较值寄存器 P_TMRx_Comp 和 P_TMRx_CompHi(16 位模式中有 ) 中设置 比较模式设置后, 计数器从设置的初始值开始计数, 当计数 器发生第一次溢出时, 在相应比较管脚上输出一个高电平, 然后载入初始值重新开始计数, 当计数器发生 第二次溢出时, 又在相应比较管脚上输出一个低电平, 第三次溢出会再次输出一个高电平, 依次不断循环 也就是说, 相应管脚会一直输出占空比为 50% 的方波 比较模式控制寄存器 SPMC65 系列单片机的 Timer 可通过设置控制寄存器, 使其工作在比较模式下 ; 设置 Timer x 控制寄 存器 0(P_TMRy_z_Ctrl0:y=0,2,4;z=1,3,5) 可选择比较器的工作模式, 设置 Timer x 控制寄存器 1 (P_TMRy_z_Ctrl1:y=0,2,4;z=1,3,5) 可选择计数频率 控制寄存器 0 和 1 的各个位功能, 以及设置方法请 参考前面小节中的介绍 每一个 Timer 工作在 8/16 比较模式下时, 都有对应的比较值低字节寄存器 (P_TMRx_Comp), 高字节寄存器 (P_TMRx_CompHi)(16 位比较模式下才有效 ) 而 6 个 Timer 对应的比较值寄存器都是类似的 116 mcu@sunplus.com.cn Tel:

123 第 5 章定时 / 计数器原理及应用 Timer x 比较器比较值低字节寄存器 P_TMRx_Comp(x=0~5) Timer x 比较模式比较值的低字节寄存器 (P_TMRx_Comp) 以及高字节寄存器 (P_TMRx_CompHi) 实际上与 Timer x 所对应的重载值 ( 或计数值 ) 低字节 高字节寄存器对应同一地址 ; 所以对其写操作时, 也需要按照从高字节寄存器到低字节寄存器的顺序 P_TMRx_Comp 和 P_TMRx_CompHi 默认初始值为 #00h 表 5.18 Timer x 比较模式比较值低字节寄存器 P_TMRx_Comp Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 W TxCP7 TxCP6 TxCP5 TxCP4 TxCP3 TxCP2 TxCP1 TxCP0 R TxCN7 TxCN6 TxCN5 TxCN4 TxCN3 TxCN2 TxCN1 TxCN0 Bit [7:0] Bit [7:0] 写 :TxCP [7:0] Timer x 比较模式比较值的低字节 TxCP [7:0] (W) 读 :TxCN [7:0] 定时 / 计数器 x 计数值的低字节 TxCN [7:0] (R) Timer x 比较器比较值高字节寄存器 P_TMRx_CompHi(x=0~5) 表 5.19 Timer x 比较器比较值高字节寄存器 P_TMRx_CompHi Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 W TxCP15 TxCP14 TxCP13 TxCP12 TxCP11 TxCP10 TxCP9 TxCP8 R TxCN15 TxCN14 TxCN13 TxCN12 TxCN11 TxCN10 TxCN9 TxCN8 Bit [7:0] Bit [7:0] 写 :TxCP [15:8] Timer x 比较模式比较值的高字节 TxCP [15:8] (W) 读 :TxCN [15:8] 定时 / 计数器 x 计数值的高字节 TxCN [15:8] (R) 位比较模式 8 位比较模式时序见图 5.13 下面以 Timer 0 的 8 位比较模式为例介绍 : 首先将寄存器 P_TMR0_1_Ctrl0($12) 的 T0FS[2:0] 位设置为 010 ; 并在寄存器 P_TMR0_Comp ($13) 中设置好计数初值 ; 比较输出功能使能后, 计数器从设置的初始值开始计数, 当计数器发生第一次溢出时, PB2 管脚上输出一个高电平 如果 Timer 0 的溢出中断使能, 此时会产生溢出中断 然后载入初始值重新开始计数, 当计数器发生第二次溢出时,PB2 管脚上输出一个低电平, 第三次溢出会再次输出一个高电平, 依次不断循环 也就是说,PB2 管脚会一直输出占空比为 50% 的方波 比较输出频率计算公式如下 : F Comp FSYS = Timer _ prescaler (256 Timer _ Compare _ Value) 2 F Comp : 比较输出频率 Timer_Prescaler:Timer x(x=0~5) 预置分频计数频率 Timer_Compare_Value:Timer x(x=0~5) 比较器设置的比效值 Tel: mcu@sunplus.com.cn 117

124 凌阳 8 位通用单片机 Timer x 计数频率 P_TMRx_Comp FB P_TMRx_Count FC FD FE FF FB FC FD FE FF FB FC FD FE Timer x 中断 Timer x 比较输出 例 6-8 : 将 Timer 0 设置为 8 位比较模式 图 位比较器输出时序 lda # B ; 将 Timer 0 设置为 8 位比较输出 sta P_TMR0_1_Ctrl0 lda # B ; 设置 Timer 0 时钟源为 Fsys/128 sta P_TMR0_1_Ctrl1 lda #206 ; 设置定时 / 计数器 0 计数初值为 = 50 sta P_TMR0_Preload ; 设置管脚 PB2 的比较输出频率为 Fsys(8MHz)/128/50/2= 625Hz 位比较模式 16 位比较模式与 8 位比较模式相似, 唯一不同的是 16 位比较模式用两个计数寄存器进行 16 位计数, 详细的 16 位比较模式时序请参考图 5.14 下面以 Timer 1 的比较模式为例介绍 : 首先将计数初值的高 8 位放入寄存器 P_TMR1_CompHi ($16) 中, 低 8 位放入寄存器 P_TMR1_Comp ($15), 再将寄存器 P_TMR0_1_Ctrl0 ($12) 中的 T1FS[2:0] 位设置为 101 计数器开始计数, 当计数器发生第一次溢出时,PB3 管脚上输出一个高电平 如果 Timer 1 的溢出中断使能, 此时会产生溢出中断 然后载入初始值重新开始计数, 当计数器发生第二次溢出时,PB3 管脚上输出一个低电平, 第三次溢出会再次输出一个高电平, 依次不断循环 也就是说,PB3 管脚会一直输出占空比为 50% 的方波 16 位比较输出频率计算见公式如下 : F Comp FSYS = Timer _ prescaler (65536 Timer _ Compare _ Value) 2 F Comp : 比较输出频率 Timer_Prescaler:Timer x(x=0~5) 预置分频计数频率 Timer_Compare_Value:Timer x(x=0~5) 比较器设置的比效值 118 mcu@sunplus.com.cn Tel:

125 第 5 章定时 / 计数器原理及应用 Timer x 计数频率 P_TMRx_CompHi FF P_TMRx_Comp FB Timer x Counter FFFC FFFD FFFE FFFF FFFB FFFC FFFD FFFE FFFF FFFB FFFC FFFD FFFE Timer x 中断 Timer x 比较输出 图 位比较器输出时序 例 6-9 : 将 Timer 1 设置为 16 位比较模式并产生输出波形 lda # B ; 将 Timer 1 设置为 16 位比较模式 sta P_TMR0_1_Ctrl0 lda # B ; 设置 Timer 1 时钟源为 Fsys/128 sta P_TMR0_1_Ctrl1 lda #253 ; 首先设置定时 / 计数器 1 的重载值高字节计数初值为 253= $FD sta P_TMR1_PreloadHi lda #143 ; 再设置定时 / 计数器 1 的重载值低字节计数初值为 143= $8F sta P_TMR1_Preload ; PB3 的比较输出频率 Fsys(8Mhz)/128/(65536-$FD8F)/2=50Hz(20ms) 比较器中断 比较中断实际上就是对应 Timer 的定时器溢出中断, 而与比较器相关的中断有 5 个, 如下 : Timer 0 比较中断 Timer 1 比较中断 Timer 2 比较中断 Timer 3 比较中断 Timer 4 比较中断 Timer 5 比较中断 下面是设置 Timer 比较中断的几个步骤 : 1. 执行指令 SEI 关闭总的中断开关 ; 2. 决定采用 8 位还是 16 位的比较模式并选择一个合适的 Timer x (x=0~5); 3. 设置所选的 Timer 的相关寄存器 ; 4. 在寄存器 P_INT_Ctrl1($0F) 中使能该 Timer 的比较中断 ; 5. 执行指令 CLI 打开总的中断开关 ; 6. 设置完毕, 等待比较中断产生 Tel: mcu@sunplus.com.cn 119

126 凌阳 8 位通用单片机 5.6 PWM 模式 SPMC65 系列单片机 Timer 的 PWM 模式 SPMC65 系列单片机的 6 个 Timer 都可以通过相应控制寄存器的设置, 使其工作在 PWM 模式 Timer 作为 PWM 输出使用有三种类型 ( 即对应三种类型的 Timer) 比如,Timer 0/2/4 只能作为 8 位 PWM 输出 ; Timer 1/3 可以输出 12 位 PWM;Timer 5 可以输出 16 位 PWM SPMC65 系列单片机的 PWM 功能简介请参考表 5.20 注 :PWM 输出即输出频率 占空比均可调的方波 表 5.20 SPMC65 系列单片机定时 / 计数器 PWM 功能简介 PWM PWM 输出端口 Timer 0 8 位 与 PB2 复用 Timer 1 12 位 与 PB3 复用 Timer 2 8 位 与 PD3 复用 Timer 3 12 位 与 PD2 复用 Timer 4 8 位 与 PD6 复用 Timer 5 16 位 与 PD7 复用 表 5.21 分频后的几种 PWM 输出频率对照表 PWM 频率 结果 预分频 预分频 预分频 预分频 = F SYS 1 = F SYS 2 = F SYS 4 = F SYS 8 16 位 PWM 122HZ 61HZ 30.5 HZ HZ 12 位 PWM 1.95KHZ 975HZ 487HZ 243.5HZ 11 位 PWM 3.9 KHZ 1.95KHZ 975HZ 487HZ 10 位 PWM 7.8 KHZ 3.9 KHZ 1.95KHZ 975HZ 9 位 PWM 15.6 KHZ 7.8 KHZ 3.9 KHZ 1.95KHZ 8 位 PWM 31.2 KHZ 15.6 KHZ 7.8 KHZ 3.9 KHZ 注 : 系统时钟为 8MHz PWM 模式控制寄存器 SPMC65 系列单片机的 Timer 可通过设置控制寄存器, 来使其工作在 PWM 模式下 ; 设置 Timer 控制 寄存器 0(P_TMRy_z_Ctrl0:y=0,2,4;z=1,3,5) 可选择 PWM 的工作模式, 设置定时 / 计数器控制寄存器 1 (P_TMRy_z_Ctrl1:y=0,2,4;z=1,3,5) 可选择计数频率 控制寄存器 0 和 1 的各个位功能, 以及设置方法请 120 mcu@sunplus.com.cn Tel:

127 第 5 章定时 / 计数器原理及应用 参考前面小节中的介绍 而每一个定时 / 计数器工作在 8/12/16 位 PWM 模式下时, 都有对应的周期值寄存器 占空比值寄存器 而在三类 PWM 模式中, 只详细介绍每种类型 PWM 模式对应的其中一个定时 / 计数器的 PWM 模式相关寄存器, 同类型的可以定时 / 计数器的 PWM 相关控制寄存器在功能 设置上是类似的 1,8 位 PWM 模式 Timer x PWM 周期值寄存器 P_TMRx_PWMPeriod(x=0,2,4) Timer 的 PWM 模式为 8 位时, 在一定计数频率的情况下, 可以写入不同的值到 Timer x 的 PWM 周期值寄存器 (P_TMRx_PWMPeriod), 以改变所输出 PWM 信号的周期 P_TMRx_PWMPeriod 寄存器默认初始值为 #00h, 该寄存器具体功能请参考表 5.22: 表 5.22 Timer x PWM 周期值寄存器 P_TMRx_PWMPeriod Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 TxPP7 TxPP6 TxPP5 TxPP4 TxPP3 TxPP2 TxPP1 TxPP0 R/W R/W R/W R/W R/W R/W R/W R/W Bit [7:0]: TxPP [7:0]:Timer x PWM 周期值 TxPP [7:0] (8 位 PWM 模式 ) Timer x PWM 占空比寄存器 P_TMRx_PWMDuty(x=0,2,4) Timer x PWM 占空比寄存器 (P_TMRx_PWMDuty), 设置 PWM 输出信号的占空比, 该寄存器默认初 始值为 #00h, 其具体的功能请参考 : 表 5.23 Timer x PWM 占空比寄存器 P_TMRx_PWMDuty Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 TxPD7 TxPD6 TxPD5 TxPD4 TxPD3 TxPD2 TxPD1 TxPD0 R/W R/W R/W R/W R/W R/W R/W R/W Bit [7:0] TxPD [7:0]: Timer x PWM 占空比值 TxPD [7:0] (8 位 PWM 模式 ) 注 :Timer 工作在 8 位 PWM 模式下, 使能 8 位 PWM 模式时, 先写寄存器 P_TMRx_PWMDuty, 再写寄存器 P_TMRx_PWMPeriod 2,12 位 PWM 模式 Timer x PWM 周期值低字节寄存器 P_TMRx_PWMPeriod(x=1,3) Timer 的 PWM 模式为 12 位时, 除了有低字节的周期值寄存器 占空比值寄存器外, 还占用了一个字节的寄存器, 为周期值和占空比值的高 4 位共用 定时 / 计数器 1 的这 3 个寄存器默认初始值为 #00h, 其具体功能请参考下面的表 表 5.24 Timer x PWM 周期值低字节寄存器 P_TMRx_PWMPeriod Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 TxPP7 TxPP6 TxPP5 TxPP4 TxPP3 TxPP2 TxPP1 TxPP0 R/W R/W R/W R/W R/W R/W R/W R/W Bit [7:0] TxPP [7:0]:Timer x PWM 周期值的低字节 TxPP [7:0] (12 位 PWM 模式 ) Tel: mcu@sunplus.com.cn 121

128 凌阳 8 位通用单片机 Timer x PWM 占空比 / 周期值高 4 位寄存器 P_TMRx_DutyPeriod(x=1,3) 表 5.25 Timer x PWM 占空比 / 周期值高 4 位寄存器 P_TMRx_DutyPeriod Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 TxPD11 TxPD10 TxPD9 TxPD8 TxPP11 TxPP10 TxPP9 TxPP8 R/W R/W R/W R/W R/W R/W R/W R/W Bit [7:4] TxPD [11:8]:Timer x PWM 占空比值的高 4 位 TxPD [11:8] (12 位 PWM 模式 ) Bit [3:0] TxPP [11:8]:Timer x PWM 周期值的高 4 位 TxPP [11:8] (12 位 PWM 模式 ) Timer x PWM 占空比值低字节寄存器 P_TMRx_PWMDuty(x=1,3) 表 5.26 Timer x PWM 占空比值低字节寄存器 P_TMRx_PWMDuty Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 TxPD7 TxPD6 TxPD5 TxPD4 TxPD3 TxPD2 TxPD1 TxPD0 R/W R/W R/W R/W R/W R/W R/W R/W Bit [7:0] TxPD [7:0]: Timer x PWM 占空比值的低字节 TxPD [7:0] (12 位 PWM 模式 ) 注 : 写入数据顺序要按照从高字节到低字节的顺序写 12 位 PWM 模式如 : 更新周期值时, 先写 P_TMR1_DutyPeriod, 然后再写 P_TMR1_PWMPeriod 更新占空比时, 先写 P_TMR1_DutyPeriod, 然后再写 P_TMR1_PWMDuty 3,16 位 PWM 模式 Timer 5 的 PWM 模式为 16 位的, 其周期值 占空比值寄存器各占两个字节, 分别用于存放高字节 低字节的数值 ; 这 4 个寄存器默认初始值为 #00h Timer 5 PWM 周期值低字节寄存器 P_TMR5_PWMPeriodLo($23,R/W) Timer 5 PWM 周期值高字节寄存器 P_TMR5_PWMPeriodHi($24,R/W) Timer 5 PWM 占空比值低字节寄存器 P_TMR5_PWMDutyLo($25,R/W) Timer 5 PWM 占空比值高字节寄存器 P_TMR5_PWMDutyHi($5F,R/W) 注 : 写入数据顺序要按照从高字节到低字节的顺序写 16 位 PWM 模式如 : 更新周期值时, 先写 P_TMR5_DutyPeriodHi, 然后再写 P_TMR5_PWMPeriodLo 更新占空比时, 先写 P_TMR5_DutyPeriodHi, 然后再写 P_TMR5_PWMDutyLo 位 PWM 工作模式 SPMC65 系列单片机中,Timer 0/2/4 属于第一种 ( 类型 I) 8 位 PWM 当 TxFS[2:0] 设置为 111 后,Timer x 就工作在 8 位 PWM 模式下, 相应的管脚 ( 例如, 定时 / 计数器 0 对应 PB2) 自动成为 PWM 输出管脚 PWM 周期在寄存器 P_TMRx_PWMPeriod 中设置 ; 占空比在寄存器 P_TMRx_PWMDuty 中设置 ; 在 8 位 PWM 模式下, 使能 8 位 PWM 功能后用户必须首先写寄存器 P_TMRx_PWMDuty, 然后再写寄存器 122 mcu@sunplus.com.cn Tel:

129 第 5 章定时 / 计数器原理及应用 P_TMRx_PWMPeriod 时钟的分频系数由 TxPSS[2:0] 位选择 当 PWM 使能后, 计数器载入计数初值 (P_TMRx_PWMPeriod 的值 ), 开始计数, 同时, 相应的管脚输出低电平 在计数过程中, 计数值不断的和占空比值 (P_TMRx_PWMDuty 的值 ) 进行比较, 相等时,PWM 管脚输出电平翻转, 为高电平 计数器继续计数, 直到溢出, 此时一个周期的方波输出完成 接着,PWM 管脚再次翻转, 输出低电平, 计数器重新载入计数初值开始计数, 产生下一个 PWM 输出, 依次不断循环 如图 5.15 所示为 8 位 PWM 模式原理框图 PWM 周期和占空比计算如下 : If PRDREG= 周期值寄存器数值 DUTYREG= 占空比值寄存器数值 T_TMRx= Timer x(x=0,2,4) 预分频后计数时钟周期 Then PWM 周期 =[$100H-PRDREG]*T_TMRx PWM 占空比 =[$FFH-DUTYREG]*T_TMRx TzFS2 TzFS1 TzFS0 TyFS2 TyFS1 TyFS0 P_TMRy_z_Ctrl1 - TzPSS2 TzPSS1 TzPSS0 - TyPSS2 TyPSS1 TyPSS0 P_TMRx_PWMPeriod TxPP7 TxPP6 TxPP5 TxPP4 TxPP3 TxPP2 TxPP1 TxPP0 P_TMRx_PWMDuty TxPD7 TxPD6 TxPD5 TxPD4 TxPD3 TxPD2 TxPD1 TxPD0 P_TMRy_z_Ctrl0 - - PWM 占空比值 P_TMRx_PWMDuty Timer x 使能 0 : 停止 1 : 重载 & 开始 Compare 计数频率 EN Timer SYS_CLK D SET Q PWM 输出 CLR Q PWM 周期值 P_TMRx_PWMPeriod TxFS0 TxFS1 TxFS2 Timer x 使能 溢出检测 Timer x 中断 注 : 1. x : 0, 2, 4, y : 0, 2, 4, z : y+1 2. TxPSS : Timer x 预分频 3. TxFS : Timer x 模式选择 4. TxPD : Timer x PWM 占空比值 5. TxPP : Timer x PWM 周期值 6. SYS_CLK : 系统时名目 图 位 PWM 模式原理框图 Tel: mcu@sunplus.com.cn 123

130 凌阳 8 位通用单片机 Timer x 计数频率 计数器 P_TMRx_PWMPeriod P_TMRx_PWMDuty FF F7 F8 F9 FA FB FC FD FE FF F7 F8 F9 FA FB FC FD FE FF F7 F7 FC PWM 输出 中断 周期 占空比 例 6-10 : 将 Timer 0 设置为 8 位 PWM 模式 图 位 PWM 操作时序 lda # B ; 设置 Timer 0 计数频率为 Fcs/8 sta P_TMR0_1_Ctrl1 lda # B ; 将 Timer 0 设置为 8 位 PWM 模式 sta P_TMR0_1_Ctrl0 lda #178 sta P_TMR0_PWMDuty ; 在 PB2 管脚上输出占空比 ( ) / 256 ~= 30% lda #$00 sta P_TMR0_PWMPeriod ; PWM 频率 = 8.0MHz / (256 x 8) = 3.9 KHz 位 PWM 工作模式 SPMC65 系列单片机中,Timer 1/3 属于第二种 ( 类型 II) 12 位 PWM 当 TxFS[2:0] 设置为 111 后,Timer x 就成为 12 位 PWM 发生器, 相应的管脚 ( 如 :Timer 1 对应 PB3) 自动成为 12 位 PWM 输出管脚 PWM 周期在寄存器 P_TMRx_PWMPeriod 和 P_TMRx_DutyPeriod [3:0] 中设置 ; 占空比在寄存器 P_TMRx_DutyPeriod [7:4] 和 P_TMRx_PWMDuty. 中设置 ; 时钟的分频系数由 TxPSS[2:0] 位选择 当 PWM 使能后, 计数器载入计数初值 (P_TMRx_PWMPeriod 的值 ), 开始计数, 同时, 相应的管脚输出低电平 在计数过程中, 计数值不断的和占空比值 {P_TMRx_DutyPeriod [7:4], P_TMRx_PWMDuty [7:0]} 进行比较, 相等时,PWM 管脚输出电平翻转, 为高电平 计数器继续计数, 直到溢出, 此时一个周期的方波输出完成 接着,PWM 管脚再次翻转, 输出低电平, 计数器重新载入计数初值开始计数, 产生下一个 PWM 输出, 依次不断循环 一般 8 位 CPU, 总线宽度为 8 位, 通常无法直接访问 16 位的数据 因此, 在 12 位 PWM 模式下, 用户需要先写入高字节寄存器 P_TMRx_DutyPeriod (MSB byte) 并被缓冲器自动保存, 然后再写入低字节 P_TMRx_PWMPeriod ( 周期 ) / P_TMRx_PWMDuty ( 占空比 ), 直到 12 位数据全部写入, 缓冲器的值才会直正载入到寄存器当中, 这样缓冲器中的高字节和低字节将会同时载入定时 / 计数器 x 中去 注 :x=1,3 如图 5.17 所示为 12 位 PWM 模式原理框图 PWM 周期和占空比计算公式如下 : 124 mcu@sunplus.com.cn Tel:

131 第 5 章定时 / 计数器原理及应用 If PRDREG={P_TMRx_DuyPeriod [3:0], P_TMRx_PWMPeriod [7:0]} DUTYREG={P_TMRx_DuyPeriod [7:4], P_TMRx_PWMDuy [7:0]} T_TMRx = Timer x(x=1,3) 预分频后计数时钟周期 Then PWM PERIOD=[$1000H-PRDREG]* T_TMRx PWM DUTY=[$FFFH-DUTYREG]* T_TMRx TzFS2 TzFS1 TzFS0 TyFS2 TyFS1 TyFS0 P_TMRy_z_Ctrl1 - TzPSS2 TzPSS1 TzPSS0 - TyPSS2 TyPSS1 TyPSS0 P_TMRx_PWMPeriod TxPP7 TxPP6 TxPP5 TxPP4 TxPP3 TxPP2 TxPP1 TxPP0 P_TMRx_DutyPeriod TxPD11 TxPD10 TxPD9 TxPD8 TxPP11 TxPP10 TxPP9 TxPP8 P_TMRx_PWMDuty TxPD7 TxPD6 TxPD5 TxPD4 TxPD3 TxPD2 TxPD1 TxPD0 P_TMRy_z_Ctrl0 - - Timer x 使能 0 : 停止 1 : 重载 & 开始 PWM 占空比值 P_TMRx_DutyPeriod [7:4], P_TMRx_PWMDuty Compare 计数频率 EN Timer 系统频率 D SET Q PWM_ 输出 CLR Q Timer x 中断 TxFS0 TxFS1 TxFS2 PWM 周期值 P_TMRx_DutyPeriod [3:0], P_TMRx_PWMPeriod Timer x 使能 溢出检测 注 : 1. x : 1, 3, y : 0, 2, z : y+1 2. TxPSS : Timer x 预分频 3. TxFS : Timer x 模式选择 4. TxPD : Timer x PWM 占空比值 5. TxPP : Timer x PWM 周期值 图 位 PWM 输出原理框图 Tel: mcu@sunplus.com.cn 125

132 凌阳 8 位通用单片机 Timer x 计数频率 P_TMRx_DutyPeriod P_TMRx_PWMPeriod P_TMRx_DutyPeriod P_TMRx_PWMDuty C30 E00 P_TMRx_CountHi P_TMRx_Count FFF E00 FFF E00 PWM 输出 Timer x 中断 例 6-11 : 将定 Timer 1 设置为 12 位 PWM 模式 图 位 PWM 操作時序 lda # B ; 将 Timer 1 设置为 12 位 PWM 模式 sta P_TMR0_1_Ctrl0 lda # B ; 设置 Timer 1 的计数频率为 : Fsys/8 sta P_TMR0_1_Ctrl1 lda #$70 sta P_TMR1_DutyPeriod ; PWM 占空比 $7FF,PWM 周期 $1000 lda #$00 sta lda P_TMR1_PWMPeriod #$FF sta P_TMR1_PWMDuty ; 在 PB3 管脚产生 244Hz 50% 佔空比的 PWM 输出 位 PWM 工作模式 SPMC65 系列单片机中,Timer 5 属于第三种 ( 类型 III) 16 位 PWM 当 T5FC [2:0] 设置为 111 后, Timer 5 就成为 16 位 PWM 发生器, 相应的管脚 PD7 自动成为 16 位 PWM 输出管脚 PWM 周期在寄存器 P_TMR5_PWMPeriodLo ($23) 和 P_TMR5_PWMPeriodHi ($24) 中设置 ; 占空比在寄存器 P_TMR5_PWMDutyLo ($25) 和 P_TMR5_PWMDutyHi ($5F) 中设置 ; 时钟的分频系数由 T5PSS [2:0] 位选择 当 PWM 使能后, 计数器载入计数初值 { P_TMR5_PWMPeriodHi, P_TMR5_PWMPeriodLo}, 开始计数 同时, 管脚 PD7 输出低电平 在计数过程中, 计数值不断的和占空比值 {P_TMR5_PWMDutyHi, P_TMR5_PWMDutyLo} 进行比较, 相等时,PWM 管脚输出电平翻转, 为高电平 计数器继续计数, 直到溢出, 此时一个周期的方波输出完成 接着,PWM 管脚再次翻转, 输出低电平, 计数器重新载入计数初值开始计数, 产生下一个 PWM 输出, 依次不断循环 一般 8 位 CPU, 总线宽度为 8 位, 通常无法直接访问 16 位的数据 因此, 在 16 位 PWM 模式下, 周期值寄存器和占空比值寄存器也分别占用了高字节寄存器 (MSB byte) 和低字节寄存器 (LSB byte); 在设置周期值寄存器和占空比值寄存器时, 也需要按照先写高字节寄存, 然后再写低字节寄存器的顺序 如图 5.19 所示为 16 位 PWM 输出原理框图 而 Timer 5 的 PWM 模式的操作时序与其它类型 PWM 模 126 mcu@sunplus.com.cn Tel:

133 第 5 章定时 / 计数器原理及应用 式的类似, 具体可以参考前面有 8/12 位 PWM 模式的介绍 PWM 周期和占空比计算公式如下 : If PRDREG={P_TMR5_PWMPeriodHi, P_TMR5_PWMPeriodLo} DUTYREG={P_TMR5_PWMDutyHi, P_TMR5_PWMDutyLo} T_TMR5= Timer5 预分频后计数时钟周期 Then PWM 周期 =[$10000H-PRDREG]* T_TMR5 PWM 占空比 =[$FFFF-DUTYREG]* T_TMR5 T5FS2 T5FS1 T5FS0 T4FS2 T4FS1 T4FS0 P_TMR4_5_Ctrl1 - T5PSS2 T5PSS1 T5PSS0 - T4PSS2 T4PSS1 T4PSS0 P_TMR5_PWMPeriodLo T5PP7 T5PP6 T5PP5 T5PP4 T5PP3 T5PP2 T5PP1 T5PP0 P_TMR5_PWMPeriodHi T5PP15 T5PP14 T5PP13 T5PP12 T5PP11 T5PP10 T5PP9 T5PP8 P_TMR5_PWMDutyLo T5PD7 T5PD6 T5PD5 T5PD4 T5PD3 T5PD2 T5PD1 T5PD0 P_TMR4_5_Ctrl0 - - P_TMR5_PWMDutyHi T5PD15 T5PD14 T5PD13 T5PD12 T5PD11 T5PD10 T5PD9 T5PD8 Timer5 使能 0 : 停止 1 : 重载 & 开始 PWM 占空比值 P_TMR5_PWMDutyHi, P_TMR5_PWMDutyLo Compare 计数频率 EN Timer 系统频率 D SET CLR Q Q PWM 输出 T5FS0 T5FS1 T5FS2 PWM 周期值 P_TMR5_PWMPeriodHi, P_TMR5_PWMPeriodLo Timer5 使能 溢出检测 PS: 1. T5PSS : Timer5 预分频 2. T5FS : Timer5 模式选择 3. T5PD : Timer5 PWM 占空比值 4. T5PP : Timer5 PWM 周期值 5. SYS_CLK : 系统频率 Timer5 中断 图 位 PWM 输出原理框图 例 6-12 : 将 Timer 5 设置为 16 位 PWM 模式 lda # B ; 将 Timer5 时钟源设置为 Fcs/1 sta P_TMR4_5_Ctrl1 lda # B ; 将 Timer 5 设置为 16 位 PWM 功能 sta P_TMR4_5_Ctrl0 lda #$A0 sta P_TMR5_PWMDutyHi lda #$00 Tel: mcu@sunplus.com.cn 127

134 凌阳 8 位通用单片机 sta P_TMR5_PWMDutyLo ; 在 PD7 输出 PWM 波形, ; 占空比 = (0xFFFF-0xA000)/(0x x8000)~= 75% lda #$80 sta P_TMR5_PWMPeriodHi lda #$00 sta P_TMR5_PWMPeriodLo ; PWM 频率 = 8.0MHz / (0x x8000) ~= 244 Hz PWM 中断与 PWM 操作相关的中断如下 : Timer 0 溢出中断 Timer 1 溢出中断 Timer 2 溢出中断 Timer 3 溢出中断 Timer 4 溢出中断 Timer 5 溢出中断 下面是设置 PWM 中断的几个步骤 : 1. 执行指令 SEI 关闭总的中断开关 ; 2. 决定采用 8 位还是 12 位或是 16 位的 PWM 方式并选择一个合适的 Timer; 3. 设置与 PWM 操作相关寄存器 ; 4. 在寄存器 P_INT_Ctrl1($000Fh) 中使能该 Timer 溢出中断 (PWM 中断 ); 5. 执行指令 CLI 打开总的中断开关 ; 6. 设置完毕, 等待 PWM 中断产生 SPMC65 系列单片机的 PWM 中断应用可参考对应定时 / 计数器的中断应用 128 mcu@sunplus.com.cn Tel:

135 第 6 章串行接口原理及应用 第 6 章串行接口原理及应用 6.1 SPMC65 系列单片机的串行接口 SPMC65 系列单片机共提供了三种串行接口模块, 即 : SPI(Serial Peripheral Interface) 串行外设接口 ; 标准全双工 UART 通用异步收发器 ; IIC(Inter-Integrated Circuit) 内部集成电路总线 用户可以方便地使用 SPMC65 提供的串行接口模块, 与各种串行外设进行通讯 数据交换等 ; 常用的就有 24 系列 EEPROM 单片机之间 UART 组网通讯 单片机与 PC 机进行串行通讯等 SPMC65 系列单片机的三种串行接口模块与端口 C 复用端口, 具体分布如表 7.1 表 6.1 端口 C 特殊功能复用对照 管脚 PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0 特殊功能 IIC 总线数据输入 / 输出 IIC 总线时钟输入 UART 接收信号 UART 发送信号 SPI 数据输出 SPI 数据输入 SPI 时钟输出 / 时钟输入 SPI 从机模式选择 具体型号芯片的串行接口资源请参考具体型号芯片的数据手册, 如在 SPMC65P2408A 中集成了 SPI 和 UART 两个串行接口模块 6.2 SPI 接口 SPI 接口简述 SPI(Serial Peripheral Interface) 即串行外设接口, 是一种高速同步的串行接口, 可以串行接收或发送数据, 支持主从机之间的全双工同步传输, 传输速率可编程设定 在 SPMC65 系列单片机中,SPI 模块有 4 个管脚 ( 与端口 C 的低 4 位复用 ), 支持主模式和从模式 许多参数都可编程设定, 如工作模式 传输速率 时钟相位和极性等 SPI 模块具有以下特性 : 四个接口管脚 SDO: 数据输出管脚 ( 与 PC3 复用 ) SDI: 数据输入管脚 ( 与 PC2 复用 ) SCK: 时钟输入 / 输出管脚 ( 与 PC1 复用 ) Tel: mcu@sunplus.com.cn 129

136 凌阳 8 位通用单片机 SSB: 从机选择管脚 ( 与 PC0 复用 ) 支持全双工同步传输 两种工作模式 : 主模式 从模式 波特率 :8 种可编程传输速率,CPU 时钟在 8 MHz 时, 最大可达 2Mbps 每次发送或接收的数据长度 :8 位 时钟相位和极性的可编程设定 数据采样时刻选择 : 可在数据输出中或数据输出末尾进行采样 SPI 接收 / 发送缓冲器大小为 1 个字节下图为 SPMC65 系列单片机的 SPI 串行接口功能框图 : SMSEN SSB SPIIEN SPIIF 中断请求 MOD 控制器 (FSM) TX 缓存器 SPIEN FERR TXBF 移位寄存器 SDO 串行时钟发生器 RX 缓存器 SCK 采样 0 1 移位寄存器 采样 SDI MOD 图 6.1 SPI 串行接口功能框图 SPI 接口经常用于和 EEPROM 进行通讯 如图 6.2 即为 SPMC65 系列单片机与 93C46 通讯的应用电路 VDD SPMC65 系列单片机 PC3(SDO) PC2(SDI). 10k 10k. DO DI 93C46 VCC VDD PC1(SCK) PC0 GND. SK CS GND ORG 图 6.2 SPI 应用电路图 控制寄存器 SPI 控制寄存器 0 P_SPI_Ctrl0($38,R/W) 130 mcu@sunplus.com.cn Tel:

137 第 6 章串行接口原理及应用 写 SPI 控制寄存器 0 P_SPI_Ctrl0($38) 可以完成 SPI 模块的使能控制 主 / 从模式选择 时钟信号特性设置, 以及 SPI 通讯时钟频率选择等 ; 该寄存器默认初始值为 #00h 有关 SPI 控制寄存器 0 的功能请参考表 6.2 表 6.2 SPI 控制寄存器 0 P_SPI_Ctrl0($38,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 SPIEN MOD SCKPHA SCKPOL SMS SCKSEL2 SCKSEL1 SCKSEL0 R/W R/W R/W R/W R/W R/W R/W R/W Bit 7 SPIEN:SPI 使能位 该位置 1 后 PC[3:0] 即作为 SPI 通讯接口 1= 使能 SPI 功能 0= 禁止 SPI 功能 Bit 6 MOD:SPI 运行模式 1= 从机模式 0= 主机模式 Bit 5 Bit 4 Bit 3 SCKPHA:SPI 时钟相位选择, 见 SPI 主模式时序 SCKPOL:SPI 时钟极性选择, 见 SPI 主模式时序 SMS: 主机采样模式选择 1= 输入数据输出末尾段进行采样 0= 输入数据输出中部进行采样 Bit [2:0] SCKSEL[2:0]: 主模式时钟选择位 111 = F SYS = F SYS = F SYS = F SYS = F SYS = F SYS = F SYS = F SYS 4 F SYS : 系统时钟频率 SPI 控制寄存器 1 P_SPI_Ctrl1($39,R/W) 而 SPI 模块的从模式的设置, 以及采样时钟频率的选择等, 可以通过写 SPI 控制寄存器 1 P_SPI_Ctrl1 ($39) 完成设置 而采样时钟的目的是为了防止在接收数据时受到尖脉冲的干扰, 但是低的采样率会影响通信速度 ; 建议 : 采样时钟频率 >= 4 X SPI 时钟频率 SPI 控制寄存器 1 默认初始值为 #02h; 该寄存器各位的功能请参考表 6.3 Tel: mcu@sunplus.com.cn 131

138 凌阳 8 位通用单片机 表 6.3 SPI 控制寄存器 1 P_SPI_Ctrl1($39,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 SMSEN SWRST SPISPCLK1 SPISPCLK0 R/W R/W R/W R/W Bit 7 SMSEN:SPI 从模式选择输入 1= PC0 作为 SSB 输入管脚 (SSB: 从模式选择, 低有效 ) 0= PC0 作为通用 IO 管脚 Bit 6 SWRST:SPI 软件复位 写 : 1= 产生脉冲复位 SPI 模块 ( 寄存器设置除外 ) 0= 无效读 : 总为 0 Bit [5:2] 保留 Bit [1:0] SPISPCLK [1:0]: 采样时钟选择位 11= F SYS 4 10= F SYS 2 01= F SYS 00= 不采样 F SYS : 系统时钟频率 SPI TX/RX 状态寄存器 P_SPI_Status($3A,R/W) SPMC65 系列单片机的 SPI 模块提供了发送和接收中断, 可以通过读取 SPI TX/RX 状态寄存器 P_SPI_Status($3A) 查询 SPI 模块的中断标志 ; 而写 SPI TX/RX 状态寄存器可以设置 SPI 中断的使能 清除 SPI 中断标志 该寄存器默认初始值为 #00h, 具体各个位的功能请参考表 6.4 表 6.4 SPI TX/RX 状态寄存器 P_SPI_Status($3A,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 SPIIF SPIIEN TXBF BUFFull R/W R/W R R Bit 7 SPIIF:SPI 中断标志读 : 1= 有 SPI 中断发生 0= 无 SPI 中断发生写 : 1= 清除标志 0= 无效 132 mcu@sunplus.com.cn Tel:

139 第 6 章串行接口原理及应用 Bit 6 Bit 5 SPIIEN:SPI 中断使能位 1= 使能 0= 禁止 TXBF: 发送缓冲器满标志位 1= 发送缓冲器满 0= 发送缓冲器空 Bit [4:1] 保留 Bit 0 BUFFull: 接收缓冲器满并覆盖标志位 1= 覆盖 0= 接收缓冲器工作正常注 : 当前 SPI 接收到一个完整的数据时, 会把接收缓冲器中上次接收到的数据覆盖, 此时将 BUFFull 标志位置位 ; 若上次接收到的数据被读取, 则该标志位清零 SPI 发送缓冲器 P_SPI_TxData($3B,R/W) SPMC65 系列单片机的 SPI 模块提供了发送和接收数据的缓冲器, 这两个寄存器默认初始值都为 #00h, 发送缓冲器的具体功能请参考下表 6.5: 表 6.5 SPI 发送缓冲器 P_SPI_TxData($3B,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 SPITXDATA7 SPITXDATA6 SPITXDATA5 SPITXDATA4 SPITXDATA3 SPITXDATA2 SPITXDATA1 SPITXDATA0 R/W R/W R/W R/W R/W R/W R/W R/W Bit [7:0] SPITXDATA:SPI 发送数据 读 : 总为 #00h 写 : 发送数据 SPI 接收缓冲器 P_SPI_RxData($3C,R/W) 表 6.6 SPI 接收缓冲器 P_SPI_RxData($3C,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 SPIRXDATA7 SPIRXDATA6 SPIRXDATA5 SPIRXDATA4 SPIRDATA3 SPIRXDATA2 SPIRXDATA1 SPIRXDATA0 R/W R/W R/W R/W R/W R/W R/W R/W Bit [7:0] SPIRXDATA:SPI 接收数据 读 : SPI 接收数据 写 : 无效 工作机制主模式 (Master Mode) 在主模式下, 移位时钟 SCK 由 SPI 模块产生 在寄存器 P_SPI_Ctrl0 中有两个分别控制时钟相位 (SCKPHA) 和极性 (SCKPOL) 的控制位 当向 P_SPI_TxData 寄存器写入数据时, 发送立即开始 另外如果用户想要接收从机数据,SDI 管脚 (PC2) 可以设置为悬浮输入状态 SPMC65 系列单片机支持 SPI 模块的接收和发送中断 在寄存器 P_SPI_Status 中将 SPIIEN 位置 1 可同时使能收发中断 同样, 在收发中断 Tel: mcu@sunplus.com.cn 133

140 凌阳 8 位通用单片机 服务程序结束后需要清除 SPIIF 标志位 在软件向寄存器 P_SPI_TxData 写入一个字节之后, 数据被锁存到寄存器的内部发送缓冲器中 如果此时移位寄存器是空的, 该数据将被载入到移位寄存器中并在下一个 SCK 相位时开始传输 如果移位寄存器正在执行数据移位 ( 由 P_SPI_TxStatus 寄存器中的 TXBF 标志得知 ), 新数据会等待当前的数据移出后才可以载入进行移位 SPI 通过 SDO 管脚将数据从最高有效位 (MSB) 开始移出, 直到最低有效位 (LSB) 也被移出 8 位数据在 8 个 SCK 周期后全部移出 同时, 接收的数据也通过 SDI 引脚移入 当每组 8 位发送完成后,P_SPI_Status 寄存器中的 SPIIF 置 1 ; 此外, 如果寄存器 P_SPI_Status 中的 SPIIEN 位被设置为 1, 会产生一个 SPI 发送中断 相反的, 当 SPI 接口成功地接收了一组 8 位数据时, 接收到的数据将被锁存到接收缓冲器中 此时, P_SPI_Status 寄存器中的 SPIIF 位将被设置为 1, 如果 P_SPI_Status 寄存器中的 SPIIEN 位被设置为 1, 会产生一个 SPI 接收中断 图 6.3 给出了 SPI 主机模式下不同运行类型的时序 ( 极性控制位等于 1 或 0, 相位控制位等于 1 或 0, 取样控制位等于 1 或 0 ) 缓冲器载入数据到 Tx_BUF SCK(SCKPHA=0, SCKPOL=0) SCK(SCKPHA=0, SCKPOL=1) SCK(SCKPHA=1, SCKPOL=0) SCK(SCKPHA=1, SCKPOL=1) SDO D7 D6 D5 D4 D3 D2 D1 D0 SDI ( case. 1 ) D7 D6 D5 D4 D3 D2 D1 D0 SDI ( case. 2 ) D7 D6 D5 D4 D3 D2 D1 D0 取样 (SPISMPS=0) 取样 (SPISMPS=1) 图 6.3 SPI 主模式时序 从模式 (Slave Mode) 在从机模式下, 移位时钟 SCK 来自外部 SPI 主设备, 所以第一个外部时钟周期开始传输 发送前, 软件应在第一个来自主设备的 SCK 之前向其发送缓冲写入数据 主设备与从设备都必须按相同的 SCK 相位和极性运行, 以进行数据的发送与接收 如果时钟相位 (SCKPHA) 为 1, 只要向 P_SPI_TxData 寄存器写入数据, 就开始移出的第一个数据位 如果时钟相位 (SCKPHA) 为 0, 则在第一个 SCK 边沿后才开始移出的第一个数据位 SPI 从模式时序请参考图 6.4: 134 mcu@sunplus.com.cn Tel:

141 第 6 章串行接口原理及应用 注 : 图中 SSB 为 SPI 从机选择信号, 由主机发出, 从机接收到 SSB 信号后启动 SPI 载入数据到 TxData SCK(SCKPOL=0 SCKPHA=0) SCK(SCKPOL=1 SCKPHA=0) SCK(SCKPOL=0 SCKPHA=1) SCK(SCKPOL=1 SCKPHA=1) SDO D7 D6 D5 D4 D3 D2 D1 D0 SDI D7 D6 D5 D4 D3 D2 D1 D0 取样 中断信号 SSB 图 6.4 SPI 从模式时序图 SPI 中断与 SPI 相关的中断有两个 :SPI 发送中断和接收中断 因为 SPI 为全双工通讯, 因此这两个中断同时发生, 并且共用一个中断标志位 SPI 发送中断 SPI 接收中断设置 SPI 中断需要以下步骤 : 1. 用 SEI 指令关闭总的中断开关 ; 2. 使能 SPI 模块, 配置相关寄存器 ; 3. 在 P_SPI_Status($3A) 寄存器中将 SPIIEN 位置 1, 使能 SPI 中断 ; 4. 用 CLI 指令打开总的中断开关 ; 5. 等待中断产生 应用举例 SPI 采样时钟选择计算公式 1. SPI 时钟计算公式用下面的公式计算采样时钟, 以保证获得正确的数据 采样时钟频率 >= 4 X SPI Clock 例 : SPI 时钟频率 =1MHz(PC1), F SYS =8MHz 采样时钟频率 >= 4X1MHz = 4MHz Tel: mcu@sunplus.com.cn 135

142 凌阳 8 位通用单片机 采样时钟必须大于 4Mhz 才能保证从机数据接收正确 因此, 采样时钟选择位 (SPISPCLK [1:0]) 宜设置为 2 采样时钟频率 =8MHz/2=4Mhz IO 设置对照 SPI 在主 / 从模式下工作时, 端口 C 的设置请参考表 6.7: 表 6.7 SPI 功能复用端口设置 SPI 运行在主模式下 SPI 运行在从模式下 PC0(SS) 输出 PC0(SS) 悬浮输入 PC1(SCK) 输出 PC1(SCK) 悬浮输入 PC2(SDI) 悬浮输入 PC2(SDI) 悬浮输入 PC3(SDO) 输出 PC3(SDO) 悬浮输入 例 7-1 :SPI 在主模式下运行 ( 初始化 ) lda # B sta P_IOC_Data lda # B ; 将 SDI 接口 PC2 设置为悬浮输入 sta P_IOC_Attrib lda # B sta P_IOC_Dir lda #$AF ; 使能 SPI, 设置为主模式,Clock= Fsys(8MHz)/128= 62.5KHz sta P_SPI_Ctrl0 lda #$43 ; PC0 为 GPIO, 软件复位 SPI, 采样时钟 = Fsys/4(must >= 4* SPI clock) sta P_SPI_Ctrl1 lda # B ; 使能 SPI 中断, 清除 SPI 中断标志 sta P_SPI_Status 例 7-2 :SPI 主模式下发送数据 L_TestSPIL7: lda # B ; 清除 SPI 中断标志 sta P_SPI_Status lda T_SPI_Data,X ; 从用户定义 ROM 表中得到发送数 sta P_SPI_TxData ; 发送数据 L_TestSPIL71: lda P_SPI_Status and # B ; 查询 SPI 发送是否结束 beq L_TestSPIL71 ; 没有 inx cpx #4 ; 查询数据字节是否发送完毕 136 mcu@sunplus.com.cn Tel:

143 第 6 章串行接口原理及应用 bne L_TestSPIL7 ; 没有 T_SPI_Data: DB # B ; 开始位 DB # B ; 写入地址 1 DB #$55 DB #$AA 例 7-3 :SPI 主模式下接收数据 lda #$00 ; 发送测试数据 sta P_SPI_TxData L_TestSPIL5: lda P_SPI_Status and # B ; 查询是否发生 SPI 发送中断 beq L_TestSPIL5 ; 没发生 nop lda P_SPI_RxData ; 读取数据 sta G_MWorkReg1 例 7-4 :SPI 从模式下运行 ( 初始化 ) lda # B sta P_IOC_Data lda # B ; 设置从模式 : 将 PC0~3 设置为悬浮输入 sta P_IOC_Attrib lda # B sta P_IOC_Dir lda #$C0 ; 使能 SPI, 主机模式, Clock= Fsys(8MHz)/128= 62.5KHz sta P_SPI_Ctrl0 lda #$C3 ; PC0 为 GPIO, 软件复位 SPI, 采样时钟 = Fsys/4(sample clock >4* SPI clock) sta P_SPI_Ctrl1 lda # B ; 使能 SPI 中断, 清除 SPI 中断标志 sta P_SPI_Status 6.3 UART 接口 SPMC65 系列单片机的 UART 接口简述 UART 即通用异步收发器, 可配置成全双工异步通讯方式, 与 PC 等通讯 ; 或设置成半双工同步模式与其它周边外设通讯, 如 A/D 或 D/A SPMC65 系列单片机内置了 UART 模块, 它的作用是 : 将外部设备串行数据转换为并行数据接收 ; 将内部并行数据转换为串行数据发送 UART 模块特点如下 : 两个接口管脚 Tel: mcu@sunplus.com.cn 137

144 凌阳 8 位通用单片机 RXD: 数据接收管脚 ( 与 PC5 复用, 使用 RX 功能时设置为输入口 ) TXD: 数据发送管脚 ( 与 PC4 复用, 使用 TX 功能时设置为输出口 ) 提供标准的异步全双工通讯 可编程的波特率 可进行偶校验 奇校验或禁止校验 停止位可设置为 1 位或 2 位 支持发送中断 支持接收中断 高抗噪声能力的数据接收 ( 接收中间连续进行 3 次采样, 并对结果进行多数决策 ) 在接收中进行帧校验和奇偶校验 溢出检测 CPU 工作频率为 8MHz 时, 波特率可在 2400 bps~38400 bps 之间编程设置 UART 的数据帧如图图 6.5 如示 : PEN=0 STOPSEL=0 起始位 D0 D1 D2 D3 D4 D5 D6 D7 停止位 1 PEN=0 STOPSEL=1 起始位 D0 D1 D2 D3 D4 D5 D6 D7 停止位 1 停止位 2 PEN=1 STOPSEL=0 起始位 D0 D1 D2 D3 D4 D5 D6 D7 校验 停止位 1 PEN=1 STOPSEL=1 起始位 D0 D1 D2 D3 D4 D5 D6 D7 校验 停止位 1 停止位 2 图 6.5 UART 数据帧 UART 接口通常用于与 PC 机通讯, 或者用于单片机间的通讯 控制寄存器 UART 控制寄存器 P_UART_Ctrl($46,R/W) 可以通过写 UART 控制寄存器 P_UART_Ctrl($46) 对 UART 的中断使能 UART 功能 帧格式等进行设置 ;P_UART_Ctrl 默认初始值为 #00h, 具体位的功能请参考表 6.8: 表 6.8 UART 控制寄存器 P_UART_Ctrl($46,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 RXIE TXIE RXEN TXEN SOFTRST STOPSEL PSEL PEN R/W R/W R/W R/W R/W R/W R/W R/W Bit 7 Bit 6 RXIE: 接收中断使能位 1= 使能 0= 禁止 TXIE: 发送中断使能位 1= 使能 138 mcu@sunplus.com.cn Tel:

145 第 6 章串行接口原理及应用 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 0= 禁止 RXEN:UART 接收功能使能位 1= 使能 0= 禁止 TXEN:UART 发送功能使能位 1= 使能 0= 禁止 SOFTRST: 软件复位写 : 1= 复位所有 UART 模块 0= 无效 STOPSEL: 停止位长度选择位 1= 2 位停止位 0= 1 位停止位 PSEL: 校验类型选择位 1= 偶校验 0= 奇校验 PEN: 校验使能 1= 使能 0= 禁止 UART 波特率分频器 P_UART_Baud($47,R/W) SPMC65 系列单片机的 UART 波特率可通过软件设置 UART 波特率分频器 P_UART_Baud($47) 的值, 通过换算可得到所需要的 UART 波特率 P_UART_Baud 默认初始值为 #00h, 具体功能请参考表 6.9, 以及后面的说明 表 6.9 UART 波特率分频器 P_UART_Baud($47,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 BaudRate7 BaudRate6 BaudRate5 BaudRate4 BaudRate3 BaudRate2 BaudRate1 BaudRate0 R/W R/W R/W R/W R/W R/W R/W R/W Bit [7:0] BaudRate[7:0]:UART 波特率分频器 SPMC65 系列单片机的 UART 波特率是由一个波特率寄存器和一个 8 位定时 / 计数产生的 每次定时 / 计数器计到最大计数值 (0xFF) 后, 再加 1 时, 一个时钟信号就会被发送到波特率产生电路, 在该电路中, 时钟信号会通过一个 16 分频的计数器, 然后产生波特率 定时 / 计数器溢出后, 会自动重新载入波特率寄存器中的值 波特率寄存器中的内容为 8 位的无符号数,UART 波特率的计算公式如下 : 波特率 = F SYS / [16 X (256 UARTBAUD ) ] 按下面的公式计算 P_UART_Baud 寄存器的值 : UARTBAUD=256 - F SYS / ( 16 X Baud Rate ) Tel: mcu@sunplus.com.cn 139

146 凌阳 8 位通用单片机 注 :UARTBAUD 即 P_UART_Baud 中的值 注 : 波特率计算结果不能大于 表 6.10 UART 波特率对照表 波特率 (bps) P_UART_BBaud 推荐值 (@8MHz) h h 9600 CCh E6h F3h UART 状态寄存器 P_UART_Status($48,R/W) 读取 UART 状态寄存器 P_UART_Status($48) 可获得 UART 运行的一些状态信息, 如 UART 中断标志 帧错误信息等 ; 而写该寄存器的相应位则是清除相应位的标志 P_UART_Status 默认初始值为 #00h, 具体位的功能请参考表 6.11: 表 6.11 UART 状态寄存器 P_UART_Status($48,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 RXIF TXIF BUSY - - OERR PERR FERR R R R - - R/W R/W R/W Bit 7 Bit 6 Bit 5 Bit [4:3] Bit 2 Bit 1 RXIF: 接收中断标志 1= 接收数据准备好 ( 满 ) 0= 接收数据未准备好 TXIF: 发送中断标志 1= 发送数据准备好 ( 空 ) 0= 发送数据未准备好 BUSY:UART 正在进行发送标志位 1= 发送正在进行 0= 发送结束, 等待下一次发送保留 OERR: 溢出错误标志 ( 一般是前一次接收到的数据尚未读取, 而当前又有数据接收进来覆盖原数据而造成的 ) 读 : 1= 发生溢出错误 0= 未发生溢出错误写 : 1= 将标志清零 0= 无效 PERR: 奇偶校验错误标志读 : 140 mcu@sunplus.com.cn Tel:

147 第 6 章串行接口原理及应用 1= 奇偶校验错误 0= 无奇偶校验错误写 : 1= 将标志清零 0= 无效 Bit 0 FERR: 帧错误标志 ( 一般是由于接收不到停止位而产生 ) 读 : 1= 发生帧错误 0= 无帧错误写 : 1= 将标志清零 0= 无效 UART 数据寄存器 P_UART_Data($49,R/W) SPMC65 系列单片机的发送 接收数据寄存器共用 P_UART_Data 一个寄存器 读取 P_UART_Data 寄存器中的值时, 会自动清掉 P_UART_Status 寄存器中的接收中断标志位 ; 而写数据到 P_UART_Data 寄存器时, 会自动把 P_UART_Status 寄存器中的发送中断标志位 ( 即发送准备好标志位 ) 清零 具体位的功能请参考表 6.12: 表 6.12 UART 数据寄存器 P_UART_Data($49,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 DATA7 DATA6 DATA5 DATA4 DATA3 DATA2 DATA1 DATA0 R/W R/W R/W R/W R/W R/W R/W R/W Bit [7:0] 工作机制 UARTDATA [7:0]: UART 数据寄存器 读 : 读取接收到的数据同时 RXIF 标志位清零写 : 将发送数据写入寄存器同时 TXIF 标志位清零 当 UART 模块成功的接收到一个字节的数据后, 会把接收到的数据载入接收缓冲寄存器 (P_UART_Data), 如果此时在 P_UART_Status 中的 RXIE 位为 1, 则会自动将 RXIF 标志位置 1; 之后读取 P_UART_Data 会自动将 RXIF 标志位清零 当 P_UART_Status 中的 TXIE 位为 1 时, 若 TXIF 位置 1 则表示 UART 模块完成数据发送并准备好了进行下一次发送, 如果状态寄存器中 I 标志位为 0( 总中断打开 ) 则会发生一次 UART 发送中断 写数据到 P_UART_Data 寄存器会自动将 TXIF 位清零 BUSY 为只读的标志位, 当其置 1 时代表 UART 模块正在忙, 当传输完成 BUSY 标志位会自动清零 ;P_UART_Status 中的其它标志位还有 OERR PERR FERR, 都为帧错误信息标志, 向对应的寄存器位写入 1 可清除 OERR( 溢出错误标志 ) PERR( 奇偶校验错误标志 ) 与 FERR( 帧错误标志 ) 在软件向 P_UART_Data 寄存器写入数据后,UART 开始发送 UART 在 TX 引脚上发送数据按照以下顺序 : 起始位 8 位数据 ( 低位在前 ) 奇偶校验位( 奇偶校验使能的情况下有效 ) 停止位 发送停止位后再经过两个 CPU 时钟周期, 寄存器 P_UART_Status 中的 TXIF 位被置 1 当 P_UART_Ctrl 寄存器中的 RXEN 位使能接收功能后, 如果 RX 引脚接收到一个开始位的下降沿, 标志着接收数据开始 ; 在停止位时间周期内, 串口检查以下条件 : Tel: mcu@sunplus.com.cn 141

148 凌阳 8 位通用单片机 如果满足 RXIF = 0 且 RXIE = 1 的条件, 寄存器串口向 P_UART_Data 写入接收字节并置 RXIF 位为 1; 不满足, 则丢失接收数据, 不会载入到寄存器 P_UART_Data 中 在停止位时间过了一半之后, 串口开始等待 RX 引脚上的下一个开始位下降沿 UART 中断 : 与 UART 有关的两个中断 : 发送中断 接收中断 注 : 发送中断信号实际上是 发送数据准备好 标志触发的 产生 UART 中断需要以下步骤 : 1. 用 SEI 指令关闭总的中断开关 ; 2. 设置 UART 相关寄存器 ; 3. 在 P_UART_Ctrl($46) 寄存器使能发送 / 接收中断 ; 4. 用 CLI 指令打开总的中断开关 ; 5. 等待中断产生 例 7-5 : 初始化 UART( 发送 ) 中断 lda #$F8 sta P_UART_Ctrl ; 复位 UART 模块 lda # B sta P_UART_Ctrl ; UART 发送使能 发送中断使能 lda # B sta P_UART_Status ; 清 UART 错误标志位 应用举例 例 7-6 :UART 采用查询方式发送一串数据 lda #$00 sta sta P_IOC_Data P_IOC_Attrib lda # B ; 设置 PC5(Rx) 为输入口,PC4(Tx) 为输出口 sta lda P_IOC_Dir #$F8 sta P_UART_Ctrl ; 复位 UART 模块 lda # B sta P_UART_Ctrl ; UART 发送使能 lda # B sta P_UART_Status ; 清 UART 错误标志位 lda #$CC sta P_UART_Baud ; 设置波特率为 9600 bps@8mhz ldx # mcu@sunplus.com.cn Tel:

149 第 6 章串行接口原理及应用 L_TxReady: lda P_UART_Status and # B ; 查询发送准备好标志位状态 beq L_TxReady lda Hello, X beq L_exitTx sta P_UART_Data inx lda # B sta P_UART_Status ; 清 UART 错误标志位 jmp L_TxReady ; 循环 L_exitTx: L_Main: nop jmp L_Main Hello:.BYTE 'Hello World!', 0Ah, 0Dh, 00h 例 7-7 :UART 用查询方式接收数据 ldx #0 L_TestUART1L4: lda P_UART_Status and # B ; 发送数据准备好? beq L_TestUART1L4 ; 没有 lda P_UART_Data ; 接收数据 sta G_RXbuf,X lda P_UART_Status and # B ; 发送数据出错? beq L_TestUART1L5 ; 没有 lda # B ; 清除错误标志 sta P_UART_Status L_TestUART1L5: inx cpx #4 ; 接收数据结束? bne L_TestUART1L4 ; 没有 Tel: mcu@sunplus.com.cn 143

150 凌阳 8 位通用单片机 6.4 IIC 接口 IIC 接口简述 IIC(Inter-Integrated Circuit) 功能即内部集成电路总线 它支持多主机 (multi-master) 通讯机制, 主机之间相互通信或与其它周边通信时使用两根信号线 : 一个串行数据线 (SDA) 和一个串行时钟线 (SCL) 为了避免数据混淆 丢失或阻塞, 主从机之间通讯必须有特定的协议 在多主机的 IIC 总线中, 主机可以向多个从机发送 / 接收串行数据 数据传送由主机发起, 也由主机结束 在一个主机系统中, 也可以有多个主机和多个从机 如果多个主机同时企图控制总线, 仲裁器会决定那个主机拥有最高优先权 总线上最多可连接的设备数由总线上允许的最大电容值 400 pf 决定, 并且还受 IIC 总线最大寻址空间 16 K 限制 SPMC65 系列单片机的 IIC 接口特性如下 : 两个外部管脚 SDA: 数据输入 / 输出管脚 ( 与 PC7 复用 ) SCL: 时钟管脚 ( 与 PC6 复用 ) 支持主机发送 / 接收模式 支持从机发送 / 接收模式 侦测总线仲裁失败 中断发生 可编程的应答信号 (ACK) 主模式下可编程的时钟频率 IIC 接口通常用于和 EEPROM 进行通讯 如图 6.6 所示为 24C01A 和 SPMC65 系列单片机的应用电路 VDD SPMC65 系列单片机 PC6(SCL) PC7(SDA). 10k. 10k 24C01A SCL VCC SDA VDD GND. WP GND 图 6.6 IIC 接口应用电路 控制寄存器 IIC 总线控制寄存器 P_IIC_Ctrl($4A,R/W) 写 IIC 总线控制寄存器 P_IIC_Ctrl($4A) 可以完成对 IIC 接口使能 输出使能 IIC 中断使能等,P_IIC_Ctrl 的低 3 位为 IIC 时钟频率的选择位 P_IIC_Ctrl 默认初始值为 #00h, 寄存器每一位的功能请参考表 6.13: 144 mcu@sunplus.com.cn Tel:

151 第 6 章串行接口原理及应用 表 6.13 IIC 总线控制寄存器 P_IIC_Ctrl($4A,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 IICEN - TXRXEN IICIEN ACKEN SCK2 SCK1 SCK0 R/W - R/W R/W R/W R/W R/W R/W Bit 7 IICEN:IIC 串行接口使能位 1= 使能 IIC 串行接口功能 0= 禁止 IIC 串行接口功能 Bit 6 保留 Bit 5 TXRXEN:IIC 总线数据使能位 1= 使能 0= 禁止 Bit 4 IICIEN:IIC 中断使能位 1= 使能 0= 禁止 Bit 3 ACKEN:IIC 应答使能位 1= 使能应答信号发生 0= 禁止应答信号发生 Bit [2:0] SCK[2:0]:IIC 时钟频率选择位 111= FSYS = FSYS = FSYS = FSYS = FSYS = FSYS = FSYS = FSYS 8 F SYS : 系统时钟频率 IIC 总线状态寄存器 P_IIC_Status($4B,R/W) 写 IIC 总线状态寄存器 P_IIC_Status($4B) 可以进行 IIC 总线的模式设置, 如主 / 从模式选择 发送 / 接收模式选择, 而读 P_IIC_Status 寄存器可以得到当前 IIC 总线工作的状态, 如中断标志 总线仲裁信号等 P_IIC_Status 寄存器默认初始值为 #00h, 其每一位的功能描述请参考表 6.14: 表 6.14 IIC 总线状态寄存器 P_IIC_Status($4B,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 MXT TXRXSEL BUSY/SIGGEN IICIF ARBITRAT AAS AZERO LRB R/W R/W R/W R/W R/W R R R Bit 7 Bit 6 MXT:IIC 主 / 从模式选择位 1= 主模式 0= 从模式 TXRXSEL: 发送 / 接收选择位 Tel: mcu@sunplus.com.cn 145

152 凌阳 8 位通用单片机 1= 发送模式 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 0= 接收模式 BUSY/SIGGEN: 总线正忙或启动 / 停止信号发生位读 : 1= 总线忙 0= 总线就绪写 : 1= 启动信号 0= 停止信号注 : 向 MXT 和 TXRXSEL 写数据时, 保持该位为 0 当 IICIF =1, 清除 IICIF 标志时, 芯片自动忽略该位的任何设置 IICIF:IIC 中断标志读 : 1=IIC 中断发生 0=IIC 中断未发生写 : 1=IICIF 标志位清零 0= 无效 ARBITRAT:IIC 仲裁器状态标志位 1= 总线仲裁器在通讯中仲裁失败 0= 总线仲裁器良好 AAS:IIC 从机寻址状态位 1= 接收到的地址和 IIC 地址寄存器里的值相同 0= 启动信号 / 停止信号已经发生 AZERO:IIC 零地址状态位 1= 接收从地址为 "0x00" 0= 启动 / 停止动作已经发生 LRB:IIC 最后接收位状态标志 1= 最后接收位为 1( 应答信号 ACK 未收到 ) 0= 最后接收位为 0( 应答信号 ACK 已收到 ) IIC 总线数据寄存器 P_IIC_Data($4C,R/W) SPMC65 系列单片机的 IIC 接口模块为 IIC 总线提供了一个数据寄存器 P_IIC_Data($4C) 和一个地址寄存器 P_IIC_Address($4D), 这两个寄存器的默认初值都为 #00h; 其功能请参考表 6.15 和表 6.16: 表 6.15 IIC 总线数据寄存器 P_IIC_Data($4C,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 DATA7 DATA6 DATA5 DATA4 DATA3 DATA2 DATA1 DATA0 R/W R/W R/W R/W R/W R/W R/W R/W Bit [7:0] IICDATA [7:0]:IIC 总线数据寄存器 读 : 接收数据 写 : 发送数据 146 mcu@sunplus.com.cn Tel:

153 第 6 章串行接口原理及应用 IIC 总线地址寄存器 P_IIC_Address($4D,R/W) 表 6.16 IIC 总线地址寄存器 P_IIC_Address($4D,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 ADDR7 ADDR6 ADDR 5 ADDR 4 ADDR 3 ADDR 2 ADDR 1 ADDR 0 R/W R/W R/W R/W R/W R/W R/W R/W Bit [7:0] IICADDRESS [7:0]:IIC 总线地址寄存器 从机模式 : 从机的地址 工作机制操作 : IIC 总线协议对其连接的每个通讯设备都定义了一个地址, 当主机启动数据传送时, 首先要将它欲与之通讯的那个从机的地址发到总线上, 此时所有的从机都监听这个地址信息 在这个地址中, 有一位用来定义主机是从从机中读数据还是向从机写数据的 主机和从机在进行数据传送的时候的状态永远是互补的 ( 发送 / 接收 ) 他们的关系必为以下二者之一: 主机发送, 从机接收 从机发送, 主机接收在这两种情况下, 时钟信号都是由主机产生的 为了在总线上与其它设备 线与 (wired-and) 连接, 时钟线 (SCL) 和数据线 (SDA) 是开漏输出 外部的上拉电阻用于保证当没有设备拉低总线时, 总线保持高电平状态 图 6.7 为 24C01A 的通讯协议 : 起始位芯片地址 R/W ACK Data ACK 停止位 7 bit 1 bit 1 bit 8 bit 1 bit 图 C01A IIC 通讯协议启动和停止数据传送当总线上无数据传送时 ( 空闲时间 ), 时钟线 (SCL) 和数据线 (SDA) 通过外部上拉电阻被拉高 启动信号和停止信号决定数据传送的开始和停止, 定义如下 : 启动信号 :SCL 为高电平时,SDA 由高电平向低电平跳变, 开始传送数据 ; 停止信号 :SCL 为高电平时,SDA 由低电平向高电平跳变, 结束传送数据 如图 6.8 所示为开始信号和停止信号的具体定义 主机产生这两个信号作为数据传送的开始和结束 根据启动信号和停止信号的定义, 当数据正在传送时,SDA 只能在 SCL 拉低后才能改变状态, 传送新的数据位 Tel: mcu@sunplus.com.cn 147

154 凌阳 8 位通用单片机 SDA SCL START STOP 图 6.8 开始和停止信号 地址格式的定义 SPMC65 系列单片机的 IIC 接口仅支持 7 位地址格式外加 1 位读 / 写标志位 7 位地址格式如图 6.9 所示 MSB P_IIC_Address, $4Dh LSB R/W Slave address 图 位地址格式 传送应答 (ASK 信号 ) IIC 总线协议规定, 所有数据都是一个字节一个字节的发送, 每次发送的字节数不做限定 从机每收到一个字节后, 都会产生一个应答信号 (ACK) 如果主机没有收到应答信号, 则必须停止传送 此时从机必须释放 SDA, 使其恢复为高电平, 让主机可以产生停止信号 如图 6.10 所示为 IIC 总线上的应答信号 SCL SDA ( 发送 ) SDA ( 接收 ) Start ACK 图 6.10 IIC 总线应答信号 148 mcu@sunplus.com.cn Tel:

155 第 6 章串行接口原理及应用 如果主机正在接收数据 ( 主机接收模式 ), 除了最后接收的那个字节外, 每接收到一个字节都会产生一个应答信号 最后一个字节不产生应答信号, 其实也是一种信息, 就是为了告诉从机发送结束 然后从机释放 SDA, 让主机产生停止信号 主机也可以在应答信号的脉冲期间, 与时钟信号 SCL 组合, 产生停止信号, 从而结束数据传送 通用地址 IIC 总线上寻址的过程是这样的 : 在启动信号后传送的第一个字节即主机要访问的从机的地址信息 不同的是 : 当主机发送的第一个字节为通用地址时, 则可以访问所有的从机 理论上将, 发送通用地址后, 所有的从机都应该向主机发送一个应答信号 IIC 协议规定了一个通用地址, 它的 7 个地址位和一个 R/W 位均为 0, 用于呼叫所有的从机 通用地址可以被自动识别 此时, 将 AZERO 位置 1 总线仲裁多主机模式的系统是通过总线仲裁来协调工作的 当主机 A 输出高电平到 SDA 管脚上时, 同时, 另一主机 B 输出低电平到 SDA 管脚, 将 SDA 线拉低, 这种情况下, 主机 A 从 SDA 管脚读回的信号为低, 与输出不一致, 此时,ARBITRAT 位置 1, 表明总线被另一主机 B 占用 从机模式 (Slave mode) 在从机模式下, 从机的 SCL (PC6) 和 SDA (PC7) 管脚必须设置为输入 当需要作为 IIC 输出 (slave transmitter) 时,IIC 模块会自动将对应的 IO 口设置为输出 当地址值与寄存器 P_IIC_Address 里的值相匹配或者 IIC 模块自动将 ACKEN 位置 1, 产生应答信号, 然后将接收到的数据存入 P_IIC_Data 寄存器 从机的设置步骤如下 : 1. 将 PC6 和 PC7 置为悬浮输入 2. 使能 IIC 模块 ( IICEN= 1) 3. 使能 IIC 数据输出 (TXRXEN= 1) 4. 设置从机模式 (MXT= 0, TXRXSEL= 0) 典型的数据传送步骤如下 :( 从机模式接收 ) 1. 从机在 P_IIC_Address 中设置地址 ; 2. 通过查询 IICIF 位, 得知一个字节的数据接收完毕 ; 3. 当主机在写模式下 (TXRXSEL=0), 从机从 P_IIC_Data 寄存器中读取接收到的数据 ; 4. 当主机在读模式下 (TXRXSEL=1), 从机将要发送的数据载入寄存器 P_IIC_Data 中 ; 5. 清除 IICIF 位 主机模式 (Master mode) 在主机模式下,SCL(PC6) 和 SDA (PC7) 管脚必须设置为输入 当需要作为 IIC 输出 (master transmitter) 时,IIC 模块会自动将 IO 口设置为输出 IIC 的时钟 (SCL) 由主机产生,SPMC65 系列单片机支持 8 种时钟频率 ( 通过 SCK[2:0] 选择 ), 最高达 1MHz@ 8MHz 设置主机模式的步骤如下: 1. 将 PC6 和 PC7 置为悬浮输入 Tel: mcu@sunplus.com.cn 149

156 凌阳 8 位通用单片机 2. 使能 IIC 模块 ( IICEN= 1) 3. 使能 IIC 数据输出 (TXRXEN= 1) 4. 设置主机模式 (MXT= 1, TXRXSEL= 1) 典型的数据发送步骤如下 :( 主机模式发送 ) 1. 在寄存器 P_IIC_Data 中设置从机地址 2. 通过查询 BUSY 位, 得知总线是否就绪可用 3. 设置 SIGGEN 位, 产生启动信号, 开始发送寄存器 P_IIC_Data 中的数据 4. 通过查询 IICIF 位, 得知数据已发送完成 5. 将下一个要发送的数据载入 P_IIC_Data 6. 清除 IICIF 标志位 7. 设置 SIGGEN 位, 产生停止信号 IIC 中断 SPMC65 系列单片机中, 以下事件将导致发生 IIC 中断, 并置中断标志位 IICIF 发送一个字节的数据 接收一个字节的数据 设置 IIC 中断的步骤如下 : 1. 用 SEI 指令关闭总的中断开关 2. 设置与 IIC 操作相关的寄存器 3. 在 P_IIC_Ctrl($4A) 寄存器中将 IIC 中断使能位置 1 4. 用 CLI 指令打开总的中断开关 5. 等待中断产生 应用举例 例 7-8 : 主机发送模式的操作 ( 初始化 ) lda # B sta P_IOC_Data lda # B sta P_IOC_Attrib lda # B ; PC6(SDL) 和 PC7(SDA) 设为悬浮输入 sta P_IOC_Dir lda # B ; I2C 使能, 应答 输出使能,SCL= 62.5KHz sta P_IIC_Ctrl lda # B ; 主机模式 发送 清除 IICIF 标志 sta P_IIC_Status 例 7-9 : 主机发送模式操作 ( 数据发送 ) 150 mcu@sunplus.com.cn Tel:

157 第 6 章串行接口原理及应用 lda # B ; 设置从机地址 sta P_IIC_Data L_TestI2CL20: lda P_IIC_Status and # B ; 总线忙? bne L_TestI2CL20 ; 是 lda P_IIC_Status ora # B ; 发送启动信号 sta P_IIC_Status ldx #0 L_TestI2CL21: lda P_IIC_Status and # B ; 有中断? beq L_TestI2CL21 ; 无 lda T_I2C_Data,X ; sta P_IIC_Data ; 载入发送数据 lda P_IIC_Status ora # B ; 清除 IICIF 标志 ( 开始发送 ) sta P_IIC_Status inx cpx #4 ; 发送结束? bne L_TestI2CL21 ; 没 L_TestI2CL3: lda P_IIC_Status and # B ; IICIF 置 1? beq L_TestI2CL3 ; 没有 lda # B ; 发送停止位? sta P_IIC_Status 例 7-10 : 主机发送模式操作 ( 数据接收 ) lda # B ; IIC 使能, 应答 输出使能,SCL= 62.5KHz sta P_IIC_Ctrl lda # B ; 主机模式 发送 清除 IICIF 标志 sta P_IIC_Status lda # B ; 设置从机地址 7-bit= $50 sta P_IIC_Data lda # B ; 发送启动信号 sta P_IIC_Status nop L_TestI2CL4: Tel: mcu@sunplus.com.cn 151

158 凌阳 8 位通用单片机 lda P_IIC_Status and # B ; IICIF 置 1? beq L_TestI2CL4 ; 没有 lda T_I2C_Data ; 设置 24C01A 地址 sta P_IIC_Data lda P_IIC_Status ora # B ; 清除 IICIF 标志 ( 开始发送 ) sta P_IIC_Status L_TestI2CL41: lda P_IIC_Status and # B ; IICIF 置 1? beq L_TestI2CL41 ; 没有 lda # B ; 设置 24C01 从机地址 sta P_IICS_Data lda # B ; 接收器, 发送启动信号 sta P_IIC_Status L_TestI2CL42: lda P_IIC_Status and # B ; IICIF 置 1? beq L_TestI2CL42 ; 没有 lda P_IIC_Status ora # B ; 清除 IICIF 标志 ( 开始发送 ) sta P_IIC_Status ldx #0 L_TestI2CL43: lda P_IIC_Status and # B ; IICIF 置 1? beq L_TestI2CL43 ; 没有 lda P_IIC_Data ; 保存接收数据 sta G_TXbuf,X inx cpx #3 ; 接收结束? beq L_TestI2CL45 ; 是的 cpx #2 ; 接收完最后一个? bne L_TestI2CL44 ; 否 lda # B ; 设置应答信号 sta P_IIC_Ctrl L_TestI2CL44: lda P_IIC_Status ora # B ; 清除 IICIF 标志 ( 开始发送 ) 152 mcu@sunplus.com.cn Tel:

159 第 6 章串行接口原理及应用 sta jmp P_IIC_Status L_TestI2CL43 L_TestI2CL45: lda # B ; 发送停止信号 sta P_IIC_Status 例 7-11 : 从机接收模式操作 ( 初始化 ) lda # B sta P_IOC_Data lda # B sta P_IOC_Attrib lda # B ; PC6(SDL) 和 PC7(SDA) 设为悬浮输入 sta P_IOC_Dir ; IIC 使能, 应答 输出使能 sta P_IIC_Ctrl lda # B ; 从机模式 接收 清除 IICIF 标志 sta P_IIC_Status lda # B ; 设置从机地址 7-bit= $50 sta P_IIC_Address 例 7-12 : 从机接收模式 ( 发送 / 接收 ) ldx #0 L_TestI2C2L1: lda P_IIC_Status and # B ; IICIF 置 1? beq L_TestI2C2L1 ; 否 L_TestI2C2L2: lda P_IIC_Status and # B ; 接收器模式? bne L_TestI2C2L3 ; 否 lda P_IIC_Data ; 存储接收数据 sta G_TXbuf,X inx lda P_IIC_Status ora # B ; 清除 INTIF sta P_IIC_Status jmp L_TestI2C2L1 Tel: mcu@sunplus.com.cn 153

160 凌阳 8 位通用单片机 L_TestI2C2L3: ; 发送模式 lda P_IIC_Status and # B ; 无应答? bne L_TestI2C2L4 ; 是, 则结束 lda G_TXbuf+2,X sta P_IIC_Data ; 发送数据 inx lda P_IIC_Status ora # B ; 清除 IICIF sta P_IIC_Status jmp L_TestI2C2L1 L_TestI2C2L4: Nop 154 mcu@sunplus.com.cn Tel:

161 第 7 章模拟外设 第 7 章模拟外设 7.1 模数转换器 A/D 转换器工作原理 将 A/D 转换器电路集成到单片机内, 可有效的减少外部器件, 同时, 具有低成本和减少器件空间需求 的优势 A/D 转换器广泛应用于触摸屏 电池电量检测等很多场合 SPMC65 系列单片机具有 9 通道 A/D 转换功能, 精度为 10 位, 可选内部参考电压即电源电压 (VDD), 也可选择外部参考电压输入 (VRT)(8 通道 10 位 ADC 模式 ),PB7 用作外部参考电压的输入管脚 ADC 输入通道和 I/O 端口 A[7:0] PB7 复用, 具体请参见表 7.1 表 7.1 A/D 转换模式简表 模式 9 通道 10 位 ADC 模式 8 通道 10 位 ADC 模式 参考电压源 内部参考电压即电源电压 外部参考电压输入 (PB7) 或内部参考电压 端口复用 ADC 输入通道和端口 PA[7:0] PB7 复用 ADC 输入通道和端口 A[7:0] 复用 A/D 转换器结构图请参见图 7.1 ADCS[2:0] SYS_CLK PCFG[8:0] PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PB7 MUX MUX 采样 / 保持电路 VDD 0 VRT 1 ADVRT 电源控制电路 ADR(10-bit) CK 逐次逼近电路 ADIF A / D 中断 ADS[3:0] 图 7.1 A/D 转换器结构图 SPMC65 系列单片机的 A/D 输入范围为 0~VDD/VRT, 而 VRT 最高不能超过 VDD 而 A/D 转换时每完成一位所花的时间为 TAD, 在 SPMC65 系列单片机中, 进行 10 位 A/D 转换总共需要 14 个 TAD A/D 转换时钟频率共有 8 种选择, 可以通过 P_AD_Ctrl0 寄存器中的 ADCS[2:0] 位设定, 为了保证转换结果的正确,A/D 转换的时钟频率 (1/TAD) 应低于 1.4MHZ, 以配合 A/D 转换硬件部分的要求 由此可算出 SPMC65 系列单片机的 A/D 转换速率最高为 100KHz Tel: mcu@sunplus.com.cn 155

162 凌阳 8 位通用单片机 控制寄存器 A/D 转换相关寄存器有如下 7 个 : A/D 转换控制寄存器 P_AD_Ctrl0 P_AD_Ctrl1 P_AD_Ctrl2 A/D 转换结果存放寄存器 P_AD_DataHi P_AD_DataLo A/D 转换中断控制和中断标志寄存器 P_INT_Ctrl0 P_INT_Flag0 1. A/D 转换控制寄存器 (1)P_AD_Ctrl0($28,R/W) 作用 :A/D 转换使能 外部或内部参考电压选择 A/D 转换的时钟频率选择 启动 A/D 转换功能 ; 该 寄存器默认初值为 #00h 表 7.2 A/D 转换控制寄存器 0P_AD_Ctrl0($28,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 R ADEN ADVRT - - ADCS2 ADCS1 ADCS0 ADRDY W ADEN ADVRT - - ADCS2 ADCS1 ADCS0 STARTB Bit 7 ADEN:A/D 转换使能位 0 = 禁止 A/D 转换功能 1 = 允许 A/D 转换功能 Bit 6 ADVRT:A/D 转换参考电压选择位 1 = 选用外部参考电压 (VRT),PB7 做为外部参考电压输入 0 = 选用电源电压作为参考电压 (VDD) Bit [5:4] Bit [3:1] 保留 ADCS[2:0]:A/D 转换时钟的频率选择位 注意 :AD 转换的时钟的频率不能超过 1.4MHz, 以保证转换结果的正确性 111= F SYS = F SYS = F SYS = F SYS = F SYS = F SYS 8 001= F SYS 4 000= F SYS 2 F SYS : 系统时钟 Bit 0 ADRDY/STARTB:A/D 转换状态标志和启动位读操作 :A/D 转换的状态 1: A/D 转换结束 0: 正在进行数据转换 156 mcu@sunplus.com.cn Tel:

163 第 7 章模拟外设 写操作 :A/D 转换启动位 1: 无效 0: 启动 A/D 转换 (2)P_AD_Ctrl1($29,R/W) 作用 : 设置 I/O 端口作为 ADC 的输入通道, 该寄存器默认初值为 #00h 表 7.3 A/D 转换控制寄存器 1 P_AD_Ctrl1($29,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 PCFG7 PCFG6 PCFG5 PCFG4 PCFG3 PCFG2 PCFG1 PCFG0 R/W R/W R/W R/W R/W R/W R/W R/W PCFG7: 1= 模拟输入口 (AN7) 0= 普通 I/O 端口 (PA7) PCFG6: 1= 模拟输入口 (AN6) 0= 普通 I/O 端口 (PA6) PCFG5: 1= 模拟输入口 (AN5) 0= 普通 I/O 端口 (PA5) PCFG4: 1= 模拟输入口 (AN4) 0= 普通 I/O 端口 (PA4) PCFG3: 1= 模拟输入口 (AN3) 0= 普通 I/O 端口 (PA3) PCFG2: 1= 模拟输入口 (AN2) 0= 普通 I/O 端口 (PA2) PCFG1: 1= 模拟输入口 (AN1) 0= 普通 I/O 端口 (PA1) PCFG0: 1= 模拟输入口 (AN0) 0= 普通 I/O 端口 (PA0) (3)P_AD_Ctrl2($2A,R/W) 作用 : 通道选择寄存器, 选择需要进行 A/D 转换的通道, 该寄存器默认初值为 #00h Tel: mcu@sunplus.com.cn 157

164 凌阳 8 位通用单片机 表 7.4 A/D 转换控制寄存器 2 P_AD_Ctrl2($2A,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 ADCE ADS3 ADS2 ADS1 ADS0 - - PCFG8 R/W R/W R/W R/W R/W - - R/W Bit 7 ADCE:A/D 转换电源控制位 当不进行 A/D 转换时, 关闭 ADC 电源可以省电 1= 打开 A/D 转换电源 0= 关闭 A/D 转换电源 Bit [6:3] ADS[3:2]:A/D 转换通道选择 0000= 选择通道 0 (AN0). 0001= 选择通道 1 (AN1) 0010= 选择通道 2 (AN2) 0011= 选择通道 3 (AN3) 0100= 选择通道 4 (AN4) 0101= 选择通道 5 (AN5) 0110= 选择通道 6 (AN6) 0111= 选择通道 7 (AN7) 1000= 选择通道 8 (AN8) 其它 = 保留 Bit [2:1] 保留 Bit 0 PCFG8: 1 = 模拟输入口 (AN8/Avref) 0 = 数字输入口 (PB7) 2. A/D 转换结果存放寄存器 (1)P_AD_DataHi($2B,R/W) 作用 :10bit A/D 转换结果的高 8 位存放寄存器 表 7.5 A/D 转换值高字节寄存器 P_AD_DataHi($2B,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 ADData9 ADData8 ADData7 ADData6 ADData5 ADData4 ADData3 ADData2 R/W R/W R/W R/W R/W R/W R/W R/W (2)P_AD_ DataLo($2C,R/W) 作用 :10bit A/D 转换结果的低 2 位存放寄存器 158 mcu@sunplus.com.cn Tel:

165 第 7 章模拟外设 表 7.6 A/D 转换值低字节寄存器 P_AD_DataLo($2C,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 ADData1 ADData R/W R/W A/D 转换中断相关寄存器 A/D 转换的中断相关的寄存器为中断控制寄存器 0(P_INT_Ctrl0) 和中断标志寄存器 0(P_INT_Flag0), 当需要用中断的方式读取 A/D 转换的结果时, 在 P_INT_Ctrl0 的 Bit7 位设置为 1, 并且打开总中断即可 (1)P_INT_Flag0($0C,R/W) 作用 : 中断标志寄存器, 其中 Bit7 为 ADC 中断标志位 表 7.7 中断标志寄存器 0 P_INT_Flag0($0C,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 ADIF WDIF IRQ5IF/ CAP5IF IRQ4IF/ CAP4IF IRQ3IF IRQ2IF IRQ1IF/ CAP3IF IRQ0IF/ CAP2IF R/W R/W R/W R/W R/W R/W R/W R/W (2)P_INT_Ctrl0($0D,R/W) 作用 : 中断控制寄存器, 其中 Bit7 为 ADC 中断控制位 表 7.8 中断控制寄存器 0 P_INT_Ctrl0($0D,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 ADIE WDIE IRQ5E/ CAP5E IRQ4E/ CAP4E IRQ3IE IRQ2IE IRQ1IE/ CAP3IE IRQ0IE/ CAP2IE R/W R/W R/W R/W R/W R/W R/W R/W A/D 转换器应用 A/D 转换应用的一般步骤如下 : 1 打开 A/D 转换电源 2 允许 A/D 转换, 选择 A/D 转换的时钟速率 3 将 I/O 口定义为模拟口 4 选择模拟电压输入口 5 启动 A/D 转换 6 A/D 转换结束后读取结果 例 7-1 : 初始化 A/D 转换, 从 AN1 输入模拟信号, 并启动 A/D 转换器 set P_AD_Ctrl2,7 ; 打开 A/D 转换电源 lda #85h ; 允许 A/D 转换功能,A/D 转换的时钟速率 ; 为 Fcpu(8M)/8=1M sta P_AD_Ctrl0 lda #FFh ; 定义 PA 口为模拟口 Tel: mcu@sunplus.com.cn 159

166 凌阳 8 位通用单片机 sta P_AD_Ctrl1 lda #88h ; 选择通道 1(AN1) sta lda P_AD_Ctrl2 P_AD_Ctrl0 and # B ; 启动转换 sta P_AD_Ctrl0 A/D 转换结束后读取结果 A/D 转换结束后, 转换结果保存在寄存器 P_AD_DataHi 和 P_AD_DataLo 中, 转换结果有两种判断方式 : 查询方式和中断方式 (1) 查询方式 : 当 A/D 转换结束,P_AD_Ctrl0 的 Bit0 会被置 1, 因而, 可以在程序中不断查询该标志位, 当该标志位被置 1, 表示 A/D 转换结束, 将转换结果存入结果寄存器便可以读取结果 流程如下 : 设置 A/D 相关寄存器 启动 A/D 转换 转换结束? N Y 读取转换结果 图 7.2 查询式 A/D 转换流程 例 7-2 : 查询式 A/D 转换 set P_AD_Ctrl2,7 ; 打开 A/D 转换电源 lda #85h ; 允许 ADC 转换功能 ; ADC clock= Fsys(8MHz)/8= 1MHz sta P_AD_Ctrl0 lda #FFh ; 定义 PA 口为模拟口 sta P_AD_Ctrl1 lda #88h ; 选择通道 1(AN1) sta lda P_AD_Ctrl2 P_AD_Ctrl0 and # B ; 启动 A/D 转换 sta P_AD_Ctrl mcu@sunplus.com.cn Tel:

167 第 7 章模拟外设 L_TestAdcL2: lda P_AD_Ctrl0 and # B ; 查询是否转换完毕? beq L_TestAdcL2 ; 没有转换完毕继续等待 lda P_AD_DataHi sta G_MWorkReg1 ; G_MworkReg1 为定义的变量 lda P_AD_DataLo sta G_MWorkReg2 ; G_MworkReg2 为定义的变量 lda P_AD_Ctrl0 and # B ; 重新开始启动 A/D 转换 sta jmp P_AD_Ctrl0 L_TestAdcL2 (2) 中断方式 : 如果我们将寄存器 P_INT_Ctrl0 中 ADIE 位置 1, 即打开 A/D 中断, 则当 A/D 转换结束,P_AD_Ctrl0 的 bit0 和 P_AD_Flag0 的 bit7 都会被置 1, 程序会自动产生中断, 此时便可以将转换结果读取出来 中断方式不像查询方式需要不断的查询等待, 提高 CPU 效率 具体流程如下 : 设置 A/D 相关寄存器 使能 A/D 中断 启动 A/D 转换 例 7-3 : 中断式 A/D 转换 图 7.3 中断式 A/D 转换流程 set P_AD_Ctrl2,7 ; 打开 A/D 转换电源 sta P_AD_Ctrl2 lda #85h ; 允许 ADC 转换功能 ADC clock= Fsys(8MHz)/8= 1MHz sta P_AD_Ctrl0 lda #FFh ; 定义 PA 口为模拟口 sta P_AD_Ctrl1 lda #88h ; 选择通道 1(AN1) sta lda P_AD_Ctrl2 #FFh sta P_INT_Flag0 ; 清中断请求标志位 lda # B ; 使能 A/D 中断 sta P_INT_Ctrl0 cli ; 使能中断 Tel: mcu@sunplus.com.cn 161

168 凌阳 8 位通用单片机 lda P_AD_Ctrl0 and # B ; 启动 A/D 转换 sta P_AD_Ctrl0 L_Loop: jmp L_Loop V_IRQ: ; 中断服务程序 pha txa pha?l_ad: lda P_INT_Flag0 and #80h ; 是否发生 A/D 中断? beq?l_irq_exit ; 没有产生 A/D 中断继续等待 lda sta lda sta P_AD_DataHi G_MWorkReg1 P_AD_DataLo G_MWorkReg2 set P_INT_Flag0,7 ; 清中断标志 lda P_AD_Ctrl0 and # B ; 重新开始启动 A/D 转换 sta P_AD_Ctrl0?L_IRQ_Exit: pla tax pla rti V_NMI: rti 7.2 DAC 原理及应用 D/A 转换器工作原理 SPMC65 系列单片机内置了一个 10 位的数模转换器 (DAC), 输出的转换电流最大为 3.3mA, 转换完成时间约 80 微秒 当数据写入 DAC 数据寄存器 P_DA_DataHi 和 P_DA_DataLo 中时,DAC 模块自动将其转换为相应的的模拟电流, 通过 I/O 端口 PE6 管脚输出 (SPMC65 系列单片机视具体型号提供 DAC 功能, 即只有引出 PE6 端口的芯片才提供 ) 向 P_DA_DataHi 寄存器写入 B, 向 P_DA_DataLo 寄存器写入 B ( 其中 P_DA_DataHi 寄存器存放数字量的高 8 位,P_DA_DataLo 寄存器存放数字量的低 2 位 ),PE6 输出最大转换电流 3.3mA 162 mcu@sunplus.com.cn Tel:

169 第 7 章模拟外设 控制寄存器 D/A 转换相关寄存器有如下 3 个 : D/A 转换设置寄存器 P_DA_Ctrl D/A 转换数据存放寄存器 P_DA_DataHi P_DA_DataLo 1.P_DA_Ctrl($55,R/W) 作用 : 控制 D/A 转换使能以及启动 DAC 功能, 该寄存器默认初值为 #00h 表 7.9 DAC 控制寄存器 P_DA_Ctrl($55,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 DAEN R/W Bit 7 DAEN:D/A 转换使能位 1 = 使能 DAC 功能并启动 DAC 转换 0 = 禁止 DAC 功能并停止 DAC 转换 Bit [6:0] 保留 2.P_DA_ DataHi($57,R/W) 作用 :10bit D/A 转换数据的高 8 位存放寄存器, 该寄存器默认初值为 #00h 表 7.10 D/A 转换值高字节寄存器 P_DA_DataHi($57,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 DAData9 DAData8 DAData7 DAData6 DAData5 DAData4 DAData3 DAData2 R/W R/W R/W R/W R/W R/W R/W R/W Bit [7:0] DAData[9:2]: 10 位 D/A 转换数据的高 8 位数据 3.P_DA_ DataLo($56,R/W) 作用 :10bit D/A 转换数据的低 2 位存放寄存器, 该寄存器默认初值为 #00h 表 7.11 D/A 转换值高字节寄存器 P_DA_DataLo($56,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 DAData1 DAData R/W R/W Bit [7:6] Bit [5:0] DAData[1:0]: 10 位 D/A 转换数据的低 2 位数据,bit7 位和 bit6 位有效 保留 D/A 转换器应用 D/A 转换一般步骤如下 : 进行 D/A 转换时, 需要将寄存器 P_DA_Ctrl 中的 DAEN 位置 1, 便开始进行转换,PE6 端口会输出转换电流 DAC 数据寄存器包括两个字节 : 寄存器 P_DA_DataHi 存储转换数据的高 8 位, 寄存器 P_DA_DataLo 存储转换数据的低 2 位 DAC 转换完成需要约 80 微秒, 用户必须等待本次转换完成才能进行下一次转换, 以保证 D/A 转换的正确性 例 7-4 :D/A 转换 Tel: mcu@sunplus.com.cn 163

170 凌阳 8 位通用单片机 lda #C0h ; 将需要转换数据的低 2 位数值送入寄存器 P_DA_DataLo 中 sta P_DA_DataLo lda #FFh ; 将需要转换数据的高 8 位数值送入寄存器 P_DA_DataHi 中 sta P_DA_DataHi set P_DA_Ctrl,7 ; 使能 DAC 功能并启动 DAC 转换 7.3 电压比较器原理及应用 电压比较器工作原理 SPMC65 系列单片机内置两个电压比较器 ( 也简称比较器 )(SPMC65 系列单片机视具体型号提供电压比较器功能, 即只有引出 PE[2:5] 端口的芯片才提供 ), 这两个电压比较器相互独立, 其电压输入端 CMPIN1/CMPIN0 与普通 I/O 端口复用 (PE5/PE3), 参考电压可选外部参考电压 ( 来自 PE4/PE2 管脚上的电压 ) 或选择内部参考电压 (1.2V), 具体请参见表 7.12 表 7.12 电压比较器表 电压比较器电压比较器 1(Comparator1) 电压比较器 0(Comparator0) 比较电压输入端口与 PE5 复用与 PE3 复用 参考电压源选择 可选外部参考电压 ( 来自 PE4 端口 ) 或内部参考电压 (1.2V) 可选外部参考电压 ( 来自 PE2 端口 ) 或内部参考电压 (1.2V) 其中输入的比较电压范围为 0.2V~ (VDD-0.2) V 图 7.4 为电压比较器结构图 PE5 1.2V CMP1ES CMP1RS 0 1 CMPIF1 比较器 1 中断 CMP1EN PE4 PE3 1.2V CMP0ES CMP0RS 0 1 CMPIF0 比较器 2 中断 CMP0EN PE2 图 7.4 电压比较器结构图 控制寄存器 电压比较器相关寄存器有如下 2 个 : 164 mcu@sunplus.com.cn Tel:

171 第 7 章模拟外设 电压比较器设置寄存器 中断标志寄存器 2 P_CMP_Ctrl P_INT_Flag2 1. 电压比较器控制寄存器 P_CMP_Ctrl($2E,R/W) 电压比较器控制寄存器 P_CMP_Ctrl($2E), 用来对电压比较器进行设置 比较器 1 和比较器 0 的电压比较模块相互独立, 具有各自的控制位 : Bit7~Bit4 分配给比较器 1 使用,Bit3~Bit0 分配给比较器 0 使用 ;P_CMP_Ctrl 默认初值为 #00h 具体内容如下: 表 7.13 比较器控制寄存器 P_CMP_Ctrl($2E,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 CMP1EN CMP1RS CMP1LOG CMP1OUT CMP0EN CMP0RS CMP0LOG CMP0OUT R/W R/W R/W R/W R/W R/W R/W R/W Bit 7 CMP1EN: 比较器 1 使能位 1 = 使能比较器 1 0 = 禁止比较器 1 Bit 6 CMP1RS: 比较器 1 参考电压源选择位 1 = 选择外部参考电压 (PE4) 0 = 选择内部参考电压 (1.2v) Bit 5 CMP1LOG: 比较器 1 的事件逻辑选择位 1 = 比较器 1 输入比较电压 > 比较器 1 参考电压,P_INT_Ctrl2 中 CMP1IE 位置 1 0 = 比较器 1 输入比较电压 < 比较器 1 参考电压,P_INT_Ctrl2 中 CMP1IE 位置 1 Bit 4 CMP1OUT: 比较器 1 结果指示位 1 = 比较器 1 输入比较电压 > 比较器 1 参考电压 0 = 比较器 1 输入比较电压 < 比较器 1 参考电压 Bit 3 CMP0EN: 比较器 0 使能位. 1 = 使能比较器 0 0 = 禁止比较器 0 Bit 2 CMP0RS: 比较器 0 参考电压源选择位. 1 = 外部参考电压 (PE2) 0 = 内部参考电压 (1.2v) Bit 1 CMP0LOG: 比较器 0 的事件逻辑选择位 1 = 比较器 0 输入比较电压 > 比较器 0 参考电压,P_INT_Ctrl2 中 CMP0IE 位置 1 0 = 比较器 0 输入比较电压 < 比较器 0 参考电压,P_INT_Ctrl2 中 CMP0IE 位置 1 Bit 0 CMP0OUT: 比较器 1 结果指示位 1 = 比较器 0 输入比较电压 > 比较器 0 参考电压 0 = 比较器 0 输入比较电压 < 比较器 0 参考电压 2. 中断标志寄存器 2 P_INT_Flag2($26,R/W) Tel: mcu@sunplus.com.cn 165

172 凌阳 8 位通用单片机 表 7.14 中断标志寄存器 P_INT_Flag2($27,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 - - ITVALIF IICIF UARTIF SPIIF CMP1IF CMP0IF - - R/W R R R R/W R/W Bit 1 CMP1IF: 比较器 1 中断标志读操作 : 0 = 中断没有发生 1 = 中断发生写操作 : 0 = 无效 1 = 清比较器 1 中断标志 Bit 0 CMP0IF: 比较器 0 中断标志读操作 : 0 = 中断没有发生 1 = 中断发生写操作 : 0 = 无效 1 = 清比较器 1 中断标志 比较器应用电压比较器设置的一般步骤 : 比较器参考电压源选择 事件逻辑选择位设置 使能比较器 设置的事件逻辑是否成立? NO YES 读取比较结果 图 7.5 比较器设置一般流程 166 mcu@sunplus.com.cn Tel:

173 第 7 章模拟外设 电压比较器的比较结果的读取可以采用查询式 : 事件逻辑选择位设置后, 当相应的逻辑事件成立时, 寄存器 P_INT_Flag2 的 bit1/bit0 位会被置 1, 所 以查询该位状态即可 比如当将 COM0EN 位和 CMP0LOG 位置 1, 当比较器 0 的输入电压 > 比较器 0 的 参考电压时, 寄存器 P_INT_Flag2 的 bit0 便会被置 1 例 7-5 查询方式检测 PE3 输入电压大于 PE2 的电压 lda # B ; 选择比较器为外部参考电压输入 (PE4) ; 设置比较器 0 当输入电压大于参考电压时, CMP0IE 位置 1 ; 启动比较器 0 sta P_CMP_Ctrl lda #ffh ; 清中断标志寄存器 P_INT_ Flag2 sta P_INT_ Flag2 LOOP: lda P_INT_ Flag2 ; 查询 P_INT_ Flag2 中 CMP0IE 位是否为 1 and #01h equ LOOP lda P_CMP_Ctrl ; 可以读 P_CMP_Ctrl 中 CMP0OUT 位确认 sta G_MWorkReg1 ; G_MworkReg1 为定义的变量 Tel: mcu@sunplus.com.cn 167

174 凌阳 8 位通用单片机 第 8 章其它硬件功能模块原理及应用 8.1 复位 SPMC65 系列单片机共提供 5 种复位方式, 分别是 : 1. 上电复位 (POR) 2. 外部复位 (RESET) 3. 低电压复位 (LVR) 4. 看门狗复位 (WDTR) 5. 非法地址复位 (IAR) 复位时序请参考图 8.1 VDD V_LVR 1024 个系统时钟 V_POR VSS RESET 上电复位正常运行低电压复位 正常运行 外部复位 正常运行 图 8.1 复位时序图 按照复位结果可以分为系统复位和 CPU 复位 系统复位不仅复位 CPU, 同时还会复位所有的内部模块 ( 包括 I/O Timer A/D D/A 各种控制寄存器等都将初始化为默认值); 而 CPU 复位只会复位 CPU, 即 PC 指针重新指向初始地址, 程序重新从头开始执行, 同时也会复位堆栈指针, 指向堆栈的最高地址 具体请参考表 8.1 表 8.1 复位源功能列表 复位源 复位功能 上电复位 (POR) 外部复位 (RESET) 低电压复位 (LVR) 看门狗复位 (WDTR) 非法地址复位 (IAR) 系统复位系统复位系统复位仅复位 CPU 和看门狗电路仅复位 CPU 和看门狗电路 上电复位 (POR) 当单片机的电源电压 VDD 上升到 1.45V, 便会开始上电复位 ; 首先要等 40ms 的时间以待电源稳定, 然后会再等待 40ms 的时间以待系统时钟稳定 ; 最后还要经过 1024 个系统时钟周期后, 完成系统复位和 CPU 复位 上电复位为系统复位, 复位后所有的寄存器都初始化为默认值 168 mcu@sunplus.com.cn Tel:

175 第 8 章其它硬件功能模块原理及应用 上电复位时序请参考图 8.2 系统时钟 (System Clock) 40ms 等待电源稳定 40ms 等待系统时钟稳定 1024 系统时钟周期 PC 指针指向 FFFC 系统复位 CPU 复位 图 8.2 上电复位时序图 外部复位 (RESET) SPMC65 系列单片机提供了一个外部复位管脚 RESET, 可手动系统复位 RESET 管脚为低电平有效, 当 RESET 管脚电压低于 0.3 VDD 时, 且低电平时间大于 200ns 后, 系统开始复位 当 RESET 管脚电平跳变为高电平后, 系统会等 40ms 以待系统时钟稳定, 然后再经过 1024 个系统时钟周期后, 完成系统复位和 CPU 复位 外部复位电路图请参考图 8.3, 外部复位时序图请参考图 8.4 VDD 1N K 33 RESET 0.1u 图 8.3 外部复位电路图 >200ns 40mS 等待系统时钟稳定 1024 系统时钟周期 系统时钟 (System Clock) RESET引脚电平 PC 指针指向 FFFC 系统复位 CPU 复位 图 8.4 外部复位时序图 Tel: mcu@sunplus.com.cn 169

176 凌阳 8 位通用单片机 低电压复位 (LVR) 低电压复位即当单片机的电源电压低于设定的复位电压值大于 1024 个系统时钟时, 芯片便会产生复位, 以保证单片机不会在非正常的电压范围内工作 ; 当电源电压恢复后, 会经过 1024 个系统时钟后, 完成系统复位 ( 包括 CPU 复位 ), 进入正常工作状态 导致电源电压过低的原因很多, 如电压的反跳 负载过重等 低电压复位时序图请参考图 8.5 VDD 下降到 VLVR-Vhys 以下 VDD 恢复到 VLVR+Vhys 以上 VDD VLVR-Vhys VLVR+Vhys 系统时钟 (System Clock) 1024 clock 1024 clock PC 指针指向 FFFC LVR 事件 系统复位 ( 包括 CPU 复位 ) 图 8.5 低电压复位时序图低电压复位功能使能 / 禁止可以在芯片配置选项寄存器中进行设置, 可以参考软硬件开发工具的章节 复位电压值可以通过复位电压选择寄存器 P_LVR_Opt($36)Bit0 位选择 SPMC65 系列单片机提供的复位电压为 4.0V 和 2.5V 可选 ; 该寄存器默认值为 #00h 表 8.2 低电压复位选择寄存器 P_LVR_Opt($36,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit LVRV R/W Bit [7:1] 保留 Bit [0] LVRV40: 复位电压选择位 0 = 低电压复位电压为 2.5V 1 = 低电压复位电压为 4.0V ( 该位在芯片运行后仅可设置一次, 上电复位才可将其清除 ) 注 : 寄存器 P_LVR_Opt 进行设置时需要连续写两次才能将值有效写入 看门狗复位 (WDTR) SPMC65 系列单片机提供了看门狗复位方式, 以保证程序的正常运行 看门狗定时器的计数频率可以通过设置相关寄存器进行选择, 看门狗定时器每次溢出会产生一次看门狗中断信号, 若连续 8 次看门狗定时器溢出中断, 则会发生一次看门狗复位 ; 所以在这个时间内, 看门狗定时器必须被清除 ( 向 P_WDT_Clr 寄存器中写入 #55h) 看门狗复位功能使能/ 禁止可以在芯片配置选项寄存器中进行设置, 可以参考软硬件开发工具的章节 CPU 复位时只会清除看门狗定时器并重新开始计数, 但不能清除看门狗的复位标志 清除看门狗的复位标志请参考 看门狗复位时序请参考图 mcu@sunplus.com.cn Tel:

177 第 8 章其它硬件功能模块原理及应用 看门狗定时器的溢出时钟 4Hz /8 /4 Watchdog_Reset 看门狗复位时钟 Watchdog_Clear 看门狗中断 4Hz Watchdog_Reset 看门狗复位 图 8.6 看门狗复位时序图 非法地址复位 (IAR) 非法地址复位 (IAR), 可以防止系统进入非法地址 当程序对某个地址进行读写操作时, 如果超出 SPMC65 系列单片机的寻址范围, 或预留不能被访问的地址区域时, 便会产生非法地址复位信号, 复位 CPU 系统控制寄存器 P_SYS_Ctrl($30,R/W) 系统复位标志寄存器主要是用来标识上述五种复位是否发生, 可以进行读 / 写操作 读操作 : 读相应位可 以查看是否发上了复位动作 ; 写操作 : 写相应位为 1, 清除相应的复位标志 表 8.3 系统控制寄存器 P_SYS_Ctrl($30,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 POR ERST LVR - WDR IAR - - R/W R/W R/W - R/W R/W - - Bit [7] POR: 上电复位标志位 0 = 无上电复位发生 1 = 上电复位发生 Bit [6] ERST: 外部复位标志 0 = 无外部复位发生 1 = 外部复位发生 Bit [5] LVR: 低电压复位标志 0 = 无低电压复位发生 1 = 低电压复位发生 Bit [4] Bit [3] 保留 WDR: 看门狗复位标志 0 = 无看门狗复位发生 1 = 看门狗复位发生 Bit [2] IAR: 非法地址复位标志 0 = 无非法地址复位发生 1 = 非法地址复位发生 Tel: mcu@sunplus.com.cn 171

178 凌阳 8 位通用单片机 Bit [1:0] 保留 注 : 寄存器 P_SYS_Ctrl 进行设置时需要连续写两次才能将值有效写入 例 8-1 保存寄存器 P_SYS_Ctrl 的值, 然后将其清除 lda P_SYS_Ctrl ; 读出复位标志 sta G_MworkReg1 ; G_MworkReg1 为定义的变量 lda #FFh ; 清除复位标志 sta P_SYS_Ctrl sta P_SYS_Ctrl 8.2 时钟源 SPMC65 系列单片机支持三种时钟输入方式 : 晶体输入 RC 振荡输入和外部时钟输入 ECMC653 ECMC653 SPMC65 SPMC65 SPMC65 ECMC653 XI/R XO XI/R XO XI/R XO 16MHz(max) 20 pf 20pf c Ros VDD 外部时钟 External Clock 输入 A. 晶体输入 B.RC 振荡输入 C. 外部时钟输入 图 8.7 SPMC65 系列时钟输入方式 晶体和外部时钟输入振荡频率 F OSC 最大为 16MHz, 经片内二分频电路后, 得到系统时钟 F SYS ( 即 CPU 工作的频率 ), 即系统时钟最大为 8MHz RC 振荡电路中建议电容值为 50pf, 电阻 R 和频率的对应关系请参考表 8.4,RC 振荡方式提供的最大系 统时钟为 8MHz 表 8.4 电阻 R 和频率对应关系 频率 (Hz) R ( Ω ), C=50pf F SYS =500K 17.2k F SYS =1M 9.26k F SYS =2M 4.2k F SYS =4M 1.73k F SYS =6M 1.08k F SYS =8M 740 晶体 RC 振荡和外部时钟输入三种时钟源输入方式可根据不同的需要, 通过对芯片配置选项进行设 置进行选择, 详细的请参考第十章中的介绍 在使用 RC 振荡输入模式时, 为便于测量振荡信号, 判断 RC 振荡器是否起振以及振荡情况是否正常, 可以通过设置芯片配置选项, 使能管脚 XO 输出振荡频率 有关芯片配置选项的设置请参考第十章有关 FortisIDE 的介绍 172 mcu@sunplus.com.cn Tel:

179 第 8 章其它硬件功能模块原理及应用 8.3 低功耗工作模式 SPMC65 系列单片机提供三种工作模式, 分别是正常模式 (NORMAL) 掉电模式(STOP) 挂起模式 (HALT) 芯片上电后直接进入 NORMAL 模式, 所有的硬件功能模块均为可用 为了降低整个芯片的功耗, 还提供了 STOP 和 HALT 两种低功耗模式 低功耗模式可以被唤醒源唤醒, 进入正常工作模式 而外部复位都可以使芯片从低功耗模式强行进行复位, 并进入正常工作模式, 所以可以把外部复位看为特殊的唤醒源 系统进入 STOP 模式, 片上振荡器停止,CPU 以及所有的硬件功能模块也停止 但是 RAM 区的数据包括控制寄存器的设置仍然保持不变 (RAM 区的数据 寄存器中的值和锁存器中的内容保持不变 ) 由于 I/O 口的相关的寄存器 ( 数据寄存器 方向寄存器和属性寄存器 ) 设置不变, 所以 I/O 端口管脚状态保持不变 来自 I/O 管脚的外部中断或者看门狗中断可以唤醒系统重新进入正常模式, 所以在进入 STOP 模式之前必须打开相应的中断 若使用看门狗进行唤醒, 则必须先打开看门狗定时器 而外部复位可看作特殊的唤醒源, 当系统工作在 STOP 模式下时, 外部复位的效果实际上就是使系统复位, 然后再进入正常工作模式 ( 程序从头执行 ) 系统在 STOP 模式下由外部中断或看门狗中断唤醒时, 系统会延时 40ms 的时间 ( 延时波动为 20ms~60ms) 以待系统时钟稳定, 之后才进入正常的唤醒后操作 在 HALT 模式下, 所有的周边保持原来状态, 正常工作 只有 CPU 停止工作以节省功耗, 所以 HALT 模式下功耗大于 STOP 模式下的功耗 HALT 模式下, 所有的中断源都可以作为唤醒源 表 8.5 为三种模式下 CPU 和周边硬件的运行情况 表 8.5 CPU 和周边硬件运行表 工作模式 写寄存器 P_Mode_Ctrl CPU 工作状态 外围工作状态 ($31) STOP #5Ah OFF OFF HALT #A5h OFF ON NORMAL - ON ON 三种工作模式之间的关系请参考图 8.8 系统复位 Stop 模式 写 0x5A 到 P_Mode_Ctrl 写 0xA5 到 P_Mode_Ctrl Normal 唤醒源 : 模式 唤醒源 : INT0~5 和看门狗中断 所有中断 Halt 模式 写 0x66 到 P_Mode_Ctrl 复位除了 CPU 外的所有内部模块 图 8.8 工作模式转换 Tel: mcu@sunplus.com.cn 173

180 凌阳 8 位通用单片机 低功耗模式控制寄存器 P_MODE_Ctrl($31) 默认值为 #00h, 其功能请参考表 8.6 表 8.6 低功耗模式控制寄存器 P_MODE_Ctrl($31,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Mode_Ctrl7 Mode_Ctrl6 Mode_Ctrl5 Mode_Ctrl4 Mode_Ctrl3 Mode_Ctrl2 Mode_Ctrl1 Mode_Ctrl0 R/W R/W R/W R/W R/W R/W R/W R/W Bit [7:0] Mode_Ctrl[7:0]: 工作模式选择位读操作 : 数值总是 0x00 写操作 : 0x5A= 进入 Stop 模式 0xA5= 进入 HALT 模式 0x66= 复位除了 CPU 外的所有内部模块 注 : 寄存器 P_Mode_Ctrl 进行设置时需要连续写两次才能将值有效写入 操作 : 1. 进入 STOP 模式操作在进入 STOP 模式前必须清除所有的中断请求标志 (P_INT_Flag0, P_INT_Flag1, P_INT_Flag2), 和使能相应的外部中断作为唤醒源 然后执行进入 STOP 模式指令, 即连续两次写 #5Ah 到低功耗控制寄存器 P_Mode_Ctrl, 由于系统可能会受到外界干扰等情况, 所以为了增加程序的可靠性, 可以插入多于 2 条的 NOP 指令 2. 唤醒 STOP 模式操作外部复位或外部中断都可以将单片机从 STOP 模式唤醒到正常工作模式 而外部复位实际上是系统复位的操作, 会将初始化所有控制寄存器为默认值, 但并不改变片内 RAM 的数值 外部中断唤醒方式将保留片内 RAM 和控制寄存器的数值 当使用中断将 CPU 唤醒后, 程序会产生分支 : 如果状态寄存器 P 中的中断屏蔽位 (I) 为 1, 主程序会继续执行 进入 STOP 语句 的下一句指令, 继续执行 但是如果 (I) 为 0, 主程序便会跳转到中断服务子程序去执行, 执行完后会返回到 进入 STOP 语句 的下一句指令, 继续执行 174 mcu@sunplus.com.cn Tel:

181 第 8 章其它硬件功能模块原理及应用 进入 STOP 模式 STOP 模式 有唤醒源到来 No Yes I 标志位 =0? Yes No 执行中断服务程序 执行 进入 STOP 指令 的下一条指令 图 8.9 STOP 模式操作流程图 1. 进入 HALT 模式在进入 HALT 模式前必须清除所有的中断请求标志 (P_INT_Flag0, P_INT_Flag1, P_INT_Flag2), 和使能相应的外部中断作为唤醒源 然后执行进入 HALT 模式指令, 即连续两次写 #A5h 到低功耗控制寄存器 P_Mode_Ctrl, 由于系统可能会受到外界干扰等情况, 所以为了增加程序的可靠性, 可以插入多于 2 条的 NOP 指令 2. 唤醒 HALT 模式所有的中断都可以作为 HALT 模式的唤醒源, 例如 : 外部中断 定时 / 计数器溢出中断 看门狗中断 ADC 中断 捕获中断 SPI 中断和 UART 通讯中断等 同样外部复位也可以使系统从 HALT 模式 唤醒, 使系统复位 ; 外部复位唤醒将初始化控制寄存器为默认值但并不改变 RAM 的值 ; 通过外部中断则二者的值都不会改变 当使用中断将 CPU 唤醒后, 程序会产生分支 : 如果状态寄存器 P 中的中断屏蔽位 (I) 为 1, 主程序会继续执行 进入 HALT 语句 的下一句指令, 继续执行 但是如果 (I) 为 0, 主程序便会跳转到中断服务子程序去执行, 执行完后会返回到 进入 HALT 语句 的下一句指令, 继续执行 Tel: mcu@sunplus.com.cn 175

182 凌阳 8 位通用单片机 进入 HALT 模式 HALT 模式 有唤醒源到来 No Yes I 标志位 =0? Yes No 执行中断服务程序 执行 进入 HALT 指令 的下一条指令 图 8.10 HALT 模式操作流程图 例 8-2 设置进入 STOP 模式, 并使能 INT0 作为唤醒源 lda # B sta P_IOB_Data sta P_IOB_Attrib lda # B ; 设置 PB4 为下拉输入, 作为 INT0 唤醒输入 sta P_IOB_Dir lda # B ; 设置 INT0 为上升沿触发, 其余为下降沿触发 sta P_IRQ_Opt1 sta P_IRQ_Opt1 lda #FFh sta P_INT_Flag0 ; 清中断请求标志 lda # B ; 使能 IRQ0 INT (INT0) 作为唤醒源 sta P_INT_Ctrl0 cli ; 打开全部中断 lda #5Ah ; 进入 STOP 模式 sta P_MODE_Ctrl sta P_MODE_Ctrl nop ; 添加两条 NOP 指令 nop lda #00h 176 mcu@sunplus.com.cn Tel:

183 第 8 章其它硬件功能模块原理及应用 8.4 看门狗定时器 看门狗定时器结构看门狗定时器用来产生定时信号, 从而判断系统是否运行正常, 其时钟源来自片内 RC 振荡电路, 振荡频率典型值为 25kHz 看门狗定时器的中断频率可以通过软件设置改变( 看门狗定时器控制寄存器 P_WDT_Ctrl 设置 ), 当其连续中断 8 次, 便会溢出产生看门狗复位信号, 复位 CPU 其结构图请参考图 8.11 WDTEN WDSTOP RESET WDTCLR 看门狗时钟 Slow Clock WDCLRB 看门狗定时器 WDS[2:0] 看门狗复位计数 WD_Reset_n 看门狗复位信号 D SET Q D SET Q WDI 看门狗中断 系统时钟 0 CLR Q CLR Q 看门狗时钟 1 WD_STOP_EN 图 8.11 看门狗定时器结构图 看门狗定时器控制寄存器看门狗定时器的相关设置是通过写看门狗定时器控制寄存器 P_WDT_Ctrl($32) 实现的, 其默认初值为 #F0h; 看门狗定时器控制寄存器的功能请参考表 8.7 表 8.7 看门狗定时器控制寄存器 ($32,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 SCKEN WDS2 WDS1 WDS R/W R/W R/W R/W Bit [7] SCKEN:STOP 模式下看门狗定时器 ( 即慢速的 25KHz 振荡器 ) 使能位 0 = STOP 模式下禁止看门狗定时器 1 = STOP 模式下使能看门狗定时器 Bit [6:4] WDS [2:0]: 看门狗中断时钟选择位 000 = fslow/128 Tel: mcu@sunplus.com.cn 177

184 凌阳 8 位通用单片机 001 = fslow/ = fslow/ = fslow/ = fslow/ = fslow/ = fslow/ = fslow/16384 f slow : 片内 RC 振荡频率典型值为 25kHz 注 : 寄存器 P_WDT_Ctrl 进行设置时需要连续写两次才能将值有效写入 程序正常运行时, 需要在规定的时间内清狗, 具体操作为向清狗寄存器 P_WDT_Clr($10) 中写入 #55h 表 8.8 清狗寄存器 P_WDT_Clr($10,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit R/W R/W R/W R/W R/W R/W R/W R/W Bit [7:0] WDT_CLR[7:0]: 清狗指令 写操作 : #55h 到清狗计数器进行清狗操作 读操作 : 始终为 #00h 总结 :1 用户可以通过寄存器 P_WDT_Ctrl($32h) 设置合适的看门狗定时器中断频率 ; 2 在看门狗功能使能的情况下, 要在特定的时间间隔内写 #55h 到寄存器 P_WDT_Clr($10) 进行清狗操作 看门狗中断 使能看门狗中断的设置步骤如下 : 1. 使能看门狗中断 ; 2. 用 SEI 指令关闭中断 ; 3. 设置看门狗操作相关的寄存器, 如 P_INT_Ctrl0 中的 WDT 使能位和 P_WDT_Ctrl 中的 WDT 周期 ; 4. 用 CLI 指令打开中断 ; 5. 等待中断产生 例 8-3 设置看门狗定时器 lda #F0h ; 设置看门狗中断为 25KHz/16384= 1.5Hz sta sta lda P_WDT_Ctrl P_WDT_Ctrl #FFh sta P_INT_Flag0 ; 清看门狗复位标志 set P_INT_Ctrl0,6 ; 使能看门狗中断 cli ; 打开总中断 178 mcu@sunplus.com.cn Tel:

185 第 8 章其它硬件功能模块原理及应用 8.5 时基与蜂鸣器输出 时基 SPMC65 系列单片机提供了一个 8 位时基定时器, 用来产生时间基准信号 ( 简称时基信号 ), 即产生一所选定频率的时基中断信号 ; 时基信号的周期从 16us~1s 共 15 种可选, 通过设置时基 / 蜂鸣器控制寄存器 P_BUZ_Ctrl($2D) 的 Bit [7:4] 位 ( 即 INTIMS [3:0]) 选择, 以提供系统控制中需要的时钟信号 蜂鸣器 SPMC65 系列单片机支持蜂鸣器驱动输出 通过输出频率可调 占空比为 50% 的方波来驱动蜂鸣器, 频率在 1KHz(976Hz) 到 2MHz 之间可选, 通过设置时基 / 蜂鸣器控制寄存器 P_BUZ_Ctrl($2D) 的 Bit [3:0] 位 ( 即 BZFS [3:0]) 进行选择 时基和蜂鸣器输出控制寄存器 P_BUZ_Ctrl($2D) 时基和蜂鸣器输出控制寄存器 P_BUZ_Ctrl($2D) 用来选择时基时钟和蜂鸣器驱动输出的频率 其默认初始值为 #00h, 具体功能请参考表 8.9 表 8.9 时基和蜂鸣器输出控制寄存器 P_BUZ_Ctrl($2D,R/W) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 INTIMS3 INTIMS2 INTIMS1 INTIMS0 BZFS3 BZFS2 BZFS1 BZFS0 R/W R/W R/W R/W R/W R/W R/W R/W Bit [7:4] INTIMS[3:0]: 时基时钟选择位 0000 = 时基功能禁止 0001 = F SYS / = F SYS / = F SYS / = F SYS / = F SYS / = F SYS / = F SYS / = F SYS / = F SYS / = F SYS / = F SYS / = F SYS / = F SYS / = F SYS / = F SYS /2 23 Bit [3:0] BZFS[3:0]: 蜂鸣器时钟频率选择位 0000 = 蜂鸣器输出功能禁止 0001 = F SYS / = F SYS / = F SYS / = F SYS / = F SYS / = F SYS / = F SYS / = F SYS / = F SYS / = F SYS / = F SYS / = F SYS / = F SYS / = F SYS / = F SYS /2 5 例 8-4 利用时基定时器产生 512 us 为周期的中断 (F SYS = 8MHz) Tel: mcu@sunplus.com.cn 179

186 凌阳 8 位通用单片机 lda #60h ; 设置时基频率为 512us sta P_BUZ_Ctrl lda #20h sta P_INT_Ctrl2 ; 使能时基定时器中断 cli ; 使能中断 例 8-5 利用蜂鸣器输出 128us, 占空比为 50% 的信号 (F SYS = 8MHz) lda #05h ; 设置蜂鸣器输出频率为 128 us sta P_BUZ_Ctrl 180 mcu@sunplus.com.cn Tel:

187 第 9 章 SPMC65 系列单片机开发工具 第 9 章 SPMC65 系列单片机开发工具 9.1 概述 本章重点介绍利用 SPMC65 系列单片机进行项目开发的流程, 以及开发工具的使用方法 1. 程序的编写 仿真 调试此过程中用到的软件开发工具为凌阳科技提供的 FortisIDE 集成开发环境, 硬件开发工具为凌阳科技专为 SPMC65 系列单片机开发设计的在线仿真编程器 2. 程序的烧写此过程中用到的软件开发工具为凌阳科技提供的 Q-Writer, 硬件开发工具为凌阳科技专为 SPMC65 系列单片机开发设计的在线仿真编程器 9.2 集成开发环境 FortisIDE 凌阳科技提供了一种支持 SPMC65 系列单片机的集成开发环境 FortisIDE, 具有工程管理 文本编辑 程序编译和调试等多种功能, 还具备非常友好的用户界面 下拉菜单 快捷方式和快速访问命令列表等, 能够方便地进行编辑 调试程序, 且其可以仿真 SPMC65 系列所有芯片的功能, 大大提高了开发效率 FortisIDETM 集成开发环境运行的软件平台为 Windows 98 / 2000 /XP 软件开发工具的安装先在 网站下载或凌阳单片机推广中心赠送的 MCU 光盘当中找到 SPMC65Toolkit.exe 软件安装包 ( 或者是三个分开的安装包 :Fortis IDE Fortis IDE Body 以及 Q-Writer), 运行并安装 SPMC65Toolkit.exe 安装包运行时会把 Fortis IDE 软件 Fortis IDE Body 以及 Q-Writer 软件一起安装到用户的 PC 中 Fortis IDE 是集成开发环境, 而 Fortis IDE Body 则是集成开发环境所需要的有关芯片型号的信息以及对应芯片的范例程序等, 如用分开的安装包进行安装时,Fortist IDE 安装完后必需安装 Fortis IDE Body;Q-Writer 为配合 SPMC65 系列芯片进行编程的工具软件 SPMC65 系列单片机软件开发工具快速入门用一根 USB 连接线将在线仿真编程器与 PC 机相连, 并接上在线仿真器的电源 1. 选择 [ 开始 ] [ 程序 ] [Sunplus] [FortisIDE] [FortisIDE-V ] 运行 FortisIDE 2. 打开工程 : 选择 [File] [Open Project], 在 打开 对话框中选择工程路径 新建工程 : 选择 [File] [New], 在 New 对话框中添加工程名称, 并选择工程建立的路径, 在 main.asm 中编写程序 3. Workspace 窗口显示在左半边, 此窗口内可以看到当前工程所包含的所有文件 4. 选择 [Build] [Rebuild All], 进行源文件的编译和链接, 编译链接过程里的错误会显示在 Output 窗口内 5. 选择 [Build] [Start Debug] [Download], 将程序下载到仿真芯片中 6. 选择 [Build] [Start Debug] [Go], 在仿真片中运行程序, 进行在线调试 Tel: mcu@sunplus.com.cn 181

188 凌阳 8 位通用单片机 7. 选择 [Tool] [Q-Writer], 打开 Q-Writer 软件, 进行 OTP 单片机编程 注 1:V1.6.5 为版本号, 本章有关 FortisIDE 的介绍都是以 FortisIDE-V1.6.5 的版本为介绍对象 工程中包含文件类型说明工程包括创建一个特定程序所要的各种信息 新建立的工程应包含 8 种文件 :*.spj *.rc *.set *.env* *.asm prog.lik *.cmd *.inc 一个工程建成后,FortisIDE 自动将这 8 种文件添加到工程内 *.spj, *.rc, *.set, *.env ( 与工程文件同名 ): 系统文件, 后缀为.spj 的文件为工程文件, 用户打开一个工程时打开 *.spj 文件即可 *.asm: 汇编语言程序文件 Prog.lik: 链接器根据它来决定如何链接目标文件, 用 FortisIDE 打开该文件, 可以直接对文件的内容进行修改 *.cmd ( 与工程文件同名 ): 根据它来决定如何向仿真芯片中下载二进制文件 (.tsk/.bin), 即决定 ICE/ 仿真板上的文件映象 *.inc: 头文件, 在其中对每一个 I/O 端口和硬件寄存器进行了定义 ; 它必须被包含在源代码内 *.bin: 系统编译后生成的二进制文件, 用于烧写芯片 9.3 Fortis IDE 用户编程界面 Fortis IDE 包含一系列的用于程序开发的工具, 它能让用户方便地在一个集成开发环境内进行程序的编辑 编译 链接和调试 在主界面上, 用户将看到 3 个主要的窗口 :Workspace 窗口 Output 窗口 Editor 窗口 主菜单 工具栏 WorkSpace 窗口 Edit 窗口 Output 窗口 图 9.1 FortisIDE 集成开发环境 182 mcu@sunplus.com.cn Tel:

189 第 9 章 SPMC65 系列单片机开发工具 Work Space 窗口 Work Space 窗口中的 File View 标签用于显示所有的自动生成的文件和用户定义的文件 Output 窗口 Output 窗口向用户提供了一个方便的浏览编译 调试和文本查找状态的途径 用户单击 Build Debug 和 Find in Files 等面板, 可以激活相应的面板 1.Build 面板显示编译和链接过程里产生的信息, 例如程序编译过程中产生的错误和警告信息等 如果编译中没有产生错误或警告信息, 表示程序成功地通过编译 在报错信息行或警告信息行双击鼠标, 即可将光标定位到产生错误和警告的源代码行 2.Debug 面板显示调试过程中的各项信息 3.Find in Files 面板显示查找的结果 查找结果默认显示在 Find in Files1 面板内 如需显示到 Find in Files2 面板内, 用户需点选 Find in Files 文本编辑器窗口用户能够通过文本编辑器窗口编写程序代码 当打开一个文件的时候, 其内容就会显示在文本编辑器里 从这个窗口的任意位置单击鼠标右键, 都能够弹出功能丰富的快捷菜单 9.4 FortisIDE 的使用 在本节中会按照产品开发流程的思路介绍 FortisIDE 的使用, 主要内容 : 创建工程 设置工程 管理工程 编译工程 运行工程 调试工程 创建工程单击 [File] [New], 弹出一个 New 对话框 图 9.2 New 对话框在 New 对话框中选择 [Project], 在 Location 文本框中选择工程存放的位置, 在 File 文本框中添加新建工程的名称,( 比如 Timer0_LED ) Tel: mcu@sunplus.com.cn 183

190 凌阳 8 位通用单片机 图 9.3 输入工程名 单击 Next, 选择实际使用 SPMC65 系列单片机的具体 Body( 芯片型号 ) 单击 [Finish], 工程创建成功 图 9.4 选择芯片型号 图 9.5 新建后的工程 在 Workspace 窗口中可以看到新建工程中所含文件情况 此时可以看到已经自动生成的头文件 ( 如果 184 mcu@sunplus.com.cn Tel:

191 第 9 章 SPMC65 系列单片机开发工具 上一步中选择的是 SPMC65P2408A, 工程便会自动生成头文件 SPMC65P2408A.inc), 其中包含了对 Body 的每一个 I/O 端口和硬件寄存器进行定义的相关信息 另外还有文件 main.asm, 提供用来编写主程序的文件 设置工程 1. 选择 [Project] [Setting], 打开 Setting 对话框, 单击工程名 Timer0_LED File, 便可以看到 Setting 对话框中全部标签项 图 9.6 选择 Setting 2. 点击 General 标签, 可以看到当前工程所用的芯片类型和相应的系列名 CPU 的类型, 用户还可为编译过程中生成的目标文件和临时文件设定存储的路径 3. 单击 Option 标签, 用户能对工具链接和资源进行各种设置 ( 此页用默认选项即可 ) 4. 单击 Link 标签, 用户能够选择需要链接到当前工程的外部目标文件 (*.obj) 库文件 (*.lib) 在 Target file name 文本框内, 用户能指定所需链接的目标文件的名称和路径 图 9.7 Setting 对话框的 Link 标签项 5. 点击 Mask Option 标签, 用户可以进行相应的芯片配置选项设置 SPMC65 系列单片机的芯片配置选项包括 :OSC Option Low Voltage Reset (LVR) Watch Dog Timer Option RC Oscillator Output GPIO Initial Setting 和 NMI Source Setting 用户需根据实际情况设定合适的选项 Tel: mcu@sunplus.com.cn 185

192 凌阳 8 位通用单片机 图 9.8 Mask Option 标签 (1) OSC Option 选项中可以选择 Crystal( 晶体 ) RC Oscillator(RC 振荡 ) External Clock ( 外部时钟输入 ) 三种时钟输入方式 (2) Low Voltage Reset (LVR) 可以选择 Enabled 和 Disabled 两项, 即可以设置低电压复位功能使能 / 禁止 ; (3) Watch Dog Timer Option 可以选择 Enabled 和 Disabled 两项, 即可以设置看门狗功能允许 / 禁止 ; (4) RC Oscillator Output 可以选择 Clock output 或 No output 两项, 即系统时钟输入选择 RC 振荡输入的时候, 可以通过该选项来选择 XO 管脚是否输出 RC 振荡信号 ; (5) GPIO Initial Setting 可以选择 All float 或 All pull low 两项, 即设置 I/O 端口的默认值为悬浮输入状态或下拉输入状态 (6) NMI Source Selection 可以选择 Disabled PB4(INT0) PB5(INT1) PD0(INT2) PD1(INT3) PD4(INT4) PD5(INT5) 最多 7 项 ( 与芯片型号有关 ), 即可以选择非屏蔽中断项 6. 单击 Device 标签, 用户可以选取一个下载线接口类型 将鼠标定位到 Used ICE Interface 列表框中的一个选项上后, 在相应选项的右侧用户会发现它所支持的 PROBE 类型 如选取 Auto detect,ide 将自动检查当前所连接的 ICE 接口和 ICE 选中 PC Trace Enable 项,FortisIDE 能够记录停止运行前执行的程序运行路径 186 mcu@sunplus.com.cn Tel:

193 第 9 章 SPMC65 系列单片机开发工具 图 9.9 Device 标签项 管理工程 1. 向工程内添加文件 方法一 : 单击 [Project] [Add File to Project] [File], 激活 Add File 对话框 图 9.10 选择文件加载 选取需要添加到工程里的文件后, 单击 [Add] 添加文件 图 9.11 打开文件 对话框方法二 : 在 Workspace 窗口的某一个文件夹上单击鼠标右键, 选中 [Add File to Folder] 且在相应的对话框之中选 Tel: mcu@sunplus.com.cn 187

194 凌阳 8 位通用单片机 择需要添加的文件的名称 图 9.12 Workspace 加载文件 2. 新建文件单击 [File] [New], 弹出一个 New 对话框 FortisIDE 支持的文件类型包含 :asm ( 汇编文件 ) inc ( 包含文件 ) 和 txt ( 文本文件 ) (1) 在左边的文件类型列表内选取所要建立的文件的类型 (2) 在 File 和 Location 文本框内分别输入文件的名称和存储的路径 (3) 单击 [OK] 图 9.13 新建文件 对话框 3. 删除文件方法一 : 在 Workspace 窗口内单击某一文件名, 按键盘的 DEL 键, 即删除相应的文件 方法二 : 还可以通过在 Workspace 窗口内用鼠标右键单击某一文件名, 再从弹出的快捷菜单内点选 [Remove], 删除该文件 4. 打开文件 188 mcu@sunplus.com.cn Tel:

195 第 9 章 SPMC65 系列单片机开发工具 FortisIDE 提供了两种打开文件的方法 : 方法一 : 单击 [File] [Open], 弹出 Open 对话框, 在对话框内选取所需的文件 方法二 : 单击 [File] [Recent Files], 在当前的 Recent File 列表内选取一个文件后, 该文件自动被打开 Recent Files 菜单最多列出 8 个近期内被打开过的文件名称 5. 保存文件当正在被编辑的文件的标题栏上文件名称后面有 * 标号时, 表示本文件正在被编辑且最新的修改还未被保存 保存后, * 标号会自动消失 方法一 : 单击 [File] [Save], 将文件按当前的名称进行保存 方法二 : 单击 [File] [Save As], 将文件以不同的名称进行保存 方法三 : 单击 [File] [Save All], 保存当前所有打开的文件 编写程序 Fortis IDE 为每个新建的工程自动加入了一个 Main.asm 文件, 为用户提供了汇编文件的模版, 用户的主程序可以直接在 Main.asm 文件中进行编辑 在 Main.asm 文件中除了一个汇编文件所必需的汇编器指示信息 用户变量定义区或程序编写区外, 还提供了中断服务程序的模版, 以及各个向量的声明 ( 一个工程中所必需有的 ) 等 ;Main.asm 具体的结构请参考下面的介绍 Tel: mcu@sunplus.com.cn 189

196 凌阳 8 位通用单片机 ;================================================================================== ; The information contained herein is the exclusive property of ; Sunplus Technology Co. And shall not be distributed, reproduced, ; or disclosed in whole in part without prior written permission. ; (C) COPYRIGHT 2005 SUNPLUS TECHNOLOGY CO. 软件版权声明 ; ALL RIGHTS RESERVED ; The entire notice above must be reproduced on all authorized copies. ;================================================================================== ;================================================================================== ; Project Name : ; Applied Body : SPMC65P2408A ; Firmware version: ; Programer : ; Date : ; Description : 工程相关声明 ; ; Hardware Connect: ; Link File : ; IDE Version : ; BODY Version : ;==================================================================================.SYNTAX 6502.LINKLIST.SYMBOLS ; Process standard 6502 addressing syntax ; Generate linklist information ; Generate symbolic debug information 指导汇编器进行汇编 ;**************************************** ;* * ;* System Register Define * ;* * ;****************************************.INCLUDE SPMC65P2408A.inc ; Define all hardware,registers and ports. ;**************************************** 相关系统寄存器定义 190 mcu@sunplus.com.cn Tel:

197 第 9 章 SPMC65 系列单片机开发工具 ;* * ;****************************************.PAGE0 ; define values in the range from 00h to FFh 用户定义变量区域.DATA ; define data storage section 用户定义变量区域 ;**************************************** ; Program Area ;****************************************.CODE ; ;**************************************** ;*Power on Reset Process - Main Program ;****************************************.PUBLIC V_Reset ; V_Reset: 主程序编写区域 ;**************************************** ;* * ;* NMI Interrupt Service Routine * ;* * ;**************************************** V_NMI: pha txa ; push A register ; transfer X to A pha ; push A register (ie. push X) ; ; NMI codes are placed here ; pla 非屏蔽中断服务子程序编写区域 ; pop A register Tel: mcu@sunplus.com.cn 191

198 凌阳 8 位通用单片机 tax ; transfer A to X pla ; pop A register (ie. pop X) rti ;**************************************** ;* * ;* IRQ Interrupt Service Routine * ;* * ;**************************************** V_IRQ: pha txa ; push A register ; transfer X to A pha ; push A register (ie. push X) ; ; ; IRQ codes are placed here 可屏蔽中断服务子程序编写区域 ; pla tax ; pop A register ; transfer A to X pla ; pop A register (ie. pop X) rti ;**************************************** ;* Interrupt Vector Table * ;**************************************** VECTOR:.SECTION DW V_NMI ; Non-mask interrupt vector(no use) DW V_Reset ; Reset vector DW V_IRQ ; IRQ interrupt vector 各向量声明 ;**************************************** ;* End Of Interrupt Vector Table * ;****************************************.END ; end of program ; new line of the end 程序结束 编译工程 单击 [Build] [Compile], 对当前打开的源文件进行编译 ( 它等同于在 Workspace 窗口的 *.asm 文件名称上单击鼠标右键后选取 [Compile]) 192 mcu@sunplus.com.cn Tel:

199 第 9 章 SPMC65 系列单片机开发工具 单击 [Build] [Build], 对当前工程进行编译 该功能用于对自前次编译后被改动的源文件进行编译 单击 [Build] [Rebuild All], 重新编译当前工程内的所有源文件 单击 [Build] [Stop Build], 停止编译 用户通过 Output 窗口可以查看编译信息, 包括程序编译过程中产生的一些错误和警告信息 运行工程程序被编译成功后, 如果电脑与在线仿真编程器连接正常 ( 硬件连接 : 用 USB 连接线将在线仿真编程器与 PC 机相连 ), 便可以直接下载运行程序 步骤 : 1. 单击 [Build] [Start Debug] [Download], 下载程序到仿真芯片中 2. 单击 [Build] [Start Debug] [Go], 运行程序 调试工程程序下载到仿真芯片后, 便进入了调试状态, 此时可以利用 [View] [Debug Windows] 或工具栏上的图标激活相应调试窗口 调试窗口可用于查看 修改 CPU 寄存器 内存 I/O 端口的信息 WorkSpace 窗口 Edit 窗口 Watch 窗口 Register 窗口 Memory 窗口 图 9.14 Debug 窗口 Register 窗口 : 显示通用寄存器和状态寄存器的内容 Memory 窗口 : 显示各地址单元中的数据 Watch 窗口 : 显示各个变量的值和地址 1. 利用 Register 窗口进行调试打开方式 :[View] [Debug Windows] [Register] Register 窗口显示各个通用寄存器和 CPU 状态寄存器的值 ICE 版本 ICE 接口 CPU 的时钟的状态等 用户可以对其中一些信息进行修改, 改动后的内容会被立即通过 ICE 传递给仿真板 Tel: mcu@sunplus.com.cn 193

200 凌阳 8 位通用单片机 图 9.15 Register 窗口 2. 利用 Watch 窗口进行调试打开方式 :[View] [Debug Windows] [Watch] 图 9.16 Watch 窗口在进行程序的调试时, 用户能够利用 Watch 窗口查看和更改变量的值 Watch 窗口由 Watch1 Watch2 Watch3 和 Watch4 组成 每一个视窗利用一个数据表来显示变量的地址和值 向 Name 栏内输入变量名称后,Value 栏和 Address 栏会自动显示该变量的值和地址 用户还可以根据自己的需要对 Value 栏里的变量值进行修改 如果某个变量的数据显示为红色, 表明它刚刚被修改过 在 Watch 窗口单击鼠标右键, 可以激活相应的热键菜单 利用 Paste Show decimal/hexadecimal Hide Add Remove 和 Remove all, 用户可改变数据的显示格式 添加和删除数据 控制 Watch 窗口的显隐 3. 利用设置断点进行调试设定一个硬件 / 软件断点后, 在指令行前会出现蓝点 / 红点 软件断点只能支持指令断点, 数量没有限制 ; 硬件断点包含指令断点和条件断点, 硬件断点的个数最多为 2 个 设置断点后当程序全速运行到此处便会停止下来, 以便观察相关的内容 设置方法 : 软件断点的设置 : 将鼠标置于需要设定软件断点的命令行内, 按 [F9] 软件断点的取消 : 将鼠标置于需要取消软件断点的命令行内, 再单击工具栏图标 硬件断点的设置 : 将鼠标置于需要设定硬件断点的命令行内, 按 [F6] 硬件断点的取消 : 将鼠标置于需要取消硬件断点的命令行内, 再单击工具栏图标 FortisIDE 工具栏常用图标对照表显示 / 隐藏 Workspace 窗口 显示 / 隐藏 Output 窗口 管理所有已经打开的文件 在多个文件内查找文本 加载目标文件 194 mcu@sunplus.com.cn Tel:

201 第 9 章 SPMC65 系列单片机开发工具 编辑源文件 编译工程 停止编译 从当前光标所在位置开始全速运行程序, 直到运行结束或遇到断点才停止运行 将程序下载到 ICE/ 仿真板 插入 / 删除软件断点 删除所有的软件断点 插入 / 删除硬件断点 删除所有的硬件断点 中断程序的运行 停止调试 程序复位 单步运行程序, 如其后的一条指令为子程序调用, 会进入子程序继续单步执行 单步运行程序, 如其后的一条指令子程序调用, 会执行完整个子程序, 然后指向子程序调用的下一条指令 单步运行程序, 如果该指令在一个子程序中, 会将该子程序执行完毕, 返回子程序调用的下一条指令 运行程序到当前光标所在行 显示 / 隐藏 Watch 窗口 显示 / 隐藏 Register 窗口 显示 / 隐藏 Memory 窗口 显示 / 隐藏 Disassembly 窗口 显示 / 隐藏 Command 窗口 显示跟踪缓存 删除跟踪缓存 9.5 SPMC65 系列单片机硬件开发工具 凌阳专为 SPMC65 系列单片机的开发设计了一款 仿真烧写一体机 - 在线仿真编程器, 用于仿真和烧写 SPMC65 系列所有芯片, 适合用户灵活方便的进行各种硬件系统开发 Tel: mcu@sunplus.com.cn 195

202 电源(VDD )选择开关凌阳 8 位通用单片机 编程座 电源接口USB 线接口9V 电源指示灯运行指示灯 睡眠指示灯仿真排线插座复位按键 图 9.17 在线仿真编程器效果图 在线仿真编程器结构简介 USB 线接口 ; 9V 电源输入端 ; 编程座, 用于 OTP 芯片编程时插入芯片, 靠上对齐 ; 仿真编程器和目标板芯片电源 (VDD) 连接开关, 当拨到 ON 时, 仿真编程器和目标板芯片电源连通 ; 当拨到 OFF 时, 仿真编程器和目标板芯片电源断开 仿真排线插座 ; 复位按键 ; 睡眠 指示灯, 黄色 ; 运行 指示灯, 绿色 ; 电源 指示灯, 红色 ; 在线仿真编程器使用方法 1. 将在线仿真编程器与 PC 机相连 将 USB 连接线的 D 形口插入在线仿真编程器, 再将 USB 连接线的扁口端插入 PC 机的 USB 接口即可 2. 将在线仿真编程器与用户目标板相连 在线仿真编程器通过一组仿真排线将 SPMC65 系列单片机的所有 I/O 引出至仿真头上 SPMC65 系列 196 mcu@sunplus.com.cn Tel:

203 第 9 章 SPMC65 系列单片机开发工具 的每种型号单片机都配备有一个相应的仿真头 ( 如用户希望使用的单片机为 SPMC65P2408A 时, 则需要使用 SPMC65P2408A 仿真头 ) 用户使用时, 将仿真排线连接至对应的仿真头上, 并将仿真头插至目标板上, 这样就可以调试目标系统了 如图 9.18 所示 图 9.18 在线仿真编程器和仿真头的连接两根仿真排线接口从左到右分别为 JP1 和 JP2,JP1 和 JP2 的引针对应 SPMC65 系列单片机的端口情况如图 9.19 所示 ;JP1 和 JP2 的第 1 脚都为靠向在线仿真编程器正面的右下角的地方, 所以用户如直接从仿真排线接口引出信号线进行实验时, 需要注意接口引针对应端口的情况 JP1 JP2 VDD PB7 PB6 PB5 PB4 PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC PB3 PB2 PB1 PB0 PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0 VDD VDD PF7 PF6 PF5 PF4 PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD PF3 PF2 PF1 PF0 PE7 PE6 PE5 PE4 PE3 PE2 PE1 PE0 VDD 图 9.19 仿真排线信号描述 3. 连接电源 在线仿真编程器与目标板有三种可选的供电方式 : (1) 仿真编程器与目标板各自独立供电 将电源连接开关拨至 OFF 位置, 使仿真编程器与目标板单片机电源 (VDD) 处于断开状态 ( 地线连通 ) 然后在仿真编程器的电源输入端接入 DC - 9V 电源, 为仿真编程器供电 ; 而用户目标板则使用独立的电源供电 (2) 仿真编程器为目标板供电 将电源连接开关拨至 ON 位置, 使仿真编程器与目标板单片机电源处于连通状态 在仿真编程器的电源输入端接入 DC - 9V 电源, 此电源在为仿真编程器供电的同时, 也为用户目标板供电 (3) 目标板为仿真编程器供电 首先确认仿真编程器的电源输入端没有接入电源, 然后将电源连接开关拨到 ON 位置 给目标板加上电源, 此电源在为用户目标板供电的同时, 也为仿真编程器供电 注意 : 目标板为仿真编程器提供的电压应为 5V( 推荐值 ); 当电压大于 6V 时, 仿真编程器的过压保护 Tel: mcu@sunplus.com.cn 197

204 凌阳 8 位通用单片机 功能使电路断开 仿真编程器的过压保护电路采用 USB 口提供的电源, 所以采用目标板为仿真编程器供电时,USB 线必须首先接入 在线仿真编程器上有一个电源指示灯 I, 用于指示当前的电源状态, 在线仿真编程器接上电源后, 该指示灯亮 4. 仿真调试 此时可以配合 FortisIDE 下载 仿真和调试程序 (FortisIDE 的使用方法请参见 10.4 节内容 ) 在线仿真编程器有一个运行指示灯和一个睡眠指示灯, 当系统运行在正常模式时, 运行指示灯会闪烁, 当系统进入睡眠模式下时, 睡眠指示灯亮 5. 单片机编程 将芯片插入烧写座, 芯片的 1 管脚位于烧写座的左上角放入, 具体方式请参见图 9.20 配合 Q-Writer 工具进行芯片烧写 (Q-Writer 的使用方法请参见 10.6 节内容 ) 图 9.20 芯片插入烧写座的方式示意图 9.6 Q-Writer 的使用 凌阳科技公司提供的 Q-Writer 是专门配合 SPMC65 系列在线仿真编程器对 SPMC65 系列 OTP 单片机编程的工具软件 本节将介绍利用 Q-Writer 进行编程 以及产品序列号 产品信息 单片机加密等功能的设定方法 SPMC65 系列单片机开发工具安装包里已经包含了 Q-Writer 软件的安装包, 如果需要最新版本的软件可通过访问 网站获得该软件 运行 Q-Writer 安装包, 依照提示安装后即可使用 Q-Writer 简介 Q-Writer 是凌阳科技公司专门用于编程 SPMC65 系列单片机的一款编程工具软件,Q-Writer 具有友好的操作界面, 并且可靠易用 其界面如下图所示 : 198 mcu@sunplus.com.cn Tel:

205 第 9 章 SPMC65 系列单片机开发工具 菜单栏 程序存 储窗口 IC 内容 窗口 统计 窗口 状态窗口信息窗口 图 9.21 Q-Writer 界面程序存储窗口 :[Windows]->[Program Memory Window], 该窗口显示下载到 Q-Writer 中的二进制文件 IC 内容窗口 :[Windows]->[IC Content Window], 该窗口显示写入 IC 或从 IC 存储器中读出的内容 在操作过程中如有错误发生, 该窗口将高亮显示出错地址的内容 统计窗口 :[Windows]->[Statistic Window], 该窗口用来统计编程的数量 信息窗口 :[Windows]->[Message Window], 该窗口用来显示单片机 程序源文件以及编程等相关信息 状态窗口 :[Windows]->[Status Window], 此窗口显示了 Q-Writer 的所有操作结果 Q-Writer 设置 1, 选择 [Setting]->[Option], 选择设置窗口, 如图 9.22 所示 说明如下 图 9.22 设置窗口 Message Windows 用来设置在信息窗口 (Message Windows) 显示哪些信息, 如图 9.23, 在选项的前面打, 则在信息窗口显示对应信息 打开信息窗口的方法 :[Windows]->[Message Window] Tel: mcu@sunplus.com.cn 199

206 凌阳 8 位通用单片机 图 9.23 信息窗口 Security Setting 选项用来设置在对单片机加密时是否显示确认窗口 ; 如果选中则在对单片机加密时将出现需要确认的信息 2, 选择 [Setting]->[Program Statistic], 此功能用来激活 / 取消统计功能, 与工具栏中按钮的作用相同 3, 选择 [Setting]->[16 Bytes per Row], 此功能用来控制每一行显示的字节数 选中该功能后, 程序存储窗口内的每一行都将显示 16 个字节的数据形式, 否则, 程序存储窗口内的每一行的显示将根据 Q-Writer 窗口的大小自动调整 4, 选择 [Setting]->[ Show ASCII Code], 此功能用来显示程序存储窗口内二进制数据的 ASCII 码 使用 Q-Writer 进行烧写的步骤 1.Q-Writer 启动方法 1: 选择 [ 开始 ] [ 程序 ] [Sunplus] [Q-Writer] [Q-Writer-V1.0.0], 启动 Q-Writer 方法 2: 首先启动 FortisIDE, 之后点击工具栏中的 图标, 或者选择 [Tools] [Q-Writer] 启动 注 :FortisIDE 的 debug 模式和 Q-Writer 不能同时运行 2. 检查在线仿真编程器上的芯片是否为空白芯片选择 [Function]->[ Blank Check], 检查烧写器上的芯片是否为空白芯片 同时,Q-Writer 会读出芯片中的内容, 显示在 IC 内容窗口中 如果检查到该芯片不是空白的, 系统会在 IC 内容窗口中自动显示非空白区域, 并将其内容用红色高亮标记出来 只有空白芯片才可以进行烧写 3. 选择单片机型号选择 [Device]->[Select], 出现 Select Device 对话框, 如下图所示 ; 选择所要烧写的单片机型号即可 安装了 Q-Writer 后, 首次运行时, 必须选择单片机型号 当下次启动 Q-Writer 后, 如果烧写的单片机型号和上次相同, 可以不用选择, 即系统会默认为上一次选择的单片机型号 200 mcu@sunplus.com.cn Tel:

207 第 9 章 SPMC65 系列单片机开发工具 图 9.24 单片机型号选择 4. 打开文件方法 1: 选择 [File]->[Open], 打开需要编程到单片机中的 *.bin 或者 *.tsk 类型文件, 文件内容将显示在程序存储窗口 方法 2: 选择 [File]->[Recent Files], 会显示最近使用过的 *.bin 或者 *.tsk 类型文件, 可从中选择需要的文件, 最多记录最新打开的 4 个文件 5. 产品序列号以及产品信息的设置 (1) 产品序列号设置选择 [User Information]->[Serial Number],Q-Writer 指定了 4 个字节 ( 地址为 0x7FF0~0x7FF3) 作为序列号码的写入空间, 如下图所示 图 9.25 产品序列号设置 Start Address:0x7FF0 为序列号码的起始地址 其中 0x7FF0 为四个地址中的最低地址,0x7FF3 为最高地址 Size (1~4 bytes): 用户可以设定写入序列号码的字节数 Initial Number: 此项用来写入单片机的初始序列号 序列号写入单片机后, 程序存储窗口中相应地址的内容会被更新 其中, 未用到的字节默认值为 0xFF Tel: mcu@sunplus.com.cn 201

208 凌阳 8 位通用单片机 Mode: 此项用来设置序列号码的生成模式 系统提供了固定模式 (Fixed Number) 和自动模式 (Auto Increment) 两种模式 固定模式下,increment 项无效, 在每一个单片机进行编程时, 写入的序列号码均为初始设置值 自动模式下, 用户可以设定序列号码的递增或递减变化方式, 以及设定相应变化的增量值或减量值 设置完毕后, 写入单片机的序列号码将从初始设置值开始递增或递减 (2) 产品信息设置选择 [User Information]->[Product Info], 用户可以在 0x7FF4~0x7FFF 这 12 个字节写入任意的产品信息, 比如生产日期和生产厂商等 这些字节的默认值为 0xFF, 如下图所示 图 9.26 产品信息设置 6. 编程选择 [Function]->[Program], 将程序存储窗口的内容编程到 OTP 单片机上, 同时, 将单片机中的内容读出, 显示在 IC 内容窗口中 如果编程失败, 系统会跳到 IC 内容窗口中出错的位置, 将其内容用红色高亮显示 编程成功之后, 可执行 Verify 功能确保编程的可靠性 7. 验证选择 [Function]->[Verify], 验证编程到 OTP 单片机中的内容是否与源文件中的内容一致 启动 Verify 功能,Q-Writer 会将单片机中的内容读出, 显示在 IC 内容窗口, 然后和程序存储窗口中的内容 ( 源文件 ) 进行比较, 发现有不同之处, 系统会提示出错, 并跳到 IC 内容窗口中出错的位置, 将其内容用红色高亮显示 8. 加密选择 [Function]->[Secure], 设定单片机的加密功能 一旦加密, 单片机中的大部分内容将禁止读出 因此, 在对单片机进行加密前, 用户必须完成 program 和 verify 的操作 另外在对加密前,Q-Writer 还必须执行 Blank Check 功能, 若 OTP 单片机为空, 系统将不能对其进行加密操作 加密后, 仅允许读出单片机中的部分内容, 即单片机设置选项, 用户信息以及单片机存储器中最后 16 个字节 (0xFFF0~0xFFFF) 中的信息 其它地址的内容均显示为 0x 自动编程模式当需要对多颗单片机进行相同的编程时, 可以选择自动编程模式, 步骤如下 : (1) 打开 [Opration Mode] 选择自动编程模式 : A. Blank Program: 系统会自动对单片机进行 Blank check 和 Program 的连续操作, 如果在某一个环节发生错误, 编程动作都会立即停止, 提示错误信息 202 mcu@sunplus.com.cn Tel:

209 第 9 章 SPMC65 系列单片机开发工具 B. Blank Program Verify: 系统会自动对单片机进行 Blank check Program 和 Verify 的连续操作如果在某一个环节发生错误, 编程动作都会立即停止, 提示错误信息 C. Blank Program Verify Secure: 系统会自动对单片机进行 Blank check Program Verify 和 Secure 的连续操作, 完成全部编程过程 如果在某一个环节发生错误, 编程动作都会立即停止, 提示错误信息 系统默认的为 A. Blank Program 编程模式 (2) 设置需要编程的单片机数量 : 激活 Statistic Window, 如图 9.27 所示, 选择 Config 来输入需要编程的单片机数量, 如图 9.28 所示 Pass 指编程通过的数量 ;Fail 指编程失败的数量 ;Tatol 指总数量 ;Target 指目标数量 图 9.27 Statistic Window 图 9.28 输入芯片单片机数量 (3) 打开需要编程到单片机中的 *.bin 或者 *.tsk 类型文件 (4) 点击, 或选择 [Function]->[Auto Run], 进行自动编程操作 每点击一次, 则按照编程模式选择的操作顺序执行一次编程操作 编程的统计信息显示在统计窗口 (Statistic Window) 中 Pass 指编程通过的数量 ;Fail 指编程失败的数量 ;Tatol 指已编程的总数量 ;Target 指目标数量 工具栏常用图标对照表 打开二进制格式 (*.bin 或 *.tsk) 的源文件 用户必须将需要编程的源文件加载到 Q-writer 中, 以激活其所有功能 将程序存储窗口中的内容保存到另一路径下 选择需要编程的单片机的型号 Tel: mcu@sunplus.com.cn 203

210 凌阳 8 位通用单片机 依据编程模式的设定执行连续编程动作 检测单片机是否为空白 将程序编程到单片机中 验证编程程序是否有被正确地编程到单片机 从单片机的存储器中读取数据 打开序列号码的设置窗口 单片机加密 激活 / 取消单片机编程数量统计功能 试 Probe 的类型 选择 Probe 系统为用户提供了两种类型的 Probe,AUTO Detect 为自动测 204 mcu@sunplus.com.cn Tel:

211 第 10 章 SPMC65 系列单片机的应用实例 第 10 章 SPMC65 系列单片机的应用实例 10.1 ADC 一线键盘输入应用 按键输入是单片机最基本的应用之一, 本例将介绍利用 SPMC65 内置的 ADC 实现的按键输入功能, 其特点是多个按键通过一条线与单片机相连, 大大节省了 I/O 资源 本应用实例适用于具有内置 ADC 的 SPMC65 单片机, 这里以 SPMC65P2404A 为对象加以说明 功能规格利用 SPMC65P2404A 的 A/D 转换功能, 扫描 16 个按键, 并通过 4 个发光二极管将键值显示出来 硬件设计系统硬件框图如图 10.1 所示, 所有按键通过一个 A/D 转换通道 (PA0) 接入单片机,PC3~PC0 初始化为输出低电平, 分别接 4 个发光二极管, 它输出的 16 种状态 1111~0000 分别表示按键 S15~S0 被按下 PA0 1 按键输入 SPMC65P2404A *28P PC0~PC3 4 4 个 LED 发光管 图 10.1 ADC 一线键盘输入应用硬件框图如图 10.2, 按键 S0~S15 与电阻网络相连, 当不同的按键被按下时,AD 转换的电压不同, 通过 AD 转换值便可以判断出是哪个按键被按下 此种方法只能响应单个按键, 若同时按下两个或两个以上的按键, 则 AD 会采到错误的电压值, 程序或者不响应, 或者给出错误的键值 S0 S1 S2 S14 S15 10M 500 1K 1K 1K 1K 1K 500 >> PA0 VDD (+5V) 图 10.2 键盘显示原理图 AD 转换出来的结果共有 10 位, 在程序中取其高 8 位作为有效位, 便可以分辨出这 16 个按键 按键 输入电压和 AD 转换值 ( 高 8 位 ) 的对应关系如表 10.1 所示 表 10.1 按键与电压 AD 转换值关系 按键 转换电压 (V) A/D 转换值 ( 理论 ) 无 0 00h Tel: mcu@sunplus.com.cn 205

212 凌阳 8 位通用单片机 S h S h S h S h S h S h S h S h S h S h S A8h S B8h S C8h S D8h S E8h S F8h 但是, 由于各分压电阻的阻值存在误差等原因, 实际的 A/D 转换值不一定与理论值完全相同 在本例 中, 将 A/D 转换值的误差允许范围设置为 ±4, 例如 A/D 转换值在 14h~1Ch 之间时, 都认为 S1 被按下 对于 16 个按键, 选择精度为 ±5% 的分压电阻即可 在选用分压电阻时, 应当避免分压电阻产生累积 误差 如果选用精度为 ±1% 的电阻, 则可以分辨出 32 个按键 软件设计 主程序流程如图 10.3 所示, 主程序每隔 8ms 扫描一次键盘, 并刷新一次显示 开始 初始化 ADC 和 IO 口设置 1.024ms 时基 8ms 到来? N Y 调用按键扫描子程序 按键被按下? N Y 点亮或熄灭相应指示灯 图 10.3 键盘显示主流程图其中, 按键扫描子程序是本例的核心内容, 在该子程序中采集 A/D 转换值, 判断是否有键按下 为消除按键闭合和打开瞬间的抖动产生的影响, 当检测到按键被按下后, 便开始读取键值, 每隔 8ms 读一次键值, 直到连续 4 次读取的键值完全相同, 则认为抖动已经消除 消抖时间为 8ms X 4=32ms 206 mcu@sunplus.com.cn Tel:

213 第 10 章 SPMC65 系列单片机的应用实例 程序入口 AD 采样 N 按键放开标志 =0? Y AD 转换值 <4H? N Y AD 转换值超出允许误差? Y 比较次数加 1 N N 按键值与上次相同? Y 比较次数加 1 N 比较次数 =4? Y 比较次数 =4? Y N 按键已经被放开, 按键放开标志置 0 键值确认, 按键动作标志和按键放开标志置 1 比较次数置 0 返回 图 10.4 按键扫描子程序流程 按键扫描子程序的部分代码如下 : F_ADKeyx16: lda P_AD_Ctrl0 and # B sta P_AD_Ctrl0 ; 执行 A/D 转换 L_TestAdcL2: lda P_AD_Ctrl0 and # B ;A/D 转换完成? beq L_TestAdcL2 lda IB_KeyupFlag bne?l_judgeup ; 检测按键放开标志?L_KeyCope: lda P_AD_DataHi ; 取 A/D 采样值的高 8 位 and #$F ;\ cmp #$4 ;+ bcc?l_cmpclr ;+ = A/D 采样值超出范围? Tel: mcu@sunplus.com.cn 207

214 凌阳 8 位通用单片机 cmp #$C ;+ bcs?l_keyup ;/ lda P_AD_DataHi and #$F0 cmp IB_KeyValue ; 与上次获取的键值比较 beq?l_inc sta IB_KeyValue jmp?l_cmpclr?l_inc: inc IB_CmpTimers ;\ lda IB_CmpTimers ;+ = 已经进行了 4 次比较? cmp #CB_CmpTimers ;+ bcc?l_adkeyx16exit ;/ lda IB_KeyValue ;\ lsr a ;+ lsr a ;+ = 取得键值 lsr a ;+ lsr a ;+ sta GB_KeyValue ;/ lda #1 sta GB_KeyDownFlag ; 将按键动作标志设为 1?L_Keyup: lda #1 sta IB_KeyupFlag ; 将按键放开标志设为 1 jmp?l_cmpclr?l_judgeup: lda P_AD_DataHi cmp #$4 ; 按键是否放开? bcs?l_cmpclr inc IB_CmpTimers ;\ lda IB_CmpTimers ;+ = 已经进行了 4 次比较? cmp #CB_CmpTimers ;+ bcc?l_adkeyx16exit ;/ lda #0 sta IB_KeyupFlag ; 按键放开标志设为 0?L_CmpClr: lda #0 sta IB_CmpTimers?L_ADKeyx16Exit: rts 208 mcu@sunplus.com.cn Tel:

215 第 10 章 SPMC65 系列单片机的应用实例 10.2 SPI 串行接口读写 EEPROM SPI(Serial Peripheral Interface) 总线系统是一种同步串行外设接口, 它使用 4 条线 : 串行时钟线 输出数据线 输入线和片选线 支持同步全双工通信方式 本例使用 SPMC65P2404A 的 SPI 功能访问 AT93C46,AT93C46 是基于标准 SPI 总线接口的 EEPROM, 采用同步串行方式进行通信 功能规格用 SPMC65P2404A 的 SPI 功能访问 AT93C46, 实现数据存储 读取及擦除等操作 硬件设计 AT93C46 为 SPI 总线接口方式的 EEPROM, 采用 4 线串行同步方式工作, 容量为 128 Byte, 其芯片引脚名称和功能描述如图 10.5 所示 : 图 10.5 AT93C46 管脚定义及封装图 10.6 为单片机与 AT93C46 的硬件连接图 在单片机中,I/O 口的设置为 :PC0 PC3 设置成低电平输出口,PC1 设置成高电平输出口,PC2 设置成带下拉电阻的输入口 VDD SPMC65 系列单片机 PC3(SDO) PC2(SDI). 10k 10k. DO DI 93C46 VCC VDD PC1(SCK) PC0 GND. SK CS GND ORG 图 10.6 硬件连接图 软件设计 AT93C46 在时钟信号 SK 的上升沿输入数据, 下降沿输出数据, 典型的读 写工作时序如图 10.7 和图 10.8 所示 : Tel: mcu@sunplus.com.cn 209

216 凌阳 8 位通用单片机 写命令 写地址 读数据 图 10.7 AT93C46 读时序 写命令写地址写数据 图 10.8 AT93C46 写时序 AT93C46 主要有字节读 字节写 写整个存储器 字节擦写 擦写整个存储器 操作允许及操作禁止等 7 项操作 对于每项操作, 用不同的命令区分, 因此在每项操作前必须先写命令字, 命令字为 3 位 接着写地址,AT93C46 容量为 128 Byte, 地址长度为 7 位 命令操作如下表所示 : 表 10.2 AT93C46 操作命令表 Instruction Command Address x 8 Data x 8 Comments READ 110 A 6 -A 0 Reads data at specified address EWEN XXXXX Write or erase enable ERASE 111 A 6 -A 0 Erases memory location A n -A 0 WRITE 101 A 6 -A 0 D 7 -D 0 Writes memory location A n -A 0 ERAL XXXXX Erases all memory location WRAL XXXXX D 7 -D 0 Writes all memory location EWDS XXXXX Disable write or erase 为了便于写操作, 将命令字的最后一位并入地址码, 与 7 位地址组成一个字节, 如图 10.9 所示 写 210 mcu@sunplus.com.cn Tel:

217 第 10 章 SPMC65 系列单片机的应用实例 入地址后, 便可以进行读或写数据, 数据按字节传送 Frist write Second write C2 C1 C0 A6 A5 A4 A3 A2 A1 A0 命令 地址 图 10.9 命令字与地址格式 AT93C46 每次上电后, 处于禁止写和禁止擦写状态, 必须首先进行使能操作 使能操作的时序和流程分别如图 和图 所示 图 操作使能时序图 操作使能 CS 线置高电平 写命令字 10B 写命令字及地址 011XXXXXB CS 线置低电平 延时 CS 线置高电平 返回 图 操作使能流程图 当完成对 AT93C46 的所有操作后, 为了保护存储器内部数据, 需禁止写入操作 写入禁止的操作流程如图 所示 Tel:

218 凌阳 8 位通用单片机 操作禁止 CS 线置高电平 写命令字 10B 写命令字及地址 000XXXXXB CS 线置低电平 延时 CS 线置高电平 返回 图 操作禁止流程图 从 AT93C46 的指定地址读取一个字节的程序流程如所示 : 读数据 写命令字 10B 写地址 1A 6 -A 0 读数据 D 7 -D 0 CS 线置低电平 延时 CS 线置低电平 返回 图 读取流程图 从 AT93C46 读取字节程序的部分代码如下 : F_RdByte: lda P_IOC_Data ora #$01 ; 初始化 I/O sta P_IOC_Data lda # B ; 清 SPI TX/RX 中断标志 212 mcu@sunplus.com.cn Tel:

219 第 10 章 SPMC65 系列单片机的应用实例 sta P_SPI_Status lda # B ; 发送起始位 sta P_SPI_TxData?L_StartBit: lda P_SPI_Status ; and # B ; TX 中断? beq?l_startbit ; 否 lda # B ; 清 TX/RX 中断标志 sta P_SPI_Status lda GB_AddrBuf ; 发送地址 and #$7F sta P_SPI_TxData?L_Address: lda P_SPI_Status ; and # B ; 是 TX 中断? beq?l_address ; 否 lda # B ; 清 TX/RX 中断标志 sta P_SPI_Status lda #$00 ; 发送占位数据 sta P_SPI_TxData?L_Data: lda P_SPI_Status ; and # B ; 是 RX 中断? beq?l_data ; 否 lda P_SPI_RxData ; 读取数据 sta GB_RdData lda # B ; 清 TX/RX 中断标志 sta P_SPI_Status lda P_IOC_Data eor #$01 sta P_IOC_Data ; 延时以满足时序要求 nop nop nop nop nop lda P_IOC_Data ora #$01 sta P_IOC_Data nop Tel: mcu@sunplus.com.cn 213

220 凌阳 8 位通用单片机 nop nop lda and sta P_IOC_Data #$FE P_IOC_Data rts 将一字节数据写入指定的地址中的程序流程如图 所示 在将数据写入 AT93C46 后, 需要一段时间的延时, 查询 AT93C46 的输出 DO, 当 DO 输出高电平时, 表明写操作完成 字节写 写命令字 10B 写地址 1A 6 -A 0 写数据 D 7 -D 0 CS 线置低电平 CS 线置高电平 DO 输出高电平 N Y CS 线置低电平 返回 图 字节写流程图 在向 AT93C46 的指定地址写入数据前要将该地址中原有的数据擦除, 擦写后地址中数据为 FFH 字节擦除的操作流程如所示 214 mcu@sunplus.com.cn Tel:

221 第 10 章 SPMC65 系列单片机的应用实例 字节擦写 写命令字 11B 写地址 1A 6 -A 0 CS 线置低电平 CS 线置高电平 DO 输出高电平 N Y CS 线置低电平 返回 图 字节擦写流程图 10.3 红外遥控接收应用例 红外遥控广泛应用于家电 玩具等产品以及工业设备控制场合 红外遥控系统由发射和接收两大部分组成, 本节以 SPMC65P2404A 单片机为例, 介绍 SPMC65 系列单片机实现红外遥控接收的方法 功能规格本例以某电视遥控器作为红外发射源,SPMC65P2404A 对遥控器发出的红外信号进行解码, 转换为遥控器按键值, 通过一位 LED 数码管显示出来 硬件设计红外信号是通过遥控器上的红外发射管发送出去的, 为提高红外编码的稳定性, 采取调制编码的方式, 将编码与一定频率的信号调制, 形成输出波形, 通过红外发射管发射 图 是调制过程的示意图 图 红外编码调制示意图接收红外编码时, 首先要进行解调, 解调的过程是通过红外接收管实现的 其基本工作过程为 : 当接收到调制信号时, 输出高电平, 否则输出为低电平, 如图 所示 解调 图 红外编码解调示意图 Tel: mcu@sunplus.com.cn 215

222 凌阳 8 位通用单片机 图 是基于 SPMC65 单片机的红外接收系统硬件原理图 红外接收管将接收到的信号进行解调, 然后由 PB1 输入, 单片机对其解码后, 转换为遥控器按键值, 通过一个 LED 数码管显示出来 LED a g f f g b e d e c d c. b a dp com PB SPMC65P2404A*28P 28 PA7 27 PA6 26 PA5 25 PA4 24 PA3 23 PA2 22 PA1 21 PA0 PB7 PB6 PB5 PB4 PB3 PB2 VDD VSS XI XO RESET PD0 PD1 PD3 PC0 PC1 PC2 PC3 PB0 PB VDD VSS XI XO RESET 100 VDD 10K + PB5 47uF16V Receive con1 con2 ground 图 红外接收系统硬件原理图 软件设计 该电视遥控器的数据编码格式如图 所示 利用 SPMC65 单片机定时器的捕获功能对数据进行解码 4.51ms*2 头脉冲 8 位 8 位 系统码 系统码 8 位资料码 8 位资料反码 结束位 Bit 1 Bit 0 38k 561us 561us*3 561us 561us 图 红外编码格式 在程序初始化时, 将打开 Timer3 的捕获中断, 在捕获中断里完成数据的解码 数据解码流程如图 所示 : 216 mcu@sunplus.com.cn Tel:

7688使用手冊V10.doc

7688使用手冊V10.doc TP-7688 . 2 2. 3 3. 5 4. 5 5. 6 6. 7 7. 8 8. 9 9.. 4. 7 2 2., 7x9 / 6x9 7x9.3() x 3.()mm 6x9 2.84() x 3.()mm 3 ASCII 7x9 95 ASCII 6x9 95 6x9 7 BIG5 6x9 3973 6x9 28 7x9 24 24 55 6x9 2 2 27 4.23mm (/6 inch)

More information

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63> 第三章 Q3 1 1. 省略了 I/O 操作的复杂逻辑, 易实现, 耗费低 ; 2. 可以利用丰富的内存寻址模式实现灵活的 I/O 操作 Q3 2 假设存储单元 ds1 处寄存器地址为 0x2000, 代码如下 #define ds1 0x2000 while ( *ds1 == 0 ) ; Q3 3 假设设备 (dev1) 中有两个寄存器 ds1 和 dd1,dev1 的地址为 0x1000,ds1

More information

第5章:汇编语言程序设计

第5章:汇编语言程序设计 第 5 章 : 汇编语言程序设计 程 汇编语言指令格式 系统伪指令 存储器选择方式 常用子程序 1 汇编语言程序设计 PIC 指令系统 语言系统 指 CPU 编 器语言 器语言 器语言 设计 用 语言 设计 语言 汇编语言 2 汇编语言指令格式 汇编语言指令格式 ( 指令 ) label opcode operand comment 指令 用 存 指令 指令语 3 汇编语言指令格式 1 指令 用 指令

More information

CH559指令周期.doc

CH559指令周期.doc CH55X 汇编指令周期表 CH55X 汇编指令概述 : 型号包含 : a. 指令单周期型号 :CH557 CH558 CH559; b. 指令 4 周期型号 :CH551 CH552 CH553 CH554; c. 非跳转指令的指令周期数与指令字节数相同 ; d. 跳转指令含 MOVC/RET/CALL 通常比字节数多若干个周期 ; e.movc 指令多 4 或 5 个周期 ( 下条指令地址为奇数时多

More information

Microsoft Word - Ö¸Á.doc

Microsoft Word - Ö¸Á.doc 指令集说明 注 由于资源大小问题 其中以下几款 MCU 只有 62 条指令 其余均为 63 条指令 HT48CA0/HT48RA0A 无 RETI 指令 HT48R05A-1 无 TABRDL 指令 指令寻址方式有下面 5 种 立即寻址 此一寻址法是将立即的常数值紧跟在运算码 (opcode) 后 例如 MOV A, 33H ADD A, 33H 直接寻址 直接寻址的情況只允许在存储器之间作数据传送

More information

1-1 SH79F6431 A. 2( ) 9~15V ( 12V) U2 U3 3.3V SH79F B. 1(VCC/GND) SH79F6431 C. VDDIO SH79F6431 P4 P5 P0.6 P0.7 VDDIO VDDIO=5V D. 2 V 1.0

1-1 SH79F6431 A. 2( ) 9~15V ( 12V) U2 U3 3.3V SH79F B. 1(VCC/GND) SH79F6431 C. VDDIO SH79F6431 P4 P5 P0.6 P0.7 VDDIO VDDIO=5V D. 2 V 1.0 SH79F6431 1. SH79F6431 1T 8051 FLASH SH79F JET51 Keil µ vision JTAG 1.1. SH79F6431 LQFP64 1.2. (Target Board) SH79F6431 1 V 1.0 1-1 SH79F6431 A. 2( ) 9~15V ( 12V) U2 U3 3.3V SH79F6431 1 2 1 B. 1(VCC/GND)

More information

Ps22Pdf

Ps22Pdf ( ) ( 150 ) 25 15 20 40 ( 25, 1, 25 ), 1. A. B. C. D. 2. A. B. C. D. 3., J = 1 H = 1 ( A B, J', J, H ) A. A = B = 1, J' =0 B. A = B = J' =1 C. A = J' =1, B =0 D. B = J' = 1, A = 0 4. AB + AB A. AB B. AB

More information

1 TPIS TPIS 2 2

1 TPIS TPIS 2 2 1 1 TPIS TPIS 2 2 1. 2. 3. 4. 3 3 4 5 4 TPIS TPIS 6 5 350 Mark Coil F3/F6 350 M 150 M 25 M 7.12M 8 M F3 F6 F4 F7 F8 8M AA 7 350 28V 5V IC HCPL2731 0.5mA 6 8 (TPIS) TPIS 9 7 IC AT89C2051 AT89C2051 CMOS8

More information

M8Rxxx 指令集说明 Version 年 11 月 上海磐芯电子有限公司 SHANGHAI MASSES ELECTRONIC Co., Ltd. 本公司保留对产品在可靠性, 功能和设计方面的改进作进一步说明的权利 说明文档的更改, 恕不另行通知

M8Rxxx 指令集说明 Version 年 11 月 上海磐芯电子有限公司 SHANGHAI MASSES ELECTRONIC Co., Ltd. 本公司保留对产品在可靠性, 功能和设计方面的改进作进一步说明的权利 说明文档的更改, 恕不另行通知 M8Rxxx 指令集说明 Version 1.04 2014 年 11 月 上海磐芯电子有限公司 SHANGHAI MASSES ELECTRONIC Co., Ltd. 本公司保留对产品在可靠性, 功能和设计方面的改进作进一步说明的权利 说明文档的更改, 恕不另行通知 修正记录 版本 日期 描述 Ver1.02 2014-5-15 补全指令说明 Ver1.03 2014-10-8 勘误 Ver1.04

More information

DPJJX1.DOC

DPJJX1.DOC 8051 111 2K 1 2 3 ' ' 1 CPU RAM ROM / A/D D/A PC CPU 40 68 10 20 8 51 PIII 8051 2 MCS51 8051 8031 89C51 8051 8031 89C51? MCS51 INTEL INTEL 8031 8051 8751 8032 8052 8752 8051 8051 8051 MCS51 8031 8031

More information

2 14 PORTC.1 PORTB.3 PORTA.2/T0 GND PORTB.2 PORTA.0 PORTC.3 PORB.0/OSCO PORTB.1/OSCI PORTC.0 PORTC.2 SH69P21 /SOP PORTA

2 14 PORTC.1 PORTB.3 PORTA.2/T0 GND PORTB.2 PORTA.0 PORTC.3 PORB.0/OSCO PORTB.1/OSCI PORTC.0 PORTC.2 SH69P21 /SOP PORTA 1K 4 SH6610C 4 OTP ROM 1K X 16 RAM 88 X 4-24 - 64 2.4V-5.5V - fosc = 30kHz - 4MHz, = 2.4V - 5.5V - fosc = 4MHz - 8MHz, = 4.5V - 5.5V 11 CMOS I/O 4 ( ) 8 / - 0 PORTA.0 ( / / ) - 0 - PORTB ( ) ( ) - 32.768kHz,

More information

MSP430ϵÁе¥Æ¬»úµÄÖ¸Áîϵͳ.pps [¼æÈÝģʽ]

MSP430ϵÁе¥Æ¬»úµÄÖ¸Áîϵͳ.pps [¼æÈÝģʽ] 作者 : 利尔达 MSP430 系列单片机的指令系统 1 CPU 内核组成 : 16 位的 (ALU) 算术运算单元 16 个寄存器 (PC SP SR R4~R15) 指令控制单元 2 存储器组织结构 3 外围模块寄存器地址 它们被分配在相应的字模块或字节模块当中 分配在 00-FFH 中为字节, 分配在 100-1FFH 中为字 4 寻址模式 : 5 指令格式 : 1) 书写格式标号指令助记符源操作数,

More information

12232A LED LED LED EL EL CCFL EL CCF

12232A LED LED LED EL EL CCFL EL CCF 12232A 0 50-20 +70-30 +85 LED LED LED EL EL CCFL EL CCF 122 x 32 1/32Duty 1/5Bias 6:00 STN( ), EL LED EL/100VAC 400HZ LED/4.2VDC 1 / VDD-VSS 0 6.5 V Ta=25 LCD VDD-V0 0 12.0 V V1 0 VDD V VDD-VSS - 4.75

More information

2 Keil µ vision 2.1 1) Keil µ vision2 V2.34 µ vision3 2) Sino_Keil.exe Keil c:\keil\ 3) JET51 USB PC C:\Keil\ USB PC 4) S-L

2 Keil µ vision 2.1 1) Keil µ vision2 V2.34 µ vision3 2) Sino_Keil.exe   Keil c:\keil\ 3) JET51 USB PC C:\Keil\ USB PC 4) S-L 1 SH88F516 8051 64K FLASH 1024 EEPROM SH88F516 JET51 S-Lab Keil µ vision ISP51 Keil µ vision ISP51 ISP51 PC RS232 MCU SH88F516 SH88F516 1.1 SH88F516 1.1 SH88F516 SH88Fxx: QFP44, DIP40 RAM Flash E2 ADC

More information

MICROCHIP EVM Board : APP APP001 PICmicro Microchip APP001 40pin PDIP PICmicro Design Tips Character LCM Temperature Sensor Application I/O Pi

MICROCHIP EVM Board : APP APP001 PICmicro Microchip APP001 40pin PDIP PICmicro Design Tips Character LCM Temperature Sensor Application I/O Pi MICROCHIP EVM Board : APP001 1-1. APP001 PICmicro Microchip APP001 40pin PDIP PICmicro Design Tips Character LCM Temperature Sensor Application I/O Pin 16 I/O Extension Interface 1-2. APP001 Block_A Block_B

More information

MSP430X1XX 系列微控制器具有以下特征 结构框图 超低功耗结构体系 A 额定工作电流在 1MHz V 工作电压 C11X P11X 和 E11X 为 V 从备用模式唤醒为 6 S 丰富的中断能力减少了查询的需要灵活强大的处理能力源操作数有七种寻址模

MSP430X1XX 系列微控制器具有以下特征 结构框图 超低功耗结构体系 A 额定工作电流在 1MHz V 工作电压 C11X P11X 和 E11X 为 V 从备用模式唤醒为 6 S 丰富的中断能力减少了查询的需要灵活强大的处理能力源操作数有七种寻址模 新一代超低功耗 16 位单片机 TI MSP430 系列 美国 TI 公司的 MSP430 系列单片机可以分为以下几个系列 X1XX X3XX X4XX 等等 而且 在不断发展 从存储器角度 又可分为 ROM C 型 OTP P 型 EPROM E 型 Flash Memory F 型 系列的全部成员均为软件兼容 可以方便地在系列各型号间移植 MSP430 系列单片机 的 MCU 设计成适合各种应用的

More information

四位微控制器ML64168_ _.doc

四位微控制器ML64168_ _.doc SSSC /4168P 2005 8 4 4, (ADC), LCD Driver, (Buzzer), 1 3 CPU17 CPU 26 33 42 45 48 73 79 85 89 A/D 92 111 125 128 131 SSU4168P 133 143 A: / 153 B: 156 C: 158 D: 160 E: 161 F: 163 G: PAD 167 2 ,, 11 4 CMOS

More information

Tel:010-62981668-2930 1

Tel:010-62981668-2930  1 Access 93C46 with SPI function V1.0.0 Jan. 31, 2005 http://www.sunplusmcu.com Tel:010-62981668-2930 http://www.sunplusmcu.com E-mail:mcu@sunplus.com.cn 1 0 0...2 1...3 2...4 2.1...4 2.2...5 3...6 3.1 AT93C46...6

More information

Microsoft PowerPoint - 微原-第3章3.ppt [兼容模式]

Microsoft PowerPoint - 微原-第3章3.ppt [兼容模式] 本教案内容 第 3 章 8086CPU 指令系统 1. 汇编语言指令 9. 转移指令 10. 2. 8086 指令分类循环控制指令 11. 子程序调用返回 3. 数据与转移地址的指令寻址方式 12. 中断调用返回指 4. 数据传送类指令令 5. 算术运算类指令 13. 字符串操作指令 6. 逻辑运算类指令 14. I/O 输入输出指令 7. 移位类指令 15. 其它指令 8. 标志位操作指令 16.

More information

学习MSP430单片机推荐参考书

学习MSP430单片机推荐参考书 MSP430 16 MSP430 C MSP430 C MSP430 FLASH 16 1 CPU 16 ALU 16 PC SP SR R4~R15 2 3 00-FFH 100-1FFH 4 5 1 2 51 24 27 6 1 2 3 4 5 6 4 12 SR SP SR CPU SR CPU C Z N GIE CPUOff CPU OscOff SCG0 SCG1 CPU EXIT SP

More information

AVR单片机指令系统.PDF

AVR单片机指令系统.PDF AVR 4 1 (1) 89 :AT90S1200, ; (2) 90 ( ):Attiny11/12/15/22; 90 = +89 (3) 118 ( ):AT90S2313/2323/2343/2333,/4414/4433/4434/8515/90S8534/8535 ;118 = + 90 ; (4) 121 ( )ATmega603/103; 121 = + 118 ; (5) 130

More information

Microsoft PowerPoint - 第01章 基础知识.pptx

Microsoft PowerPoint - 第01章 基础知识.pptx 微处理器与微计算机系统 教材 : 单片机原理与应用及 C51 程序设计 ( 第 3 版 ) 清华大学出版社 主讲 : 谢维成 http://xweicheng.ys168.com scxweicheng@mail.xhu.edu.cn 西华大学电气与电子信息学院 第 1 章计算机基础知识 主要内容 : 1 有符号数的表示 2 微型计算机工作原理 3 单片机的概念及特点 A Historical Background

More information

Microsoft Word - em78 sub program.doc

Microsoft Word - em78 sub program.doc 一 二进制数转换为 ASCⅡ 码 将一个字节的二进制数转换为两位 16 进制数的 ASCⅡ 码 main: mov a,@0x9f ; 二进制数为 0x9f mov 0x30,a ; 二进制数存入 0x30 mov a,@0x02 mov 0x10,a ;0x10 中存放转换次数 mov a,@0x31 mov 0x04,a ;0x04 中为转换后数据存放地址 mov a,0x30 B1: ; 取

More information

,Microchip Technology PIC LCD, PIC16F913/914/ 916/917/946 PIC18F6390/6490/8390/8490 PIC16F65J90/85J90 Microchip LCD LCD, Microchip 的优势 LCD PIC, LCD LC

,Microchip Technology PIC LCD, PIC16F913/914/ 916/917/946 PIC18F6390/6490/8390/8490 PIC16F65J90/85J90 Microchip LCD LCD, Microchip 的优势 LCD PIC, LCD LC LCD PIC 单片机解决方案 集成 LCD 驱动器模块的 PIC 单片机 www.microchip.com/lcd ,Microchip Technology PIC LCD, PIC16F913/914/ 916/917/946 PIC18F6390/6490/8390/8490 PIC16F65J90/85J90 Microchip LCD LCD, Microchip 的优势 LCD PIC,

More information

1... 4 2... 5 2.1... 5 2.2... 5 2.3... 6 2.4... 6 2.5... 7 2.6... 7 3 2005... 8 3.1... 8 3.2... 9 3.3... 9 3.4 ( RMB100,000)... 9 3.5... 9 4...11 4.1.

1... 4 2... 5 2.1... 5 2.2... 5 2.3... 6 2.4... 6 2.5... 7 2.6... 7 3 2005... 8 3.1... 8 3.2... 9 3.3... 9 3.4 ( RMB100,000)... 9 3.5... 9 4...11 4.1. http://www.unsp.com.cn 1... 4 2... 5 2.1... 5 2.2... 5 2.3... 6 2.4... 6 2.5... 7 2.6... 7 3 2005... 8 3.1... 8 3.2... 9 3.3... 9 3.4 ( RMB100,000)... 9 3.5... 9 4...11 4.1... 11 4.2... 12 5... 13 5.1...

More information

Microsoft PowerPoint - Ch3-8086CPUæ„⁄令系ç»�(3)-æŁ°æ“®ä¼€é•†æ„⁄令

Microsoft PowerPoint - Ch3-8086CPUæ„⁄令系ç»�(3)-æŁ°æ“®ä¼€é•†æ„⁄令 2017 版 微机原理与系统设计 第 3 章 8086CPU 指令系统 董明皓, 博士 西安电子科技大学 dminghao@xidian.edu.cn 目录 (12 课时 ) 1 2 3 4 5 汇编语言基本概念 8086 指令分类数据与转移地址的寻址方式 8086 的六类指令总结 微机原理与系统设计 8086CPU 的指令系统董明皓 dminghao@xidian.edu.cn 2 基础知识引入

More information

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor 1 4.1.1.1 (Load) 14 1.1 1 4.1.1.2 (Save) 14 1.1.1 1 4.1.2 (Buffer) 16 1.1.2 1 4.1.3 (Device) 16 1.1.3 1 4.1.3.1 (Select Device) 16 2 4.1.3.2 (Device Info) 16 2.1 2 4.1.3.3 (Adapter) 17 2.1.1 CD-ROM 2 4.1.4

More information

SMART 7P 0 HR7P OTPMCU A/D I/O OTP ROM RAM HR7P HR7P HR7PPMB MSOP0 7+input HR7PPSC HR7PPSD SOP SOP6 +input input HR7PERB SSOP0 7

SMART 7P 0 HR7P OTPMCU A/D I/O OTP ROM RAM HR7P HR7P HR7PPMB MSOP0 7+input HR7PPSC HR7PPSD SOP SOP6 +input input HR7PERB SSOP0 7 上海东软载波微电子有限公司 SMART www.essemi.com SMART 7P 0 HR7P OTPMCU A/D I/O OTP ROM RAM HR7P HR7P HR7PPMB MSOP0 7+input 06 6 6 HR7PPSC HR7PPSD SOP SOP6 +input 06 6 +input 06 6 6 6 HR7PERB SSOP0 7+input 06 6 6 HR7PESC

More information

1. 介绍 义隆 8 位单片机指令介绍 Application Notes 义隆 8 位单片机指令介绍 EM78/EM88 系列是基于 RISC 的精简指令微控制器, 每条指令是 13 位 15 位, 除 LCALL LJMP MOV R2,A ADD R2,A 改变 PC 指针的指令是 2 个指令

1. 介绍 义隆 8 位单片机指令介绍 Application Notes 义隆 8 位单片机指令介绍 EM78/EM88 系列是基于 RISC 的精简指令微控制器, 每条指令是 13 位 15 位, 除 LCALL LJMP MOV R2,A ADD R2,A 改变 PC 指针的指令是 2 个指令 1. 介绍 Application Notes EM78/EM88 系列是基于 RISC 的精简指令微控制器, 每条指令是 13 位 15 位, 除 LCALL LJMP MOV R2,A ADD R2,A 改变 PC 指针的指令是 2 个指令 * 周期, 其余为单指令周期 ( 部分第一代芯片 JMP CALL RET RETL RETI JBS JBC JZ JZA DJZ DJZA 指令为 2

More information

Microsoft PowerPoint - 05-第五讲-寻址方式.pptx

Microsoft PowerPoint - 05-第五讲-寻址方式.pptx 第五讲 授课教师 : 陆俊林王箫音 2012 年春季学期 主要内容 一 寻址方式概述 二 数据的寻址方式 三 转移地址的寻址方式 教材相关章节 : 微型计算机基本原理与应用 ( 第二版 ) 第 4 章寻址方式与指令系统 1 主要内容 一 寻址方式概述 二 数据的寻址方式 三 转移地址的寻址方式 2 指令的组成 指令由操作码和操作数两部分组成 操作码操作数 MOV AX, 8726H ADD AX,

More information

Microsoft PowerPoint - 微原-第3章2.ppt [兼容模式]

Microsoft PowerPoint - 微原-第3章2.ppt [兼容模式] 本教案内容 第 3 章 8086CPU 指令系统 1. 汇编语言指令 9. 转移指令 10. 2. 8086 指令分类循环控制指令 11. 子程序调用返回 3. 数据与转移地址的指令寻址方式 12. 中断调用返回指 4. 数据传送类指令令 5. 算术运算类指令 13. 字符串操作指令 6. 逻辑运算类指令 14. I/O 输入输出指令 7. 移位类指令 15. 其它指令 8. 标志位操作指令 16.

More information

untitled

untitled TD3200 V1.3 2005-02-25 BOM 31050155 518057 www.emersonnetworkpower.com.cn 800-820-6510 800021-230171410755-86010800 E-mailinfo@emersonnetwork.com.cn ... 1 1.1...1 1.2...2 1.3...4... 5 2.1...5 2.2...5

More information

R/W

R/W (HD44780 KS0066 ) 3 3 5 6 10 14 HD44780/KS0066 16 2 LCM 8 1 40 4 LCD HD44780/KS0066 HD44100 IC PCB 0.1 CMOS 1. 2. 3. 4. 5. RH60% 6. 1. 2. 3. PCB 3 4. 5. 6. 1. 280 C 2. 3 4s 3. 4. 5. 3 5 1. 2. IC 3. DC-DC

More information

USB解决方案.ppt

USB解决方案.ppt USB USB? RS232 USB USB HID U modem ADSL cable modem IrDA Silabs USB CP210x USB UART USB RS-232 USB MCU 15 USB 12 FLASH MCU 3 USB MCU USB MCU C8051F32x 10 ADC 1.5%, Vref CPU 25MIPS 8051 16KB Flash -AMUX

More information

ICD ICD ICD ICD ICD

ICD ICD ICD ICD ICD MPLAB ICD2 MPLAB ICD2 PIC MPLAB-IDE V6.0 ICD2 usb PC RS232 MPLAB IDE PC PC 2.0 5.5V LED EEDATA MPLAB ICD2 Microchip MPLAB-IDE v6.0 Windows 95/98 Windows NT Windows 2000 www.elc-mcu.com 1 ICD2...4 1.1 ICD2...4

More information

General Description: Preliminary TTP916 Consumer IC VCD/DVD LCD Green mode Stand-by mode( 1W ) Features: 2.2V-5.5V LCD RAM read condition 2.6V-5.5V RC

General Description: Preliminary TTP916 Consumer IC VCD/DVD LCD Green mode Stand-by mode( 1W ) Features: 2.2V-5.5V LCD RAM read condition 2.6V-5.5V RC General Description: IC VCD/DVD LCD Green mode Stand-by mode( 1W ) Features: 2.2V-5.5V LCD RAM read condition 2.6V-5.5V RC 15K 300pF 256KHZ default on 32 function key Built-in TT6221/TT6222 decoder Provide

More information

mdt1030

mdt1030 深圳市英锐恩科技有限公司 第 1 页 单片机集成方案全方位解决服务商 优质智能电子产品 芯 方案解决商 Micon MDT1030 产品用户参考手册 全球销售及服务联系信息 : 深圳市英锐恩科技有限公司 ENROO-TECH(SHENZHEN)CO.,LTD 中国 深圳市福田区福华路嘉汇新城汇商中心 27 楼 2701 室 Enroo-Tech Technologies CO., Limited Light-Tech

More information

RESET OSCO OSCI OSC CPU WDTEN RC RESET PRESCALER PORTA (4-BITS) WATCHDOG TIMER Power on PORTB (4-BITS) PORTA [0:3] PORTB [0:3] LPD PORTC (4-BITS) LPDO

RESET OSCO OSCI OSC CPU WDTEN RC RESET PRESCALER PORTA (4-BITS) WATCHDOG TIMER Power on PORTB (4-BITS) PORTA [0:3] PORTB [0:3] LPD PORTC (4-BITS) LPDO 4K / I/O 4 SH6610C 4 OTPROM 4K X 16 SH69P25 MASK ROM 4K X 16 SH69K25 RAM 192 X 4-32 - 160 2.4V - 5.5V 5.0V 22 I/O 4 8 / PORTA-PORTF / - Timer0 - PORTB & PORTC / - 32.768kHz 4MHz - 400kHz 4MHz - RC 400kHz

More information

ARM Cortex-M3 (STM32F) STMicroelectronics ( ST) STM32F103 Core: ARM 32-bit Cortex -M3 CPU 72 MHz, 90 DMIPS with 1.25 DMIPS/MHz Single-cycle multiplica

ARM Cortex-M3 (STM32F) STMicroelectronics ( ST) STM32F103 Core: ARM 32-bit Cortex -M3 CPU 72 MHz, 90 DMIPS with 1.25 DMIPS/MHz Single-cycle multiplica CP Chip Power ARM Cortex-M3 (STM32F) ARM Cortex-M3 (STM32F) STMicroelectronics ( ST) STM32F103 Core: ARM 32-bit Cortex -M3 CPU 72 MHz, 90 DMIPS with 1.25 DMIPS/MHz Single-cycle multiplication and hardware

More information

D/A DAC ( 1us) (10~20 ) DAC0832 1

D/A DAC ( 1us) (10~20 ) DAC0832 1 D/A DAC0832 8 ( 1us) (10~20 ) DAC0832 1 1. 20 DI7~DI0 ILE 8 8 DAC 8 D/A LE LE & RFB VREF IOUT2 IOUT1 RFB CS WR1 XFER WR2 & & AGND VCC DGND 2 DI7~DI0 ILE & 8 LE 8 DAC LE 8 D/A RFB V REF IOUT2 IOUT1 R FB

More information

数据库系统概论

数据库系统概论 所谓寻址方式, 就是指令中用于说明操 作数所在地或者所在地地址的方法 8088/8086 的寻址方式分为两类 : 关于寻找数据的寻址方式 关于寻找转移地址的寻址方式 下面讲关于数据的寻址方式时, 均以数 据传送指令 MOV 为例讲解 MOV 指令格式如下 : MOV DST, SRC 助记符 目的操作数 指令完成的功能 : (DST) 源操作数 (SRC) 一. 关于寻找数据的寻址方式 ( 共 8

More information

FM1935X智能非接触读写器芯片

FM1935X智能非接触读写器芯片 FM33A0xx MCU 2017. 05 2.0 1 (http://www.fmsh.com/) 2.0 2 ... 3 1... 4 1.1... 4 1.2... 4 1.3... 5 1.3.1... 5 1.3.2... 5 1.4... 8 1.4.1 LQFP100... 8 1.4.2 LQFP80... 9 1.4.3... 9 2... 15 2.1 LQFP100... 15

More information

Microsoft Word - BL5372_UMAN_V1.1.doc

Microsoft Word - BL5372_UMAN_V1.1.doc 低 功 耗 实 时 时 钟 芯 (RTC)BL5372 用 户 手 册 V1.2 ( 2012.11.12) 上 海 贝 岭 股 份 有 限 公 司 Shanghai Belling Co., Ltd. 1. 概 述 低 功 耗 实 时 时 钟 芯 片 (RTC)BL5372 BL5372 是 一 款 低 功 耗 实 时 时 钟 电 路, 通 过 I 2 C 两 线 接 口 电 路 可 以 与 CPU

More information

目 录

目 录 1 Quick51...1 1.1 SmartSOPC Quick51...1 1.2 Quick51...1 1.3 Quick51...2 2 Keil C51 Quick51...4 2.1 Keil C51...4 2.2 Keil C51...4 2.3 1 Keil C51...4 2.4 Flash Magic...9 2.5 ISP...9 2.6...10 2.7 Keil C51...12

More information

单片机应用编程技巧(专家:邓宏杰)

单片机应用编程技巧(专家:邓宏杰) 编 者 注 : 本 文 件 为 电 子 工 程 专 辑 网 站 编 辑 部 原 创, 电 子 工 程 专 辑 享 有 本 文 章 完 全 著 作 权, 如 需 转 载 该 文 章, 必 须 经 过 电 子 工 程 专 辑 网 站 编 辑 部 同 意 联 系 电 子 工 程 专 辑 网 站 编 辑 部, 请 发 信 至 eetcol@globalsources.com 单 片 机 应 用 编 程 技

More information

<4D F736F F D20C7B0CBC4D5C2D7F7D2B5CCE22E646F6378>

<4D F736F F D20C7B0CBC4D5C2D7F7D2B5CCE22E646F6378> 第一章第二章 Q2 1: 高序 : 最低位字节存储在字的最低位 ; 低序 : 最低位字节存储在字的最高位 ; Q2 2: 冯. 诺依曼结构 : 数据和指令都存储在同一存储器中 ; 哈佛结构 : 数据和程序存储在各自独立的存储器中 Q2 3: a) ARM 有 16 个通用寄存器,r0 r15, 其中 r15 还被用作程序计数器 b) CPSR 是程序状态寄存器, 包含了条件码标识 中断禁止位 当前处理器模式和其他状态

More information

第十四章 STC单片机比较器原理及实现

第十四章 STC单片机比较器原理及实现 第 14 章 STC 单片机比较器 原理及实现 何宾 2015.02 1 本章主要内容 STC 单片机比较器结构 STC 单片机比较器寄存器组 STC 单片机比较器应用 2 STC 单片机比较器结构 STC15W 系列单片机内置了模拟比较器 对于 STC15W201S STC15W404S, 以及 STC15W1K16S 系 列单片机的比较器内部结构 3 STC 单片机比较器结构 S T C 15W

More information

SPHE8202R Design Guide Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provi

SPHE8202R Design Guide Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provi SPHE8202R Design Guide V2.0 JUN, 2007 19, Innovation First Road Science Park Hsin-Chu Taiwan 300 R.O.C. Tel: 886-3-578-6005 Fax: 886-3-578-4418 Web: www.sunplus.com SPHE8202R Design Guide Important Notice

More information

SIK) 者, 需 實 施 1 年 以 上, 經 體 格 檢 查 無 後 遺 症 者 5. 身 體 任 何 部 分 有 刺 青 紋 身 穿 耳 洞 者, 不 得 報 考, 各 項 檢 查 結 果 須 符 合 體 位 區 分 標 準 常 備 役 體 位 二 在 校 軍 訓 成 績 總 平 均 70 分

SIK) 者, 需 實 施 1 年 以 上, 經 體 格 檢 查 無 後 遺 症 者 5. 身 體 任 何 部 分 有 刺 青 紋 身 穿 耳 洞 者, 不 得 報 考, 各 項 檢 查 結 果 須 符 合 體 位 區 分 標 準 常 備 役 體 位 二 在 校 軍 訓 成 績 總 平 均 70 分 民 國 102 年 大 專 程 度 義 務 役 預 備 軍 官 預 備 士 官 考 選 簡 章 壹 依 據 : 依 民 國 102 年 大 專 程 度 義 務 役 預 備 軍 官 預 備 士 官 考 選 計 畫 辦 理 貳 考 ( 甄 ) 選 對 象 : 具 中 華 民 國 國 籍, 尚 未 履 行 兵 役 義 務 之 役 男, 年 齡 在 32 歲 ( 民 國 70 年 1 月 1 日 以 後 出

More information

第10章:CCP捕捉/比较/脉宽调制

第10章:CCP捕捉/比较/脉宽调制 第 10 章 :CCP 捕捉 / 比较 / 脉宽调制 CCP 模块功能 捕捉功能模式 比较功能模式 脉宽调制功能 1 CCP 模块功能 PIC 2 捕捉 比较 脉宽调制模块 CCP1 CCP2(Capture/Compare/PWM) 16 CCPR1 CCPR2 模块 功能 功能 TMR1 TMR2 2 CCP 模块功能 CCP 模块 3 模式 : 捕捉 式 比较 式 脉宽调制 式 捕捉功能 捕捉

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 The BitCoin Scripting Language 交易实例 交易结构 "result": { "txid": "921a dd24", "hash": "921a dd24", "version": 1, "size": 226, "locktime": 0, "vin": [ ], "vout": [ ], "blockhash": "0000000000000000002c510d

More information

! " # $ % & (( %) "*+,- &.(/-) & ( 0 & 1! % " % # % & & $ % "/()%!"# (( (02-03 /(((.1/.2( 4 //). /$0 3)0%. /1/%-2 (( ) / ((0 // "*+,- &.(/-) & ( 0 & 1

!  # $ % & (( %) *+,- &.(/-) & ( 0 & 1! %  % # % & & $ % /()%!# (( (02-03 /(((.1/.2( 4 //). /$0 3)0%. /1/%-2 (( ) / ((0 // *+,- &.(/-) & ( 0 & 1 !"#!!!!!!!!!!!!!!!!!!""! ! " # $ % & (( %) "*+,- &.(/-) & ( 0 & 1! % " % # % & & $ % "/()%!"# (( (02-03 /(((.1/.2( 4 //). /$0 3)0%. /1/%-2 (( ) / ((0 // "*+,- &.(/-) & ( 0 & 1 2/.%3( 00 !!!! " # $ % &

More information

untitled

untitled 8086/8088 CIP /. 2004.8 ISBN 7-03-014239-X.... TP313 CIP 2004 086019 16 100717 http://www.sciencep.com * 2004 8 2004 8 1 5 500 787 1092 1/16 16 1/2 391 000 1 2 ii 1 2 CAI CAI 3 To the teacher To the student

More information

1.1 ML_ONOFF = 1 Q 3 Q 8 C 0.3V M 2 L 1 ML_ONOFF = 0 Q 3 Q 8 C 1. + R31 VCC R21 10K ML_ONOFF R15 0:off 1:on 1K Green Light VCC=5V L1 Q VDD=12V C

1.1 ML_ONOFF = 1 Q 3 Q 8 C 0.3V M 2 L 1 ML_ONOFF = 0 Q 3 Q 8 C 1. + R31 VCC R21 10K ML_ONOFF R15 0:off 1:on 1K Green Light VCC=5V L1 Q VDD=12V C AUTOMATIC TROLLEY H K Hwang K K Chen J-S Lin S-C Wang M-L Li C-C Lin W-B Lin Dept. Of Electrical Engineering Far East College ABSTRACT This paper proposes an automatic trolley which can move automatically

More information

untitled

untitled EDM12832-08 : 25-1 : 116600 : (0411)7612956 7632020 7631122 : (0411)7612958 Model No.: Editor: LCD 1. ----------------------------------------------------3 2. ----------------------------------------------------3

More information

指令系统 可分成如下 6 类 : 数据传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 程序控制指令 处理器控制指令 2015 年 3 月 26 日星期四 8 时 41 分 27 秒 2

指令系统 可分成如下 6 类 : 数据传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 程序控制指令 处理器控制指令 2015 年 3 月 26 日星期四 8 时 41 分 27 秒 2 第 3 章 8086 的寻址方式和指令系统 (2) 2015 年 3 月 26 日星期四 8 时 41 分 27 秒 1 3.3 8086 指令系统 可分成如下 6 类 : 数据传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 程序控制指令 处理器控制指令 2015 年 3 月 26 日星期四 8 时 41 分 27 秒 2 3.3.1 数据传送指令 可实现 存储器 立即数 段寄存器 CS DS

More information

共同构成 16 位数据存储单元的地址 当 CPL=1 时, 将堆栈指针 SP 的 16 位地址 与指令中的 7 位地址相加, 形成 16 位的数据存储器地址 (2) 当 SP=0100h, 偏移地址为 50h 时, 寻址 0150h 单元 ; 当 DP=2, 偏移地址为 50h 时, 寻址 0150

共同构成 16 位数据存储单元的地址 当 CPL=1 时, 将堆栈指针 SP 的 16 位地址 与指令中的 7 位地址相加, 形成 16 位的数据存储器地址 (2) 当 SP=0100h, 偏移地址为 50h 时, 寻址 0150h 单元 ; 当 DP=2, 偏移地址为 50h 时, 寻址 0150 DSP 原理与应用教程 ( 张卫宁著 ) 课后习题答案第 3 章 (2014 年 10 月整理 刘忠国 ) 第三章习题答案 : 作业 :3.2, 3.6, 3.7,3.8, 3.11, 3.17, 3.19,3.21 3.1. TMS320C54x 的数据空间寻址方式各有什么特点? 应该应用在什么场合? ( 教材涉及特点较少 ) 答 :TMS320C54x 有 7 种基本的数据寻址方式 : 立即寻址,

More information

版权声明 龙芯 免责声明 据 龙芯 2 Building No.2, Loongson Industrial Park, Zhongguancun Environmental Protection Park (Tel) (Fax)

版权声明 龙芯 免责声明 据 龙芯 2 Building No.2, Loongson Industrial Park, Zhongguancun Environmental Protection Park (Tel) (Fax) 2018 9 29 龙芯 版权声明 龙芯 免责声明 据 龙芯 2 Building No.2, Loongson Industrial Park, Zhongguancun Environmental Protection Park (Tel) 010-62546668 (Fax) 010-62600826 阅读指南 龙芯 1C101 处理器数据手册 龙芯 1C101 修订历史 序号 更新日期 版本号

More information

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCAB5D1E9CAD2B7BDB0B82E646F63>

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCAB5D1E9CAD2B7BDB0B82E646F63> 目 录 一 嵌 入 式 系 统 的 应 用 及 前 景... - 1 - 二 目 前 嵌 入 式 系 统 教 学 现 状 和 实 验 体 系 的 建 设... - 1 - 三 嵌 入 式 教 学 在 本 科 生 中 的 教 学 难 点... - 1 - 四 教 学 难 点 解 决 方 法... - 2-1 选 择 S+core7 核 学 习... - 2-2 选 择 ecos 操 作 系 统 进 行

More information

DL1621-1

DL1621-1 General Description: DL1621-1, 含 LCD 的控制线路, 搭配 MCU 来使用, 将使使用者的成本降低, 以及应用更加. 宽广 Features: 工作电压 2.4V-5.5V 系统频率 : - 内建 RC 振荡器 (256Khz) - 外挂 32768Hz 晶振 - 外灌 256Khz 输入 ( 由 OSCI 脚 ) 提供简单 3 pins 串接接口 (CKRB/ CKWB/

More information

主要内容 指令系统的一般概念 指令操作方式操作码的含义指令对操作数的要求指令执行的结果 寻址方式 指令说明 2015 年 3 月 16 日星期一 8 时 2 分 37 秒 2

主要内容 指令系统的一般概念 指令操作方式操作码的含义指令对操作数的要求指令执行的结果 寻址方式 指令说明 2015 年 3 月 16 日星期一 8 时 2 分 37 秒 2 第 3 章 8086 的寻址方式和指令系统 (1) 2015 年 3 月 16 日星期一 8 时 2 分 37 秒 1 主要内容 指令系统的一般概念 指令操作方式操作码的含义指令对操作数的要求指令执行的结果 寻址方式 指令说明 2015 年 3 月 16 日星期一 8 时 2 分 37 秒 2 3.1 8086 的寻址方式 两种不同的类型 : 一类是程序地址 ( 在代码段中 ) 的寻址方式 ; 另一类是操作数地址的寻址方式

More information

2 PIC PIC 1 / CPU PIC MCU PIC RC

2 PIC PIC 1 / CPU PIC MCU PIC RC 2 PIC PIC 1 /... 2-2 2... 2-3 3... 2-4 4... 2-4 5... 2-4 6 CPU... 2-5 7 PIC MCU... 2-6 8 PIC16... 2-6 9... 2-7 10... 2-7 11 RC... 2-7 12... 2-8 13... 2-8 14 NOP... 2-9 15 PMD... 2-9 16... 2-10 17 WDTWDT...

More information

33023A.book(31005A_cn.fm)

33023A.book(31005A_cn.fm) 第 5 章 CPU 和 ALU 目录 本章包括下面一些主要内容 : 5. 简介...5-2 5.2 指令的一般格式... 5-4 5.3 中央处理单元 (CPU)... 5-4 5.4 指令时钟... 5-4 5.5 算术逻辑单元 (ALU)... 5-5 5.6 状态寄存器... 5-6 5.7 OPTION_REG 寄存器... 5-8 5.8 电源控制寄存器... 5-9 5.9 设计技巧...

More information

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6B0B8C0FDB5BCD1A75FD1F9D5C22E646F63>

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6B0B8C0FDB5BCD1A75FD1F9D5C22E646F63> 因 为 路 过 你 的 路, 因 为 苦 过 你 的 苦, 所 以 快 乐 着 你 的 快 乐, 追 逐 着 你 的 追 逐 内 容 简 介 本 书 根 据 2005 年 下 半 年 实 施 的 全 国 计 算 机 技 术 与 软 件 专 业 技 术 资 格 ( 水 平 ) 考 试 嵌 入 式 系 统 设 计 师 级 考 试 大 纲 精 神, 在 深 入 研 究 历 年 计 算 机 技 术 与 软

More information

untitled

untitled 2006-4-25 2006-4-26 2 2006-4-26 3 20 50 6 2006-4-26 4 µ 2006-4-26 5 CERN LEP/LHC 2006-4-26 6 L3 Detector 2006-4-26 7 2006-4-26 8 ATLAS Detector (A Toroidal LHC ApparatuS) 2006-4-26 9 CMS Detector 2006-4-26

More information

<4D6963726F736F667420576F7264202D2031303130315FB971BEF7BB50B971A46CB8735FB773A55FA5ABA5DFB7E7AADAB0AAAFC5A475B77EC2BEB77EBEC7AED55FA97EAE61C0F4B9D2B4BCBC7AB1B1A8EEA874B2CE2E646F63>

<4D6963726F736F667420576F7264202D2031303130315FB971BEF7BB50B971A46CB8735FB773A55FA5ABA5DFB7E7AADAB0AAAFC5A475B77EC2BEB77EBEC7AED55FA97EAE61C0F4B9D2B4BCBC7AB1B1A8EEA874B2CE2E646F63> 全 國 高 職 學 生 102 年 度 專 題 製 作 競 賽 報 告 書 居 家 環 境 智 慧 控 制 系 統 群 別 : 電 機 與 電 子 群 參 賽 作 品 名 稱 : 居 家 環 境 智 慧 控 制 系 統 關 鍵 詞 : 環 境 監 控 ZigBee 感 測 元 件 目 錄 壹 摘 要... 2 貳 研 究 動 機...2 參 研 究 方 法...3 一 研 究 器 材...3 二 研

More information

民 國 105 年 大 專 程 度 義 務 役 預 備 軍 官 預 備 士 官 考 選 簡 章 目 錄 壹 考 選 依 據 1 貳 考 ( 甄 ) 選 對 象 1 參 資 格 規 定 1 肆 員 額 及 專 長 類 別 2 伍 報 名 及 選 填 志 願 日 期 方 式 3 陸 選 填 官 科 (

民 國 105 年 大 專 程 度 義 務 役 預 備 軍 官 預 備 士 官 考 選 簡 章 目 錄 壹 考 選 依 據 1 貳 考 ( 甄 ) 選 對 象 1 參 資 格 規 定 1 肆 員 額 及 專 長 類 別 2 伍 報 名 及 選 填 志 願 日 期 方 式 3 陸 選 填 官 科 ( 民 國 105 年 大 專 程 度 義 務 役 預 備 軍 官 預 備 士 官 考 選 期 程 表 日 期 執 行 項 目 3 月 1 日 (8 時 起 ) 至 3 月 21 日 (17 時 止 ) 網 路 報 名 並 完 成 列 印 3 月 22 日 (17 時 止 ) 各 校 承 辦 人 員 收 報 名 件 截 止 3 月 30 日 4 月 11 日 5 月 18 日 5 月 27 日 (17

More information

微机第02章1(指令寻址)

微机第02章1(指令寻址) 微机原理及应用 主讲 : 谢维成 http://xweicheng.ys168.com scxweicheng@yahoo.com.cn 西华大学电气信息学院 1 第 03 章 80X86 的寻址方式和指令 ( 本章内容 ) 3.1 指令的格式 3.2 8086/8088 的寻址方式 3.3 指令系统 3.3.1 数据传送指令 3.3.2 算术运算指令 3.3.3 逻辑运算与移位指令 3.3.4 串操作指令

More information

PROTEUS VSM

PROTEUS  VSM Proteus VSM-- 1/1 PROTEUS VSM Proteus VSM ISIS Prospice VSM Proteus PROSPICE ARM7 PIC AVR HC11 8051 CPU LCD RS232 LED IAR Keil Hitech C make 6000 SPICE SPICE DLL SPICE3F5 14 FM PROTEUS PCB LED/LCD / 300

More information

,,, PCB, AR M VxWorks DSP,,,,,,,,,,, (CIP) /,,.:,2005 ISBN TP36 CIP (2005) : ( 10 ) : : (010 ) : (010)

,,, PCB, AR M VxWorks DSP,,,,,,,,,,, (CIP) /,,.:,2005 ISBN TP36 CIP (2005) : ( 10 ) : : (010 ) : (010) ,,, PCB, AR M VxWorks DSP,,,,,,,,,,, (CIP) /,,.:,2005 ISBN 7-5635-1099-0...............TP36 CIP (2005)076733 : ( 10 ) :100876 : (010 )62282185 : (010)62283578 : publish@bupt.edu.cn : : : 787 mm960 mm 1/

More information

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6BFBCCAD4B4F3B8D92E646F63>

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6BFBCCAD4B4F3B8D92E646F63> 嵌 入 式 系 统 设 计 师 考 试 大 纲 一 考 试 说 明 1 考 试 要 求 : (1) 掌 握 科 学 基 础 知 识 ; (2) 掌 握 嵌 入 式 系 统 的 硬 件 软 件 知 识 ; (3) 掌 握 嵌 入 式 系 统 分 析 的 方 法 ; (4) 掌 握 嵌 入 式 系 统 设 计 与 开 发 的 方 法 及 步 骤 ; (5) 掌 握 嵌 入 式 系 统 实 施 的 方 法

More information

邏輯分析儀的概念與原理-展示版

邏輯分析儀的概念與原理-展示版 PC Base Standalone LA-100 Q&A - - - - - - - SCOPE - - LA - - ( Embedded ) ( Skew ) - Data In External CLK Internal CLK Display Buffer ASIC CPU Memory Trigger Level - - Clock BUS Timing State - ( Timing

More information

SPMC75F2413A_EVM_使用说明_V1.2.doc

SPMC75F2413A_EVM_使用说明_V1.2.doc SPMCFA EVM V. - Jan 0, 00 http://www.sunplusmcu.com ................ SPMCFA........... EEPROM.... I/O............ LED.... LED.... RS-........0............ EVM................ 0.....0..... SPMCFA EVM SPMCFA

More information

数据库系统概论

数据库系统概论 指令系统 是指 CPU 能完成的所有 指令的集合, 它是在 CPU 设计时就确定了的 所以, 对不同的 CPU, 其指令系统中所包含的具体指令将是各不相同的 但 8088/8086 CPU 的指令系统是完全一样的 8088/8086 CPU 的指令系统可分成下面 9 类 : (1) 数据传送指令 ; (2) 算术运算指令 ; (3) 逻辑运算指令 ; (4) 移位指令 ; (5) 标志处理指令和 CPU

More information

中文手册

中文手册 PCC-3428 PC/104 1. PCC-3428 1.1 PCC-3428 90mm 96mm ST CPU STPC Atlas Atlas CPU 486 DX/DX2 CPU DX2 133MHz Atlas 2D LCD/CRT 100MHz SDRAM 64MBytes PCC-3428 10/100Mbps DOC EIDE USB PC/104 ST STPC Atlas STPC

More information

Microsoft Word - 8-Bit通用IO型单片机20P02B_V03.docx

Microsoft Word - 8-Bit通用IO型单片机20P02B_V03.docx 8-Bit 通用 IO 型单片机 20P02B 版本 :V03 日期 :2012/04/23 www.greenmcu.com 目录 目 录 第 1 章简述... 1 1.1 产品简介... 1 1.1.1 产品特性... 1 1.1.2 系统框图... 2 1.1.3 引脚排列... 3 1.1.4 引脚说明... 3 1.1.5 引脚结构示意图... 4 第 2 章系统... 6 2.1 中央处理器...

More information

专业主干课程与主要专业课程教学大纲(2009年、2011年).doc

专业主干课程与主要专业课程教学大纲(2009年、2011年).doc ... 1... 4... 9... 12... 16... 20... 23... 26... 30... 33... 36 Electric Circuits 00440021 64 0 0 4 1 2 Y- 3 4 ZYT H 5 Analog Electronic Technique 00440041 54 14 0 3.5 1. 2. 1. 2. 3. RC 4. 5. 1. 20 2.

More information

单片机原理及应用实验指导书.doc

单片机原理及应用实验指导书.doc 1 2 3 4...2...4...9...9 AEDK598 MCS51...9 MCS51...10...10...10...10...10...10...11 P1...12...12...12....12...12...13 P3...14...14...14...14...14...14 I/O...15...15...15...15...15...16...17...17...17...17...17...18...19...19

More information

DATASHEET SEARCH SITE ==

DATASHEET SEARCH SITE == , STC 89 1280 8/16/32/64k IAP SRAM ISP P0 8 P1 8051 E 2 PROM + P2 IAP STC Data Flash P4.0P4.3 P3 MAX810 I/O P4 A/D UART A / D 3 STC 89 P I I E 2 P 4 S A ROM EMI P P STC 89C51 RC 4K 512 2K STC 89C52 RC

More information

33023A.book(31006A_cn.fm)

33023A.book(31006A_cn.fm) 6 第 6 章存储器构成 存储器构成 目录 本章包括下面一些主要内容 : 6.1 简介...6-2 6.2 程序存储器构成... 6-2 6.3 数据存储器构成... 6-8 6.4 初始化... 6-14 6.5 设计技巧... 6-16 6.6 相关应用笔记... 6-17 6.7 版本历史... 6-18 2004 Microchip Technology Inc. DS31006A_CN 第

More information

投影片 1

投影片 1 2 理 1 2-1 CPU 2-2 CPU 理 2-3 CPU 類 2 什 CPU CPU Central Processing Unit ( 理 ), 理 (Processor), CPU 料 ( 例 ) 邏 ( 例 ),, 若 了 CPU, 3 什 CPU CPU 了, 行, 利 CPU 力 來 行 4 什 CPU 5 2-2-1 CPU CPU 了 (CU, Control Unit) / 邏

More information

PIC8位单片机汇编语言常用指令的识读(上)

PIC8位单片机汇编语言常用指令的识读(上) PIC8 位单片机汇编语言常用指令的识读 ( 上 ) 各大类单片机的指令系统是没有通用性的, 它是由单片机生产厂家规定的, 所以用户必须遵循厂家规定的标准, 才能达到应用单片机的目的 PIC 8 位单片机共有三个级别, 有相对应的指令集 基本级 PIC 系列芯片共有指令 33 条, 每条指令是 12 位字长 ; 中级 PIC 系列芯片共有指令 35 条, 每条指令是 14 位字长 ; 高级 PIC

More information

HD ( ) 18 HD ( ) 18 PC 19 PC 19 PC 20 Leica MC170 HD Leica MC190 HD 22 Leica MC170 HD Leica MC190 HD Leica MC170 HD

HD ( ) 18 HD ( ) 18 PC 19 PC 19 PC 20 Leica MC170 HD Leica MC190 HD 22 Leica MC170 HD Leica MC190 HD Leica MC170 HD Leica MC170 HD Leica MC190 HD 5 6 7 8 11 12 13 14 16 HD ( ) 18 HD ( ) 18 PC 19 PC 19 PC 20 Leica MC170 HD Leica MC190 HD 22 Leica MC170 HD Leica MC190 HD 22 23 24 26 Leica MC170 HD Leica MC190 HD ( ) 28

More information

1 CPU

1 CPU 2000 Tel 82316285 82317634 Mail liuxd@buaa.edu.cn 1 CPU 2 CPU 7 72 A B 85 15 3 1/2 M301 2~17 : 3/4 1/2 323 IBM PC 1. 2. 3. 1. 2. 3. 1.1 Hardware Software 1.2 M3 M2 M1 1.2 M3 M1 M2 M2 M1 M1 M1 1.2 M3 M1

More information

粤社保函〔2013〕80号

粤社保函〔2013〕80号 맣 뚫 쪡 짧 믡 놣 쿕 믹 뷰 맜 샭 뻖 粤 社 保 函 2016 120 号 맘폚뾪햹2016쓪뛈쪡횱웳튵횰릤믹놾퇸샏뷰 쇬좡룱죏횤폐맘쫂쿮뗄춨횪 参 加 省 直 企 业 职 工 社 会 保 险 各 单 位 和 离 退 休 人 员, 社 会 申 办 退 休 人 员 : 根 据 国 家 和 省 的 有 关 规 定, 省 社 保 局 从 2016 年 4 月 1 日 起, 开 展 2016 年

More information

微机第02章1(指令寻址)

微机第02章1(指令寻址) 微机原理及应用 主讲 : 谢维成 http://xweicheng.ys168.com scxweicheng@yahoo.com.cn 西华大学电气信息学院 1 2 第 2 章微机的组成及微处理器的功能结构 2.1 微型计算机的组成 2.2 80X86 系列微处理器的功能结构 3 教学重点 80X86 系列微处理器的功能结构 80X86 的存储器分段管理方式 4 2.1 微型计算机的组成 AB 运算器

More information

例 如, 一 个 含 有 2000 个 记 录 的 文 件, 每 个 磁 盘 块 可 容 纳 250 个 记 录, 则 该 文 件 包 含 8 个 磁 盘 块 然 后 对 该 文 件 作 二 路 归 并 的 外 排 序, 每 次 往 内 存 读 入 两 个 磁 盘 块, 排 序 后 再 写 回 磁

例 如, 一 个 含 有 2000 个 记 录 的 文 件, 每 个 磁 盘 块 可 容 纳 250 个 记 录, 则 该 文 件 包 含 8 个 磁 盘 块 然 后 对 该 文 件 作 二 路 归 并 的 外 排 序, 每 次 往 内 存 读 入 两 个 磁 盘 块, 排 序 后 再 写 回 磁 说 明 改 动 的 内 容 很 少, 且 都 是 不 怎 么 重 要 的, 因 此 无 需 过 多 纠 结, 大 家 看 完 后 一 目 了 然 第 6 章 排 序 1 增 加 了 :( 十 ) 外 部 排 序 第 一 部 分 : 数 据 结 构 2 后 面 的 修 改 :( 十 一 ) 各 种 内 部 排 序 算 法 的 比 较 ;( 十 二 ) 内 部 排 序 算 法 的 应 用 外 部 排 序

More information

HT46R47 f SYS =4MHz 3.3~5.5V f SYS =8MHz 4.5~5.5V 13 位双向输入 / 输出口 1 个与输入 / 输出共用引脚的外部中断输入 8 位带溢出中断的可编程定时 / 计数器 具有 7 级预分频器 石英晶体或 RC 振荡器 位的程序存储器 P

HT46R47 f SYS =4MHz 3.3~5.5V f SYS =8MHz 4.5~5.5V 13 位双向输入 / 输出口 1 个与输入 / 输出共用引脚的外部中断输入 8 位带溢出中断的可编程定时 / 计数器 具有 7 级预分频器 石英晶体或 RC 振荡器 位的程序存储器 P HT46R/47R/48R/49R 系列 选型指南 HT46R22 f SYS =4MHz 3.3~5.5V f SYS =8MHz 4.5~5.5V 19 位双向输入 / 输出口 1 个与输入 / 输出口线共用的外部输入 16 位具有 7 级预分频带溢出中断的可编程定时 / 计数器 内置石英晶体或 RC 振荡器 2048 14 位的程序存储器 PROM 64 8 位的数据存储器 RAM 支持发声的

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 STC 单片机比较器原理及实现 主讲 : 何宾 Email:hebin@mail.buct.edu.cn 2016.03 STC 单片机比较器结构 STC15W 系列单片机内置了模拟比较器 对于 STC15W201S STC15W404S, 以及 STC15W1K16S 系列单片机的比较器内部结 构 STC 单片机比较器结构 从图中可以看出, 比较器正端输入 CMP+ 的输入电压来自单片机的 P5.5

More information

Microsoft PowerPoint - C15_LAB_MTS86_INTRO

Microsoft PowerPoint - C15_LAB_MTS86_INTRO INTRODUCTION TO THE MTS-86C MICROCOMPUTER TRAINER What s MTS-86? 7-4 7-5 7-7 7-3 7-2 7-3 7-6 2 4 5 3 7-6 7-8 7-3 8 4 5 3 6 37 微處理機原理與應用國立台灣大學生物機電系 SPECIFICATION () CPU: 886 (2) Display Unit: LCD (6x2 Line)

More information

ATMEL AT90S8515 AVR CPU AVR AVR AVR ATMEL RISC 32 8 r0 r X Y Z R0 R1 R2 R13 R14 R15 R16 R17 R26 R27 R28 R29 R30 R31 0x00 0x

ATMEL AT90S8515 AVR CPU AVR AVR AVR ATMEL RISC 32 8 r0 r X Y Z R0 R1 R2 R13 R14 R15 R16 R17 R26 R27 R28 R29 R30 R31 0x00 0x 115 AVR W.V. Awdrey ATMEL AVR PIC AVR PIC AVR RISC AVR PIC AVR AVR AVR AVR AVR ATtiny15 AVR AVR AVR RAM ROM 121 116 122 ATMEL AT90S8515 AVR CPU AVR AVR AVR ATMEL RISC 32 8 r0 r31 3 16 X Y Z 6-1 118 7 0

More information

Microsoft Word - SoftICE用户指南.doc

Microsoft Word - SoftICE用户指南.doc SST89E/V5xRD2 SST89E/V554RC SST89E/V564RD SST89E516RD2 单片机 SoftICE 用户指南 1 介绍 SoftICE 的英文是 Software In Circuit Emulator, 翻译成中文是 在电路上的软件模拟, 它是 SST 公司为方便 SST 用户使用 SST89E/V5xRD2 SST89E516RD2 SST89V516RD2 SST89E/V554RC

More information

!!""# $ %#" & $$ % $()! *% $!*% +,-. / 0 %%"#" 0 $%1 0 * $! $#)2 "

!!# $ %# & $$ % $()! *% $!*% +,-. / 0 %%# 0 $%1 0 * $! $#)2 ! """"""""""""""""""" " !!""# $ %#" & $$ % $()! *% $!*% +,-. / 0 %%"#" 0 $%1 0 * $! $#)2 " !"#$%#$&!!!!!!!!!!!!!!!!!!!!!!!!!!!"#$%& (& #) *+&,"-./%0 1 2"0*-"3* #4 5%&6&4"&00 78 9+& :"/;& 7< 9+& =#4-%%/

More information

PCM-3386用户手册.doc

PCM-3386用户手册.doc PCM-3386 BBPC-4x86 10/100M PC/104 (Lanry technology Co. Ltd. Zhuhai) 38 1012836 (Address: Room 1012,Linhai Building,No. 38,west of Shihua Road,Zhuhai City,Guangdong Province,China) (post code)519015 (phone)0756-3366659

More information

Microsoft Word - IRFWX_A051_C_SyncMOS_with_STC_APN_SC_.doc

Microsoft Word - IRFWX_A051_C_SyncMOS_with_STC_APN_SC_.doc EEPROM 应用说明 1 适用产品 :SM59D03G2 SM59D04G2 series 2 应用范围 : 针对需使用 EEPORM 功能替换 STC 89C5X 的应用及汇编语言之范例程序 ( 使用内部扩充内存为暂存区 ) 3 功能说明 : 3.1 本公司上述产品 EEPORM 功能皆可替换 STC89C5X, 仅需对特殊功能缓存器定义 ( 详见表 1) 及 ISP 命令定义 ( 详见表 2)

More information

untitled

untitled EDM12864-GR 1 24 1. ----------------------------------------------------3 2. ----------------------------------------------------3 3. ----------------------------------------------------3 4. -------------------------------------------------------6

More information

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20 (Jump) (Loop) (Conditional jump) CMP CALL AND SAR/SHR TEST JMP NOT SAL/SHL Jnnn* OR RCR/ROR LOOP XOR RCL/ROL RETn * nnn, JNE JL -128 127-32,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far

More information

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas 目录 1 IPv6 快速转发 1-1 1.1 IPv6 快速转发配置命令 1-1 1.1.1 display ipv6 fast-forwarding aging-time 1-1 1.1.2 display ipv6 fast-forwarding cache 1-1 1.1.3 ipv6 fast-forwarding aging-time 1-3 1.1.4 ipv6 fast-forwarding

More information

101

101 Lecture 04 Modeling, Anlysis nd Simultion in Logic Design 逻辑设计中的建模 分析与仿真 Dr. Engineering Design Process 工程设计过程 定义问题研究勾画可能的解答 Identify nd define prolem reserch sketch possile solutions 建模 Modeling 分析 Anlysis

More information

2005.book

2005.book ...4... 4... 7...10... 10... 10... 10... 10... 11... 11 PCC... 11 TB170... 12 /... 12...13... 13 BP150 / BP151 / BP152 / BP155... 14...15... 15... 15... 15... 15... 15... 15... 16 PS465 / PS477... 17 PS692

More information