新手求大神做一个kk按键官网脚本,第一步按回车,第二步按下,第三步按上

当前位置: >>
单片机学习实验指导书
为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!专业飞思卡尔技术支持MC68HC908GP32 实验指导书版权所有 淘宝飞思卡尔技术服务第一店 飞信电子科技2009 年 12 月 21 日-1- 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!飞信电子科技店铺介绍我们是飞思卡尔单片机嵌入式应用专业研发团队,致力于小型仪器仪表、汽车电 子、无线通信应用领域的研发和技术推广。店铺宗旨交四海好友,推飞思卡尔先进技术,为中国嵌入式技术的发展尽微薄之力!! ! 服务嵌入式研发工程师!服务单片机爱好者!服务大学生! 质优价廉,诚心服务,信誉第一!! !店铺主营专业研发和销售飞思卡尔 08、S08、S12(X)系列单片机开发板、评估板、学习板, 以及 08、S08、S12(X)系列单片机编程器和调试器。小店根据三类不同的客户需求提 供针对性的产品和服务: (1)针对嵌入式开发工程师,小店提供 8 位/16 位多种开发板;对于初步接触飞 思卡尔单片机的工程师,这些开发板帮助他们快速掌握飞思卡尔的技术;对于熟悉飞 思卡尔技术的工程师,这些开发板将成为开发平台,同时提供丰富的资源。具体如小 店提供了: 针对仪器仪表开发工程师需求的“飞思卡尔 Freescale S08GB60 开发板 GB60 学习板 S08 应用开发平台”,针对汽车电子工程师、通信电子工程师、仪表控制工程 师需求的“飞思卡尔 Freescale S12XDP512 开发板 S12XDP512 学习板”、“飞思卡尔 Freescale 9S12XDP512 评估板汽车电子 CAN/LIN 总线开发板”,这些开发板能够有效 提高不同应用的工程师的开发效率,保证开发质量; (2)针对即将毕业的大学生,为其提供毕业设计项目原型,以及提供免费技术 持和咨询; (3)为参加各级各类创新项目比赛、车模比赛等的大学生提供开发板,以及免 费的技术支持和咨询。店铺副业欢迎单片机爱好者和嵌入式开发人员进店交流。 所有产品均提供技术支持。 对外承接飞思卡尔系列开发板的维修服务。 承接外包合作开发项目。-2- 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!技术支持联系方式 联系人:杨梅 QQ: 旺旺群: E-mail: 店铺网址:/ Tel: 旺旺在线:khx-3- 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!目录第一章 08 实验系统概述 ................................................................................................... 6 1.1 基本特点 .................................................................................................................. 6 1.2 主要功能 .................................................................................................................. 6 1.3 系统组成 .................................................................................................................. 7 1.4 工作环境 .................................................................................................................. 7 第二章 08 系统硬件介绍 ................................................................................................... 8 2.1 系统总体结构 .......................................................................................................... 8 2.2 硬件系统接线说明 .................................................................................................. 8 2.2.1 开关量输入 .................................................................................................. 9 2.2.2 开关量输出 ................................................................................................ 10 2.2.3 液晶显示接口 ............................................................................................ 11 2.2.4 键盘接口 .................................................................................................... 11 2.2.5 模拟量输入 ................................................................................................ 12 2.2.6 串行口编程 ................................................................................................ 12 2.2.7 空白芯片写入扩展口(选配) ................................................................ 12 2.2.8 元件扩展口 ................................................................................................ 13 第三章 编译工具说明 ...................................................................................................... 14 3.1 概述 ........................................................................................................................ 14 3.2CodeWarrior 使用方法 ........................................................................................... 14 第四章 超级终端使用说明 .............................................................................................. 19 4.1 终端仿真程序――超级终端 ................................................................................ 19 第五章 串行监控程序介绍 .............................................................................................. 25 5.1 概述 ........................................................................................................................ 25 5.2 命令列表 ................................................................................................................ 25 5.3 命令描述 ................................................................................................................ 26 5.3.1 A――反汇编和汇编命令 .......................................................................... 26 5.3.2 B――断点设置命令 .................................................................................. 27 5.3.3 Ctrl+A/X/C/P――修改 A/(H:X)/CCR/PC 内容 ........................................ 27 5.3.4 D――显示存储内容命令 .......................................................................... 27 5.3.5 E――擦除 FLASH 存储内容命令 ............................................................ 28 5.3.6 G――程序运行命令 .................................................................................. 28 5.3.7 H――显示命令列表和帮助信息 .............................................................. 28 5.3.8 L――下载程序命令................................................................................... 29 5.3.9 M――修改存储区内容命令...................................................................... 29 5.3.10 R――显示各寄存器内容 ........................................................................ 30 5.4 基于监控程序的软件编程 .................................................................................... 30 5.4.1 概述 ............................................................................................................ 30 5.4.2 程序代码和变量地址分配 ........................................................................ 30 5.4.3 程序初始化状态 ........................................................................................ 33 5.4.4 调试、发行用户自己的程序 .................................................................... 34 第六章 08 基本实验 ......................................................................................................... 35 实验一 基本 I/O 编程实验 ....................................................................................... 35 实验二 SCI 串行口实验 ........................................................................................... 39 实验三 SPI 串行口实验 ........................................................................................... 48 实验四 流水灯实验 .................................................................................................. 52 实验五 Keyboard 实验 ............................................................................................. 56 实验六 LCD 液晶显示 ............................................................................................. 64-4- 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!实验七 A/D 转换 ...................................................................................................... 73 实验八 定时器溢出中断实验 .................................................................................. 80 实验九 定时器输出比较实验 .................................................................................. 82 实验十 PWM 定时实验 ........................................................................................... 83 附 1:MC68HC908GP32 引脚及内存分配图 ................................................................... 87 附 2:存储器映像图 : ..................................................................................................... 88-5- 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!第一章08 实验系统概述传统的嵌入式应用开发方法主要是使用仿真器模拟目标系统中 MCU 的运行情况,希望达到在 目标系统硬件尚未定型与制版情况下,先行调试目标系统的硬件、软件设计,为目标系统的研制提 供前期基础。 但是, 一些情况下, 难以实现 100%的实时仿真, 有些功能在用仿真器调试时十分正常, 而到了实际应用系统却不能顺利运行。同时,传统的仿真方式的一些调试功能仅适用于初学者,对 于具有一定开发经验并拥有通用功能模块积累的开发者,往往增加了开发时间。 目前,随着计算机制造技术的发展,许多公司新推出的 MCU 具有片内 Flash 存储器,Flash 存 储器具有电可擦除、无需后备电源保护数据、可在线编程等特点。在线编程(In-Circuit Program)允 许单片机内部运行的程序去改写 Flash 存储器的内容, 利用这个特点, 不仅可以在运行过程中修改某 些运行参数,也为研制新型嵌入式应用开发工具提供了技术基础。 Freescale 公司目前正在陆续推出的新一代 8 位嵌入式单片微机 M68HC08 系列,其片内集成的 Flash 存储器具有单一电源电压供电、支持在线编程等特点,它是 Flash 技术比较成熟的条件下推出 的,在线写入、读出稳定。 本系统利用 MC68HC908GP32 单片机为基础制造的价格低廉、支持在线调试的 MCU 在线编程 实验开发系统。1.1 基本特点① 传统仿真器的 “仿真系统” 与实际目标系统的硬件不是一套系统, 难以实现目标系统的全部功能, 这主要是由于过去的目标系统的程序存储器多为 EPROM、OTP 或不支持在线写入的 Flash 存储器。 新型的开发系统的硬件可以直接构成目标系统的评估硬件,所调试的软件即运行于此系统,可以实 现 100%在线实时仿真。 ② 与传统仿真器相比,提供的调试功能与方法更多,操作更加简便,可以缩短开发进程。 ③ 由于开发系统的硬件体系就是目标评估系统,不必为仿真功能配置另外硬件,极大地减少了开发 过程中的硬件实验成本。 ④ 程序输入、编译以及产生 S19 文件等操作利用 CodeWarrior IDE 完成。 ⑤ S19 文件的写入(下载) 、调试利用驻留在 Flash 存储器内的监控程序和超级终端通信来完成。1.2 主要功能① 100%的在线实时仿真。用户下载自己的程序进入芯片后,在监控程序的控制下自动转入用户程 序执行。该实验开发板,通过外部接插线完全可以模拟用户的实际应用系统板。所有程序均可在实 验开发板上调试完成,给二次开发带来了极大方便。 ② 标准 Windows 界面,帮助信息丰富,提供演示实例。不论对初学者还是对有经验的开发者均提 供便利。直接支持 Freescale 的.S19 文件格式,显示所打开文件的内容,提示写入进程,自动擦除写 入区并自动校验。 ③ 为系统组合方便,所有 I/O 口引脚直接引出到插孔,供外接使用,开发板上提供了并行 I/O 模拟 区、A/D、LCD、键盘等模拟区,可直接使用。同时还设计了 IC 插线及其它元件扩展槽,可以通过 该扩展槽完成相关应用系统评估。 ④ 不要求用户改变中断向量,用户完全可以按照标准格式书写程序,PC 机方的管理软件自动扫描 用户程序,将中断向量改变后送给 MCU 中的监控程序,MCU 中的监控程序将用户中断向量放入监 控区,待相应中断发生时,由监控程序转入。 ⑤ 写入后自动转入用户程序执行,为用户调试程序带来了方便,加快了调试速度。也支持断点调试-6- 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!功能,此时要求用户进行相应输入或选择操作。 ⑥ 复位后,在没有用户程序的情况下,一直处于监控联机状态,若有用户程序,5 秒内处于监控联 机状态,若无用户联机信号,则转入用户程序执行。 ⑦ 可根据用户要求进行功能定制与扩展。1.3 系统组成“MC68HC908GP32 MCU 在线实验开发系统”内含: ① 在线实验板一块,其中 MC68HC908GP32 内部写入支持在线编程的监控软件 8KB(内部 Flash 存 储器共 32KB,用户可使用 24KB)。 ② CodeWarrior IDE 软件一套: 标准 Windows 界面, 支持 Freescale 的.S19 文件格式。 内含帮助文件。 ③ 演示程序包,包含以下程序 ● 基本 IO 实验 ● SCI 串行通信实验(查询方式) ● SCI 串行通信实验(中断方式) ● 键盘实验 ● 液晶 LCD 显示实验 ● AD 转换实验 ● 定时器溢出中断实验 ● 定时器输出比较实验 ● PWM 定时器中断实验1.4 工作环境单 片 机:采用 Freescale 新一代 M68HC908 系列 MCU 工作平台:Windows98(及以上) 低级语言:汇编语言 高级语言:C、 C++-7- 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!第二章08 系统硬件介绍2.1 系统总体结构系统总体结构框图,如图 2-1 所示。串行口总 线驱动器PC 机 RS-232485蜂鸣 器模 块LCD 模块P W M指示灯模块 电位器 X2 电源 模块 拨线开关模块MC68HC 908GP3 2 MCUIC 插线及其它 元件扩展槽键盘输入 模块实验板图 2-1 系统总体结构框图 硬件部分主要由 MC68HC908GP32 芯片及外围电路、LCD、键盘、模块化电源、串行口驱动电 路、IC 插线及其它元件扩展槽、输出开关量接线排、输入开关量接线排等部分组成,其主要作用是 通过 MC68HC908GP32 芯片的监控程序和 PC 机进行通信,完成芯片程序的写入、运行、断点调试。2.2 硬件系统接线说明系统的硬件布局框图见图 2-2。实际接线时,直接采用 5V 直流电源适配器给系统供电。电源部 分对强弱电进行了物理隔离。板上的串行口为 9 芯标准串行接口,通过三芯(发送、接收、地)与 PC 机的串行口相连,实现开发板与 PC 机的通信。 连接方法:-8- 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!图 2-2 硬件布局 1 将本实验板摆放在一个相对固定,易于操作的桌面上,远离金属物品。 2 将实验开发板的串行口通过串行通信线与 PC 机的串行口 COM1 或 COM2 连接。 3 连接实验所需线路 (例如:将所要完成的实验模块的跳线端子接通)。 4 检查跳线是否正确,若跳错,请重新纠正。 5 检查无误,接通实验开发板电源(+5v),电源指示灯亮。 6 按实验板上的复位按钮。 7 执行 PC 机的配套软件,硬件系统等待 SD-1 软件系统的握手信号。2.2.1 开关量输入实验开发板用拨线开关提供 8 位数字量的输入。原理图如 2-3 所示.。 本实验开发板采用了 74HC165(8bit parallel-in/serial-out shife register)8 位并入串出切换芯片,通过 拨线开关的状态的不同,向 MCU 写入不同的字节数据。 拨线开关状态为 OFF 时是高电平,拨线开关状态为 ON 时是低电平。-9- 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!图 2-3拨线开关2.2.2 开关量输出① 实验开发板用 LED 提供 8 位数字量的输出。 原理图如图 2-4 所示, 本实验开发板采用了 74HCT595 (8bit serial-in/ parallel-out shife register) 来实现, 导线接插点为高电平时 LED 是暗的, 低电平时 LED 是亮的。图 2-4 LED 接线 ② 实验开发板含有蜂鸣器输出,原理图如图 2-5 所示。 通过在 J13 上加上一个高电平,蜂鸣器就会发出响声。可以通过杜邦线接到您想接的任意 MCU 引脚上。图 2-5蜂鸣器- 10 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!2.2.3 液晶显示接口实验开发板提供可显示 16 个符号或字母的双排字符液晶,实验开发板提供两种接线方式。 ① 当将液晶显示器接入上面的插线时为固定接线,原理图如图 2-6。图 2-6 LCD 液晶接线 ② 当将液晶显示器接入下面的插线时为手动接线,连线的位置在液晶的下方,可以将 04―14 管脚 自定义连接,其管脚定义见下表:管脚号 1 2 3 4 5 6 7~10 11~14 15~16 符号 Vss Vdd V0 RS R/W E DB0 ~ DB3 DB4 ~ DB7 E1~E2 电平 方向 引脚含义说明 电源地 电源(+5V) 液晶驱动电源(0~5V) 寄存器选择;1-数据寄存器 0-数据寄存器 读写操作选择:1-读操作 0-写操作 使能信号:R/W=0,E 下降沿有效 R/W=1,E=1 有效 8 位数据总线的低 4 位,若与 MCU 进行 4 位传 送时,此 4 位不用 8 位数据总线的高 4 位,若与 MCU 进行 4 位传 送时,只用此 4 位 上下两行使能信号,只用于一些特殊型号H/L H/L H/L H→L输入 输入 输入 三态 三态 输入2.2.4 键盘接口实验开发板提供 4*4 键盘,由于 MC68HC908GP32 的 PTA 口具有键盘功能,用于键盘中断信号的输 入。实验开发板提供两种接线方式,但是这个 4*4 的键盘既可以实验行扫描法也可以实现行反转法 的按键输入功能。 ① 当将键盘接入上面的插线时为固定接线,键盘接线原理图如图 2-7。 注:固定接线自左向右分别接 PTA0∽PTA7.(可对应实验板硬件平台)- 11 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!图 2-7 键盘接线 ② 当将键盘接入下面的插线时为手动接线,连线的位置在键盘的左边。2.2.5 模拟量输入实验开发板提供模拟量输入,进行 A/D 转换,其原理图如图 2-8。 采用了两个 10K 的电位器分别用于 AD0 和 AD1 通道的模拟量的输入,在进行 ADC 实验的时候, 通过调节电位器阻值的大小,获得不同的模拟电压。图 2-8 AD 转换2.2.6 串行口编程实验开发板提供标准的串行口,如图 2-9 所示。图 2-9串行口2.2.7 空白芯片写入扩展口(选配)实验开发板提供 MC68HC908GP32、MC68HC908JL3 等空白芯片写入。- 12 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!2.2.8 元件扩展口实验开发板提供元件扩展口,使用者可以进行 IC 扩展。布线如图 2-10 所示。图 2-10 IC 扩展口- 13 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!第三章编译工具说明3.1 概述MC68HC908 实验系统使用的是 Freescale 公司的, 专门面向 Motorola(freescale)所有 MCU 与 DSP 嵌入式应用开发的工具 “Freescale CodeWarrior ” 它是面向 HC08 或 S12 为 CPU 的单片机嵌入式应 。 用开发的软件包。包括集成开发环境 IDE、处理器专家库、全芯片仿真,可视化参数显示工具、项 目工程管理器、C 交叉编译器、汇编器、链结器以及调试器。3.2CodeWarrior 使用方法以下以一个简单的例子说明 CodeWarrior 如何使用。 (1)项目创建 第一步:安装好 CodeWarrior 后,打开 CodeWarrior 窗口,会出现如下窗口, 然后按以下图例进行操作:第二步:在上图中,点击 Create New Project,创建新的工程。- 14 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!第三步:在上图中我们选择我们所用的单片机的型号(以 MC68HC908GP32 为例) :第四步:在上图中,显示了我们对新建工程的初步配置,点击“下一步” 。- 15 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!第五步:在上图中,可以选择编程时候所用的语言,工程项目的名字,以及保存工程项目的路 径,之后我们点击“完成” 。第六步:点击“完成”后,将出现上图,双击 main.c 进入编辑区。 系统已将部分格式给出,用户只需将代码写在相应部分就可以。- 16 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!输入编写的代码后,单击“PROJECT|MAKE”或点击图标 完成编译。若出错,则编译系统 会报错,并说明出错类型。 (2)查看该工程所在的文件夹: 找到工程项目的保存位置,打开 bin 文件夹,有一个 Simulator.abs.s19 文件,这就是编译生 成的 S19 文件,它是一个可以用文本编辑器查看的文档,可以利用超级终端将其下载到实验板中的 GP32 芯片中。 (3)软件调试 CodeWarrior 开 发 软 件 下 实 现 反 汇 编 与 模 拟 调 试 , 下 面 我 们 以 脱 离 开 发 实 验 板 , 单 纯 在 CodeWarrior 开发软件下实现 DISASSEMBLE 与 DEBUG。 在打开源程序的情况下,单击“PROJECT”|“DISASSEMBLE” ,将会打开出反汇编 Lst 文件: 最左边一列 Abs 为源代码的绝对行地址;第二列 Rel 为源代码的相对行地址;第三列 Loc 为目 标代码的分配地址(16 进制表示) ;第四列 Obj.code 为目标代码(16 进制) ;第五列 code Source line 为源代码行,我们可以仔细阅读分析机器代码及其分配的地址。 单击“PROJECT”|“DEBUG” ,将会调用实时仿真器来模拟程序:- 17 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!在上图中,有一个调试工具栏: 它用来实现“单步/连续”运行。 按钮名称从左至右依次为: “START\CONTINUE”“SINGE STEP”“STEP OVER”“STEP OUT” , , , , “ASSEMBLY STEP”“HALT”“RESET TARGET” , , 。 该图中还有七个命令窗口,从左到右依次为 : (1)“SOURCE” :显示程序源代码。 (2)“DATE” :显示程序所用到的数据。 (3)“COMMAND” :显示当前的所使用的命令,例如“STEPPED” ,它就是“SINGE STEP” 。 (4) “ASSEMBLY” :显示当前的程序的汇编语言,因为源程序本身已经是汇编语言,所以,效果 不太明显。该例中,只是把“EQU”语句定义的端口给替换出来;将十六进数转换为立即数(十进制 数) 。 (5)“REGISTER” :显示当前 CPU 寄存器的各值。 (6)“PROCEDURE” :显示当前所运行的程序所在程序入口,因为是程序入口为 ENTRY() ,所以 为“ENTRY()。 ” (7) “MEMORY” :显示内存中的值,第一行显示 4 个单元,左边为该段内存的起始地址。中间部 分将十六进制数的值显示出来。在最右边,应该将这些数值的 ASCII 码中代表的字符显示出来。不 能显示的字符,包括数值小于$20 的 ACSII 码控制字符,和大于$7F 的非 ASCII 码字符,用“. ”显 示出来。 关于模拟调试器的使用方法可以参考它的相关帮助文档,本处不再详细说明。使用“帮助”的 方法是单击&True-Time Simulator & Real-Time Debugger&实时仿真器菜单栏中的 “HELP”中的 “HELP TOPICS” 。- 18 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!第四章超级终端使用说明4.1 终端仿真程序――超级终端使用 Windows 自带的“超级终端” ,可以建立 PC 与 MC68HC908GP32 芯片的通信。 读者可以在“开始”菜单中找到该程序。步骤是: 【开始】――&【程序】――&【附件】――&【通 信】――&【超级终端】――&【 Hypertrm】 。这时,程序启动,出现的图像如图 4-1 所示。然 后,出现用户界面,如图 4-1 所示。键入用户名,则建立了与芯片的一个通信连接(注意:此时应 保证 IDK 与 PC 已通过串行口线连接在一起) 。按“确定”后,出现如图 4-2 所示的对话框,进行串 行口通信设置,将“连接时使用(N) ”设置为“直接连接到串口” 。按“确定” ,弹出如图 4-3 所示 对话框,进行串行口设置。各参量设置如图 4-3 所示。最后,按“确定” 。当出现如图 4-4 所示的窗 口时,表明 PC 已和芯片建立了通信。然后,就可以按照所述的操作方法,实现各种功能。图 4-1新建连接- 19 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!图 4-2设定通信方式注意:这里仅仅使用了超级终端的部分功能来实现 PC 与芯片的串口通信。在使用“L”命令将用户 *.S19 文件下载到芯片中时, 必须采用如图 4-5 所示的方法。 即在键入 “L” 命令后, 使用 “传送 (T) ” 中的“发送文本文件(S),弹出如图 4-6 所示窗口。 ”图 4-3串口通信设置- 20 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!图 4-4通信成功图 4-5发送*.S19 文件在找到要下载的*.S19 文件后,按“打开(O),这样,就把文件传送到 IDK 上的 MC68HC908GP32 ” 芯片中了。- 21 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!图 4-6选择*.S19 文件附:以换行符作为发送行末尾设置如下: 点击“文件”――&“属性”――&“设置”――&“ASCII 码设置”――&“以换行符作为发送行末 尾”――&确定――&确定,完成设置。- 22 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!- 23 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!使用 Ctrl+P 组合键来修改程序 PC 指针的值,用 C 语言写的程序,下载到 MCU 里面的 PC 指针是在 808C,修改完成之后键入 G 命令,然后程序就运行了。 注意: 采用汇编写的程序, 程序 PC 指针的起始地址不同, 可以通过 CodeWarrior 或者.S19 文件看出, 所以,用户得注意不同的程序下载时的 PC 值。- 24 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!第五章5.1 概述串行监控程序介绍实验系统依靠 MCU 内部的监控程序来实现与 PC 机的通讯,提供给用户 PC 机上的接 口。用户可以使用普通的终端仿真软件来完成与核心子板的通讯,通过向 MCU 内部的监控 程序传递各种命令来实现对 MC68HC908GP32 的在线编程和程序调试。需要指出的是,监 控程序使用 RS232 协议传输数据,波特率为 9600 bps、8 位数据位、1 位停止位。 用户只要用 RS232 电缆将核心子板和 PC 机正确连接,打开子板电源,监控程序就会自 动初始化 MC68HC908GP32 并向 PC 机上的终端仿真软件传递显示当前系统版本的信息。 Tsinghua Motorola MCU center IDK debug V.1.1. All right reserved, Type 'H' for help ...... what ever you like & 初始化完成后,监控程序向 PC 机传递显示监控命令提示符“&”,这时用户就可以输 入各种命令了。监控程序会等待用户输入命令字母, 并提示相应的参数输入。 当一个正确的 命令输入后,监控程序会进入两种基本的工作方式: ? 当用户输入某监控命令时,监控程序执行该监控命令相应的服务例程 ,并在例程执行结束后在终端屏幕上显示“&”提示符,此时用户就可以输入新的监控 命令了,其中有些监控服务例程执行过程中,还会要求用户输入数据。 ? 当用户要求运行一个用户程序时,若用户设置了断点,则监控程序从 当前 PC 处开始执行用户程序,运行到断点处返回监控状态,终端屏幕上显示提示符 “&”;而若用户未设置断点,则监控程序就将 MCU 控制权完全交给用户程序,即在 MCU 复位之前,用户将无法输入任何监控命令。 如果用户已经向 MC68HC908GP32 下载了自行编写的用户程序,并在用户中断向量表 中填写了复位向量, 系统复位时会自动等待用户选择进入监控程序还是用户程序。 如果用户 在复位后 5 秒内没有任何键盘动作,系统会自动从用户程序的复位向量处开始运行。5.2 命令列表监控程序 1.1 版本中支持的监控命令如表 5-1 所示。 表 5-1 监控命令表 命令格式 A xxxx 操作 反汇编和汇编 (起始地址为 xxxx) 设定断点 (地址为 xxxx) 改变累加器 (A)- 25 -备注 用户可以直接输入汇编源码 (或机器码)以改变 FLASH 中的语句内容B xxxx Ctrl + A 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!Ctrl + X Ctrl + C Ctrl + P D xxxx-xxxx E xxxx-xxxx G H L M xxxx R改变变址寄存器 (H 和 X) 改变条件码寄存器(CCR) 改变程序计数器 (PC) 显示指定地址内的 存储内容 擦除指定地址内的 存储内容 运行用户程序 显示所有命令的 帮助信息 下载 S 记录格式文件到 FLASH 中 改变指定地址的 存储内容 显示 MCU 寄存器 同时支持对 RAM 和 FLASH 的修改 包括 A、H、X、CCR、 PC、SP 等 对 RAM、FLASH 和寄存器 都有效 仅对 FLASH 有效 入口由 PC 寄存器指定注: 1.只要用户输入了完整的命令行(包括命令字母和参数) ,监控程序会立即 执行相应操作,不需要用户以回车来结束命令行的输入。 2.在命令输入过程中,如果参数还未输完就敲击回车或是输入不正确的参 数,该命令不会被响应。5.3 命令描述 5.3.1 A――反汇编和汇编命令说明:A 命令用于执行反汇编和汇编服务例程。在键入命令时,用户需要同时输入目标代码 的起始地址(4 位 16 进制)。例程会显示从起始地址反汇编出的第一条指令,并以“&&.” 符号提示用户输入新的指令。当用户输入新的汇编指令,并以回车结束时,监控例程会汇编 出新指令的机器码并自动写入 FLASH(如果用户在输入过程中使用退格键,监控例程会忽 略用户的输入,重新显示当前指令并提示用户输入);当用户直接键入回车时,监控例程会 继续显示下一条指令以供查看或修改;当用户键入“.”,终止此次汇编/反汇编命令。范例:&A
45 02 3F LDHX #$023F &&. LDHX &Backspace& @ 3F LDHX #$023F &&. LDHX #$0000&CR&- 26 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐! @ 00 @04 A6 01 & TXS LDA &&. &CR& #$01 &&. .5.3.2 B――断点设置命令说明:B 命令用于设置程序运行断点。在键入命令时,用户需要同时输入断点地址(4 位 16 进制)。如果用户不输入任何地址,而直接以回车结束命令,例程会清除当前的断点设置, 禁止断点功能。需要注意的是 MC68HC908GP32 只允许同时设置一个断点,所以如果用户 重复设置断点,则只有最后设置的断点有效。一旦用户程序运行到断点地址,监控程序会暂 时停止正在运行的用户程序,显示当前寄存器状态,提示用户执行新的命令或是继续运行程 序,同时清除当前的断点设置,用户需要重新使用 B 命令设置断点。范例:设置断点:&B 8003 &程序运行到断点处:BreakPoint Encountered, Register Values : A=04 H:X=023F PC=8003 CC=68 & SP=023A5.3.3 Ctrl+A/X/C/P――修改 A/(H:X)/CCR/PC 内容说明:该命令用于修改累加器 A、变址寄存器(H 和 X)、条件码寄存器(CCR)和程序计 数器(PC)的内容。用户键入命令后,服务例程会显示指定寄存器的当前值,并以“.”提 示用户输入,用户可以输入新值,也可以直接键入回车结束。范例:&^A &^X &^C &^P & A=04.05 H:X=023F.0000 CC=68.&CR& PC=5.3.4 D――显示存储内容命令说明:该命令用于显示 MC68HC908GP32 的存储区内容, 包括 RAM ($F) FLASH 和 ($8000-$DFFF)等。在键入命令时,用户需要同时输入要显示的存储区的起始地址(4 位 16 进制数) 和结束地址 位 16 进制数) 服务例程会同时显示存储内容的 16 进制和 ASCII (4 。- 27 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!值(如果是不可显示的 ASCII,则以“.”代替)。如果用户输入的地址范围内存在着非存储 单元,则显示的数据可能是$81 或是其他任意值。范例:&D E070-E080 E070 BD AF 01 65 00 10 26 F4 CD E3 7C 6E FF 04 45 00 ...e..&...|n..E. E080 00 D6 E0 8F AF 01 A1 04 27 59 CD F3 77 20 F2 0D ........'Y..w .. &5.3.5 E――擦除 FLASH 存储内容命令说明:该命令用于擦除 MC68HC908GP32 的 FLASH 存储区内容。在键入命令时,用户需要 同时输入要擦除的存储区的起始地址(4 位 16 进制数)和结束地址(4 位 16 进制数)。由 于监控程序驻留的区域($E000-$FDFF)不允许擦除,所以该命令只对部分 FLASH 存储区 ($8000-$DFFF)有效。在擦除操作完成后,服务例程会对该 FLASH 存储区进行空校验, 并显示提示信息表示是否擦除成功。范例:&E 00-D000 Successfully erased. &E 00-F000 Error erased. &5.3.6 G――程序运行命令说明:该命令使得 MCU 从当前程序计数器(PC)所指向的代码地址开始运行,所以常需要 和 Ctrl+P 命令配合使用, 用于运行用户下载到 FLASH 中的程序。 该命令没有任何命令参数。 如果用户没有设置断点,则在下一次 MC68HC908GP32 复位以前,监控程序将无法接收任 何用户发出的命令,MCU 将完全被用户程序所占用。MC68HC908GP32 复位以后,监控程 序会重新控制 MCU,等待用户输入新的命令。范例:&^P &G PC=5.3.7 H――显示命令列表和帮助信息说明:该命令显示监控程序提供的所有命令及帮助信息,没有任何命令参数。范例:&H ^A,^X,^C,^P : Register Change - 28 A xxxx : Assembler/Disassembler 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐! D xxxx-xxxx : Memory Display G : Run Program L : Download S19 File To FLASH E xxxx-xxxx : Erase Flash & M xxxx : Memory Modify B xxxx : Set Break Point R : Register Display H : Display This Message5.3.8 L――下载程序命令说明:该命令从 PC 机下载 S 记录格式文件到 MC68HC908GP32 的 FLASH 中。 用户在键入 “L” 命令后,可以使用终端仿真程序下载编译好的 S 记录格式文件。关于使用 PROCOMM 软件 下载文件的方法,请参看附录中 PROCOMM 的使用说明。在文件下载过程中,监控程序会 实时显示接收到的内容,并在下载结束后显示操作是否成功。需要注意的是,用户编写的源 程序必须满足本系统的要求,详见本书第 7 部分“MC68HC908GP32IDK 软件编程”。而且 在用户程序编译生成 S 记录格式文件后,并不能直接用于下载,需要使用本系统提供的 CHS19 程序进行格式调整,详见附录 A 之“编程范例”。范例:&LSBCCAFC0000FFFF000074SEA63DB71F3F366EEB0396EFF3A1A361 63614FA SC Successfully writing FLASH memory. &5.3.9 M――修改存储区内容命令说明:该命令用于修改 MC68HC908GP32 的存储区内容,包括寄存器区($F)、 RAM($F)和 FLASH($8000-$DFFF)等。在键入命令时,用户需要同时输入要 修改的存储区字节的地址 (4 位 16 进制数) 服务例程会自动显示该字节存储的 16 进制值, 。 并用“.”提示用户输入。用户可以输入新的 16 进制值,例程会自动将新值写入,并显示该 字节最终的存储内容,同时显示下一字节内容以供查看或修改(如果用户在输入过程中使用 退格键,例程会忽略用户的输入,重新显示当前字节并提示用户输入);用户也可以直接键 入回车,例程会略过当前字节而继续显示下一字节内容;或是键入“.”,终止此次修改命 令。如果用户输入的地址不存在于可修改的存储区内,则服务例程提示用户输入有误。范例:&M F000 Address Invalid (Not in RAM or FLASH) &M 00 &Backspace& 9B.11 11- 29 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!
& CC.&CR& 81..5.3.10 R――显示各寄存器内容说明:该命令用于显示累加器 A、变址寄存器(H 和 X)、条件码寄存器(CCR)、程序计 数器(PC)和堆栈寄存器(SP)的内容。范例:&R A=04 H:X=023F PC=8004 CC=68 SP=023A &5.4 基于监控程序的软件编程 5.4.1 概述实验系统为用户提供了功能强大的在线编程调试环境,用户可以将自己编写的代码在 编译后直接下载到 MC68HC908GP32 的 FLASH 中进行 100%的实时在线调试。为了发挥监 控程序的最大作用,用户需要按本系统的要求进行编程,包括程序代码和变量的地址分配, 中断向量表的填写等等。5.4.2 程序代码和变量地址分配在本系统中,MC68HC908GP32 的部分 RAM 和 FLASH 被监控程序所占用,为了避免 与用户程序冲突,系统重新定义了 MC68HC908GP32 的寻址空间,如图 5-1 所示。- 30 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!图 5-1MC68HC908GP32IDK 寻址空间分配MC68HC908GP32IDK 用户中断向量如表 5-2 所示。 表 5-2 MC68HC908GP32IDK 用户中断向量表 优先级 最低 向量名 IF16 IF15 IF14 IF13 IF12 IF11 IF10 IF9 IF8 IF7 地址 $DFDC $DFDD $DFDE $DFDF $DFE0 $DFE1 $DFE2 $DFE3 $DFE4 $DFE5 $DFE6 $DFE7 $DFE8 $DFE9 $DFEA $DFEB $DFEC $DFED $DFEE 描述 时基(高) 时基(低) ADC 转换结束(高) ADC 转换结束(低) 键盘(高) 键盘(低) SCI 发送(高) SCI 发送(低) SCI 接收(高) SCI 接收(低) SCI 出错(高) SCI 出错(低) SPI 发送(高) SPI 发送(低) SPI 接收(高) SPI 接收(低) 时钟 2 溢出(高) 时钟 2 溢出(低) 时钟 2 通道 1(高)- 31 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!$DFEF IF6 IF5 IF4 IF3 IF2 IF1 ― $DFF0 $DFF1 $DFF2 $DFF3 $DFF4 $DFF5 $DFF6 $DFF7 $DFF8 $DFF9 $DFFA $DFFB $DFFC $DFFD $DFFE $DFFF时钟 2 通道 1(低) 时钟 2 通道 0(高) 时钟 2 通道 0(低) 时钟 1 溢出(高) 时钟 1 溢出(低) 时钟 1 通道 1(高) 时钟 1 通道 1(低) 时钟 1 通道 0(高) 时钟 1 通道 0(低) 锁相环 PLL(高) 锁相环 PLL(低) 外中断 IRQ(高) 外中断 IRQ(低) 软中断 SWI(高) 软中断 SWI(低) 复位(高) 复位(低)―最高 用户在编写用户程序时, 需要将变量放在 RAM 区: $0090―$011F, 程序代码放在$8000 ― $DFDB 区 域 内 , 中 断 向 量 填 写 在 $DFDC ― $DFFF 的 中 断 向 量 表 内 。 修 改 部 分 在 CodeWarrior IDE 的 Progect.prm 文件中。如图:- 32 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!需要改动的地方: RAM = READ_WRITE 0x0090 TO 0x011F; ROM = READ_ONLY 0x8000 TO 0xDFDB; VECTOR ADDRESS 0XDFFE _Startup /* Reset vector: this is the default entry point for an application. */5.4.3 程序初始化状态除 了 MC68HC908GP32 的 内 存 分 配 以 外 , 用 户 还 要 注 意 的 就 是 监 控 程 序 对 MC68HC908GP32 做的初始化操作。在用户程序开始运行之前,监控程序已经对部分寄存器 进行了设置。用户需要了解这些设置,以免在程序调试过程中出现意想不到的情况。 监控程序初始化时对寄存器的设置情况如表 5-3 所示。 表 5-3 监控程序初始化时对寄存器的设置值 地址 $001E $001F $ $ $003A $ 寄存器名 CONFIG1 CONFIG2 PCTL PBWC PMSH PMSL PMRS SCCR1 SCCR2 设置值(十六进制) 01 3D 71 E0 01 2C 80 40 0C- 33 -描述 属性设置锁相环(产生 2.4576MHz 内部总线 时钟) SCI(允许 9600bps 双向传输速率) 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!$0019 $FE00 $FE03 $FE0BBAUD SBSR SBFCR BRKSCR02 10 80 00 断点中断表中未列出的寄存器在监控程序初始化时没有使用,仍保持 MCU 复位后的状态。5.4.4 调试、发行用户自己的程序如果用户希望自己的程序能脱离监控程序的控制而自由运行,可以依照本节介绍的两 个步骤,逐步实现用户程序在目标系统的独立运行。 第一步:使用户复位向量($DFFE―$DFFF)为非空(不为$FFFF),这时监控程序会 在 MCU 复位后等待用户从 PC 机发来的键盘命令。如果用户在五秒内没有任何键盘动作, 监控程序会放弃对 MCU 的控制,跳转到用户程序的复位向量处开始运行用户程序。在这种 情况下,监控程序与用户程序并存于 MC68HC908GP32 芯片中,监控程序做完初始化工作 后,就会将 MC68HC908GP32 芯片控制权完全交给用户程序。 如果用户希望在用户程序的运行过程中能返回监控程序,可以使用跳转语句(JMP)返 回到监控程序的入口地址。该入口地址储存在$DFDA―$DFDB。 第二步:当用户程序经过第一步,被确认程序功能完全正常以后,用户可以按照如下 过程将用户程序写入一片空的 MC68HC908GP32 中。实现这一步,需要做以下工作: 1. 将监控程序所做的初始化代码添加在用户程序入口处。用户可以在系统配套软盘 “GP32IDK”中找到这些代码(initial.asm)。对于熟练的开发人员,照搬监控程序的 初始化代码也许并不是最佳选择,用户完全可以根据自己的实际需要来编写初始化代 码。 2. 修 改 用 户 向 量 表 , 即 用 户 需 要 将 自 己 的 中 断 服 务 程 序 入 口 地 址 填 写 到 MC68HC908GP32 指定的中断向量表中去。(MC68HC908GP32 的中断向量表可以在 芯片手册中查到。)实现的方法很简单:在本系统中,用户实际上只需要将用户向量 表的地址加上$2000,便可以得到芯片的向量表地址。例如,用户复位向量在$DFFE― $DFFF,而芯片的复位向量在$FFFE―$FFFF。 完成上述步骤,用户程序就可以完全脱离监控程序而存在了。此时,用户可以使用专 用写入器将修改后的程序写入到一片新的 MC68HC908GP32 芯片中,再将芯片插入目标系 统,用户程序就可以脱离监控程序而自由运行了。- 34 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!第六章08 基本实验注意:以下实验都是在监控程序下运行,用户在编写程序的 时候请注意将 progect.prm 文件中 (C 语言开发时)的对用 RAM、ROM、中断向量地址更改为监控程序对应下的地址。 实验一 基本 I/O 编程实验一、实验目的 熟悉从工程建立到程序模拟运行的整个过程。 掌握最基本的调试手段, 学会利用程 序给出的调试信息来修改程序中出现的错误(error)和警告(warning)。 二、实验任务 1.用 CodeWarrior 新建一个 ASM 工程; 2.编译连接生成*.s19 文件,察看和分析项目中的全部文件; 3.通过运用 CodeWarrior 的模拟功能对该程序进行模拟仿真调试,观察实验现象。 三、实验要求 1.如何用 CodeWarrior 建立一个 ASM 工程? 2.程序的起始地址?各条指令的地址?s19 文件的格式? 3.如何使用模拟功能对该程序进行模拟仿真调试,实时仿真器有什么作用。 注意:本程序由于是在监控程序下运行的,所以在编写程序的时候请用户注意必要的几点: 1、 由于监控程序占用了 MCU 的 RAM 空间中的 0xF,所以要避开这一段 RAM, 这本监控程序下,用户可用的 RAM 要从 0xF。 2、 由于监控程序占用了 MCU 的 ROM 空间的 0xE000-0xFDFF,所以用户可用 ROM 只能从 0x8000 开始到 0xDFFF。 3、 中断向量的位置也被监控程序占用了,所以也被搬到了用户 ROM 空间的 0xDFDC-0xDFFF。 4、 堆栈和时钟都由监控程序提供,所以用户不需要再去设置这两个地方。 四、参考程序 ;********************************************************** ;** 版权: 飞信电子工作室 ;** 文件名: main.** 版本: v1.0 ;** 工作环境: CodeWarrior v6.2 ;** 作者: 陈万尧 ;** 生成日期:
;** 功能: 基本 IO 实验 ;** 相关文件: 电路图参考另一文件 ;** 修改日志: ;注意:在使用本程序的时候:请将实验板上的 PTA.1 接指示灯- 35 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!; 程序描述:指示灯 PTA.1 闪烁 ; 目的:IO 程序实验及延时子程序调用 ; 说明:提供简单 IO 实验程序及延时程序,供教学入门使用 ; 如果延时不够长的话,会发觉灯不会闪烁,而是一直亮 ; 这是由于人的视觉的引起的。 ;*****************头文件*****************************************/ ; Include derivative-specific definitions INCLUDE 'derivative.inc' RAMstartAddr equ $0090 ;RAM 的起始地址(因芯片不同可以更改) FlashStartAddr equ $8000 ;程序开始地址(因芯片不同可以更改) ;*------数据区定义(变量名定义)---------------* org RAMstartARAM 的起始地址 ;*-------------------主程序-------------------* org FlashStartA程序起始地址 MainInit: ;复位后程序从此开始执行 ;系统初始化 SEI ;禁止所有中断 ;I/O 初始化 BSET 1,DDRA ;设置 PTA.1 为输出 BSET 1,PTA ;初始时,PTA.1 指示灯&暗& MainLoop: ;程序总循环入口 BCLR 1,PTA ;PTA.1 指示灯&亮& LDA #$5 ;#$5 为延时子程序 DelaySub 的时间长度参数 ;若要改变闪烁的快慢,可以修改此参数 JSR DelayS调用延时子程序 BSET 1,PTA ;初始时,PTA.1 指示灯&暗& LDA #$5 ;延时子程序 DelaySub 的时间长度参数 JSR DelayS调用延时子程序 ;*----------------------------------------------* JMP MainL转总循环入口处 ;*----------以下为子程序存放处--------------------* ;*--------程序延时子程序(DelaySub)----------------* ;*功能:程序方法延时,延时长短由入口 A 中的数值决定 * ;*入口:A=延时长度 * ;*注:最小延时 0.1 秒,最大延时 A=$FF ,255*0.1=25.5 秒 * ;*占用 CPU 内寄存器:HX,A * ;*------------------------------------------------* DelaySub: ;延时 0.1 秒 PSHH ;保据寄存器 HX PSHX DelaySub1: LDHX #$FFFF DelaySub2: PSHA ;保护寄存器 A LDA #$FF DelaySub3: DBNZA DelaySub3 PULA DBNZX DelaySub2 DBNZA DelaySub1 PULX PULH RTS- 36 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!;*--------------以下为中断矢量-------------------* ORG $DFFE ;复位矢量 DS.W MainInit如果用户不采用在监控程序下运行程序, 就必须按照 MCU 自身定义的存储空间 去定义程序的运行地址和下载地址,以及程序的堆栈和时钟、中断等,另外, 当用户下载好程序之后,应该将编程接口断开,程序才能运行。; Include derivative-specific definitions INCLUDE 'derivative.inc' RAMstartAddr equ $0040 ;RAM 的起始地址(因芯片不同可以更改) FlashStartAddr equ $8000 ;程序开始地址(因芯片不同可以更改) ;*------数据区定义(变量名定义)---------------* org RAMstartARAM 的起始地址 ;*-------------------主程序-------------------* org FlashStartA程序起始地址 MainInit: ;复位后程序从此开始执行 ;系统初始化 SEI ;禁止所有中断 LDHX #$023F ;堆栈初始化,放入 GP32 的 RAM 最高端 TXS ;将#$023F 放入堆栈寄存器 SP JSR Init0 ;调系统初始化子程序 Init0,初始学习时跳过此处 ;I/O 初始化 BSET 1,DDRA ;设置 PTA.1 为输出 BSET 1,PTA ;初始时,PTA.1 指示灯&暗& MainLoop: ;程序总循环入口 BCLR 1,PTA ;PTA.1 指示灯&亮& LDA #$5 ;#$5 为延时子程序 DelaySub 的时间长度参数 ;若要改变闪烁的快慢,可以修改此参数 JSR DelayS调用延时子程序 BSET 1,PTA ;初始时,PTA.1 指示灯&暗& LDA #$5 ;延时子程序 DelaySub 的时间长度参数 JSR DelayS调用延时子程序 ;*----------------------------------------------* JMP MainL转总循环入口处 ;*----------以下为子程序存放处--------------------* ;*--------程序延时子程序(DelaySub)----------------* ;*功能:程序方法延时,延时长短由入口 A 中的数值决定 * ;*入口:A=延时长度 * ;*注:最小延时 0.1 秒,最大延时 A=$FF ,255*0.1=25.5 秒 * ;*占用 CPU 内寄存器:HX,A * ;*------------------------------------------------* DelaySub: ;延时 0.1 秒 PSHH ;保据寄存器 HX PSHX DelaySub1: LDHX #$FFFF DelaySub2: PSHA ;保护寄存器 A LDA #$FF- 37 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!DelaySub3: DBNZA DelaySub3 PULA DBNZX DelaySub2 DBNZA DelaySub1 PULX PULH RTS ;*--------系统初始化子程序(Init0)-----------------* ;*功能:系统初始化 * ;*入口:无 * ;*出口: * ;*占用 CPU 内寄存器:A * ;*------------------------------------------------* Init0: ;系统初始化 Init0 子程序 PSHA ;[A 进栈](保护寄存器 A) ;初始化 CONFIG2 LDA #% ; ||_SCIBDSRC=1 内部总线时钟用作 SCI 时钟 ; |__OSCSTOPENB=0 在 stop 模式下禁止 ; 振荡器工作 STA CONFIG2 ;初始化 CONFIG1 LDA #% ;||||||||_COPD=1 禁止 COP 模块 ;|||||||__STOP=0 禁止 STOP 指令 ;||||||___SSREC=1 32 个 CGMXCLK 周期退出 STOP 模式 ;|||||____LVI5OR3=1 LVI 工作在 5V ;||||_____LVIPWRD=1 禁止 LVI 模块电源 ;|||______LVIRSTD=1 允许 LVI 复位信号 ;||_______LVISTOP=0 在 stop 模式下禁止 LVI ;|________COPRS=0 COP 溢出范围使用长的时间 STA CONFIG1 ;[PLL 编程] CLR PCTL ;①禁止 PLL:清零 PLL 控制寄存器 PCTL MOV #$01,PCTL ;②将 P、E 写入 PTCL MOV #$01,PMSH ;③将 N 写入 PMSH、PMSL MOV #$2C,PMSL MOV #$80,PMRS ;④将 L 写入 PMRS MOV #$01,PMDS ;⑤将 R 写入 PMDS BSET 5,PCTL ;⑥置 PTCL.PLLON=1,启动 PLL 电路 BSET 7,PBWC ;⑦PBWC 自动带宽控制位=1 BSET 4,PCTL ;⑧PTCL.BCS=1 PULA ;[A 出栈](恢复寄存器 A) RTS ;*--------------以下为中断矢量-------------------* ORG $FFFE ;复位矢量 DS.W MainInit- 38 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!实验二SCI 串行口实验一、实验目的 1.掌握 GP32 单片机串行口的基本应用方法。 2.掌握 SCI 串行口相关寄存器的设定方法。 3.掌握用汇编语言编写嵌入式软件的方法。 4.实现 GP32 单片机与 PC 机之间串行通信的方法 二、实验任务及要求 由 PC 机通过串行口给单片机发送一个字符,然后将字符返回给超级终端并显示。 三、实验说明 为了实现 PC 机与单片机的通信,首先要对与 SCI 相关的寄存器进行初始化。 以下是 SCI 通信涉及到的寄存器。 (1) SCI 比特率寄存器(SCI Baud Rate Register, SCBR) SCI 比特率寄存器 SCBR 的作用是设置串行通信的比特率。通常情况下,选择内部总线时钟 为串行通信的时钟源, 此时利用 SCBR 对总线频率 fBUS 可以进行分频得到串行通行的比特率。 SCBR 的地址是$0019,定义为 数据位 定义 复位 D7 x 0 D6 x 0 D5 SCP1 0 D4 SCP2 0 D3 x 0 D2 SCR2 0 D1 SCR1 0 D0 SCR0 0Bt=fBUS/(64*PD*BD) (2) SCI 控制寄存器 1(SCI Congtrol Register 1,SCC1) SCI 控制寄存器共有 3 个,分别称为 SCC1、SCC2、SCC3。对他们进行写入操作,实现对 SCI 的设置。带有下划线的位,为初学时必须掌握的位。SCC1 的地址是$0013,定义为 数据位 定义 复位 D7 LOOPS 0 D6 ENSCI 0 D5 TXINV 0 D4 M 0 D3 WAKE 0 D2 ILTY 0 D1 PEN 0 D0 PTY 0D7-LOOPS 循环选择位(LOOP MODE SELECT BIT) ,LOOP=1,循环模式;LOOP=0,正 常模式。循环模式下接收引脚 RxD 与 SCI 内部断开,内部发送数据直接作为接收的输入,用 于自测。 D6--ENSCI 位,SCI 允许位(ENABLE SCI BIT) 。ENSCI=1,允许 SCI,这意味着 PTE0/TXD,PTE1/RXD 两个引脚作为串行通信引脚使用,而不作为普通 I/O 引脚使用。否则若 设 ENSCI=0,则禁止 SCI, PTE0/TXD,PTE1/RXD 两个引脚作为普通 I/O 引脚使用。 D5--TXINV 位发送反向标志位, (Transmit Inversion Bit) 。TXINV=1,发送输出 反码;TXINV=0,输出为正常码。 D4--M 位,模式-字符长度选择位(MODE―Character lentch BIT) 。定义收发数据 格式,M=1,9 位字符,M=0,8 位字符; D3-- WAKE 位,唤醒条件位(WAKEUP CONDITION BIT) 。WAKE=1,地址唤醒;WAKE=0, 空闲位唤醒。 D2--LITY 位,空闲线类型位(IDLE LINE TYPE BIT)决定 SCI 何时开计数“空闲 字符”的位数。ILTY=1,空闲字符位从“停止位”开始计数;ILTY=0,空闲字符位从“开始 位”计数。 D1--PEN 位,奇偶校验允许位(PARITY ENANLE BIT) 。PEN==1,允许进行奇偶校验。- 39 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!PEN=0,不进行奇偶校验。 D0--PTY 位。奇偶校验选择位(PARITY BIT) 。PTY=1 进行奇校验;PTY=0,进行偶 校验。不进行奇偶校验时此位为 0. (3) SCI 控制寄存器 2(SCI Congtrol Register 2,SCC2) SCC2 的地址是$0014 数据位 定义 复位 D7 SCTIE 0 D6 TCIE 0 D5 SCRIE 0 D4 ILIE 0 D3 TE 0 D2 RE 0 D1 RWU 0 D0 SBK 0D7--SCTIE 位,发送中断允许位(SCI transmit interrupt enble bit),SCTIE=1. 允许产生发送中断请求,反之不允许。 D6--TCIE 位,发送中断完成中断允许位( Transmissi Complete Interrupt Enable bit).TCIE=1.允许发送完成中断,反之不允许。 D5--SCRIE,接受中断允许位(SCI RECEive interrupt enble bit).SCRIE=1.允 许接收中断请求。反之不允许, D4--ILIE,空闲中断允许位(IDLE line interrupt enable bit) 。ILIE=1,允许 中断空闲请求,反之不允许。 D3--TE,发送器允许位(TRANSMITTER ENABLE BIT).TE=1 允许发送器发送,反之 不允许发送。 D2--RE 位,接收器允许位(RECEIVER ENABLE BIT),RE=1,允许接收器接收,反 之不允许接收。 D1--RWU 位,接收器唤醒位(RECEIVER WAKEUP BIT) 。RWU=1,等待状态,RWU=0, 正常状态。 D0--SBK 位,发送终止位(SEND BREAK BIT),SBK=1,发送终止字符(逻辑 1) , SBK=0, 发送非终止字符。 (4) SCI 控制寄存器 3(SCI Congtrol Register 3,SCC3) SCC3 的地址是$0015 数据位 定义 复位 D7 R8 0 D6 T8 0 D5 DMARE 0 D4 DMATE 0 D3 ORIE 0 D2 NEIE 0 D1 FEIE 0 D0 PEIE 0D7--R8 位,接收位 8(RECEIVED BIT 8).该位只读。 D6--T8 位,发送位 8(transmitted bit 8). D5--DMATE 位,DMA 接收允许位(DMA RECEIVE ENABLE BIT) D4--DMA 发送允许位(DMA TRANSFER ENABLE BIT). D3--ORIE 位,接收器溢出中断允许位(receiver overrun interrupt enable bit) ORIE=1 允许接收器溢出中断,反之不允许。 D2--NEIE 位,接收器噪声错误中断允许位(RECEIVE NOISE ERROR INTERTUPT ENABLE BIT) 。NEIE=1,允许接收器噪声错误中断,反之不允许。 D1--FEIE 位,接收器帧错误中断允许位(RECEIVER FRAMING ERROR INTERRUPT ENABKE BIT).FEIE=1.允许接收器帧错误中断,反之不允许。 D0-- PEIE 位, 接收器奇偶错误中断允许位 (RECEIVER PARITY ERROR INTERRUPT ENABLE BIT).PEIE=1,允许接收奇偶错误中断,反之不允许。 (5) SCI 状态寄存器 1(SCI Status Register 1,SCS1) SCI 状态寄存器共有 2 个,分别是 SCS1、SCS2。对他们进行读操作,可以得到当前 SCI 的- 40 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!状态。SCS1 为制度寄存器,地址是$0016,定义为 数据位 定义 复位 D7 SCTE 1 D6 TC 1 D5 SCRF 0 D4 IDLE 0 D3 OR 0 D2 NF 0 D1 PE 0 D0 PE 0D7--SCTE 位,发送缓冲区空标志位(SCI TRANSMITTER EMPTY BIT) 该位位 1 时表明 发送数据已经移入发送移位寄存器,可以发送一个新的数据。 D6--TC 位,发送完成标志位, (TRANSMISSION COMPLETE BIT)该位为 1 时表明发送 已经完成,该位为 0 时表明正在发送。 D5-- SCRF 位,接收器满标志位, (SCI RECEIVER FULL BIT).该位为 1 表明接收器 已满,可以从数据寄存器 SCDR 中读取数据。 D4-- IDLE 位,接收器空闲标志位(RECEIVER FULL BIT)该位为 1 表明接收器处于 空闲状态。 D3--OR 位,接收器溢出标志位(RECEIVER OVERRUN BIT),该位为 1 表明接收器处 于溢出状态。 D2-- NF 位,接收器噪声标志位(RECEVER NOISE FLAG BIT),该位为 1 表明接收器 出现噪声错误。 D1--FE 位,接收器帧错误标志位(receiver framing error bit), 该位为 1 表 明接收器出现帧错误。 D0--PE 位,接收器奇偶错误标志位(RECEIVER PARITY ERROR BIT),该位为 1 表明 接收器出现奇偶校验错误。 (6) SCI 状态寄存器 2(SCI Status Register 2,SCS2) SCS2 为之读寄存器,地址是$0017,定义为 数据位 定义 复位 0 0 0 0 0 0 D7 D6 D5 D4 D3 D2 D1 BKF 0 D0 BPF 0D7―D2 未定义。 D1---BKF 位,终止码标志位(BREAK FLAG BIT),该位为 1 表示检测到终止码. D0--RPF 位,接收进行标志位(RECEPTION IN PROGRESS FLAG BIT), 该 位 为 1 表明正在接收。 (7)SCI 数据寄存器(SCI Data Refister,SCDR) SCDR 为 SCI 系统最常用的寄存器, 地址是$0018。 写入时, 为要发送的 8 位数据, 记作 T7~T0; 读出时,为接收的 8 位数据,记作 R7~T0。不受复位影响。 四、实验要求 1.参考相关资料, 明确 SCI 各个寄存器的作用, 思考如何将通讯设置波特率为 9600, 8 位数据位,无奇偶校验位? 2.了解 SCI 中断方式和 SCI 查询方式的区别。 3.重点掌握 SCI 的编程,同时学习编程的规范。 五、参考程序 ① 以查询方式进行串行通信: 注意:在使用本程序的时候:请将实验板上的 JP0 用跳线帽短接上, ; 使用串口线将 PC 机与实验板的串口连接,本程序利用查询方式 ; 把收到的数据发送回去,并用 PC 显示 ;初步掌握利用查询方式 ; 进行串行通信的基本知识- 41 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!; Include derivative-specific definitions INCLUDE 'derivative.inc' ; ; XDEF _Startup ABSENTRY _S ; variable/ ORG RAMS Insert your data definition here SerialBuff DS.B 1 ;数据存储单元 ; ; ORG _Startup: LDHX TXS CLI #RAMEnd+1 ; initializ复位后程序从此开始执行 ROMStartMainInit: ;[系统初始化] SEI LDHX #$023F TXS JSR GP32I[串行口初始化] JSR SCII[程序总循环入口] MainLoop: ;[等待接收 1 个数据] LDA #1 LDHX #SerialBuff JSR SCIReN BCS MainL[发送接到的数据] LDA #1 LDHX #SerialBuff JSR SCISendN BRA MainL*[外部子程序存放处];堆栈初始化 ;调系统初始化子程序 GP32Init;未收到数据,继续等待- 42 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!;*------------------------------------------------------* ;*[系统初始化子程序(GP32Init)] * ;*功能:系统初始化设置:设置 CONFIG1 和 CONFIG2 寄存器 * ;* CGM 的寄存器设置:由外部晶振 f=32.768KHz,产生内部 * ;* 总线时钟 2.4576MHz * ;*入口:无 * ;*出口:无 * ;*------------------------------------------------------* GP32Init: PSHA ;[A 进栈](保护寄存器 A) ;初始化 CONFIG2 LDA #% ; ||_SCIBDSRC=1 内部总线时钟用作 SCI 时钟 ; |__OSCSTOPENB=0 在 stop 模式下禁止 ; 振荡器工作 STA CONFIG2 ;初始化 CONFIG1 LDA #% ;||||||||_COPD=1 禁止 COP 模块 ;|||||||__STOP=0 禁止 STOP 指令 ;||||||___SSREC=1 32 个 CGMXCLK 周期退出 STOP 模式 ;|||||____LVI5OR3=1 LVI 工作在 5V ;||||_____LVIPWRD=1 禁止 LVI 模块电源 ;|||______LVIRSTD=1 允许 LVI 复位信号 ;||_______LVISTOP=0 在 stop 模式下禁止 LVI ;|________COPRS=0 COP 溢出范围使用长的时间 STA CONFIG1 ;[PLL 编程] CLR PCTL ;①禁止 PLL:清零 PLL 控制寄存器 PCTL MOV #$01,PCTL ;②将 P、E 写入 PTCL MOV #$01,PMSH ;③将 N 写入 PMSH、PMSL MOV #$2C,PMSL MOV #$80,PMRS ;④将 L 写入 PMRS MOV #$01,PMDS ;⑤将 R 写入 PMDS BSET 5,PCTL ;⑥置 PTCL.PLLON=1,启动 PLL 电路 BSET 7,PBWC ;⑦PBWC 自动带宽控制位=1 BSET 4,PCTL ;⑧PTCL.BCS=1 PULA ;[A 出栈](恢复寄存器 A) RTS;*------------------------------------------------------* ;*文件描述:本文件包含了串行通信子程序,分别为:*- 43 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!;*(1)SCISend1:串行发送 A 中的 1 个字节 * ;*(2)SCISendN:串行发送 N 个字节 * ;*(3)SCIRe1:串行接收一个字节-&A * ;*(4)SCIReN:串行接收 N 个字节 * ;*------------------------------------------------------* ;*[寄存器及相关位定义] ReSendStatusR EQU SCS1 ;SCI 状态寄存器 1 ReTestBit EQU 5 ;接收缓冲区满标志位 SendTestBit EQU 7 ;发送缓冲区空标志位 ReSendDataR EQU SCDR ;SCI 数据寄存器 ;*SCISend1:串行发送 A 中的 1 个字节-------------------------* ;*功能描述:串行口发送 A 中的 1 个字节数据 * ;*入 口:A=待发送的数据 * ;*出 口:无 * ;*堆栈深度:2 * ;*------------------------------------------------------* SCISend1: BRCLR SendTestBit,ReSendStatusR,SCISend1 STA ReSendDataR RTS ;*SCISendN:串行发送 N 个字节------------------------------* ;*功能描述:串行发送以 HX 为首地址的 N 个字节数据 * ;*入 口:A=字节个数 HX=首地址 * ;*出 口:无 * ;*堆栈深度:2+2+1=5 * ;*------------------------------------------------------* SCISendN: ;在堆栈区开辟 1 个字节作临时变量 N AIS #-1 ;若发送字节数为 0,退出 STA 1,SP CMP #0 BEQ SCISendN_EXIT SCISendN_1: LDA ,X ;从存储器中取出待发送的数据 JSR SCISend1 AIX #1 DBNZ 1,SP,SCISendN_1 ;(N-1)不等于 0 转 SCISendN_EXIT: ;释放 1 个字节临时变量 AIS #1 RTS ;*SCIRe1:串行接收一个字节-&A----------------------------* ;*功能描述:(1) 串行接收 1 个字节的数据放在 A 中 *- 44 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!;* (2) 约 655350 时钟周期内收不到数返回 * ;* 若时钟周期=0.4us 大约等待 2.6S * ;*入 口:无 * ;*出 口:A=接收的数据 C=是否收到数据标志 0 收到 1 未收到* ;*堆栈深度:2+2=4 * ;*------------------------------------------------------* SCIRe1: PSHH PSHX ;等待接收一个字节数据 LDHX #$FFFF ;循环次数 SCIRe1_1: BRCLR ReTestBit,ReSendStatusR,SCIRe1_2 ;无数据,转 LDA ReSendDataR ;收到的数据放入 A 中 CLC ;C=0 BRA SCIRe1_3 ;收到数据,退出 SCIRe1_2: NOP AIX #-$1 CPHX #$0000 BNE SCIRe1_1 ;等待时间到,未收到数据,令 c=1,A=FF,返回 LDA #$FF SEC ;C=1 SCIRe1_3: PULX PULH RTS ;*SCIReN:串行接收 N 个字节--------------------------------* ;*功能描述:串行接收 N 个字节放在以 HX 为首地址的内存中 * ;*入 口:A=待接收数据的字节数 N,HX=接收数据存放的首地址* ;*出 口:C=是否收到数据标志 0 收到 1 未收到 * ;*堆栈深度:2+4+1=7 * ;*内部调用:SCIRe1 * ;*------------------------------------------------------* SCIReN: ;在堆栈区开辟 1 个字节作临时变量 AIS #-1 ;若接受字节数为 0,退出 STA 1,SP CMP #0 BEQ SCIReN_EXIT SCIReN_1: JSR SCIRe1 ;调用接收 1 个字节的子程序- 45 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!BCS SCIReN_EXIT ;C=1 未收到数据,退出 STA ,X ;收到数据,放入内存 AIX #1 ;HX+1-&HX DBNZ 1,SP,SCIReN_1 SCIReN_EXIT: ;释放 1 个字节临时变量 AIS #1 RTS;*SCIInit.asm:串行口初始化子程序-----------------------* ;*功 能:对串行口进行初始化,允许 SCI,正常码输出,8 位数据, * ;* 无校验等,允许发送器允许接收器。查询方式收发, * ;* 波特率为 9600(设 fBUS=2.4576MHz) * ;*入 口:无 * ;*出 口:无 * ;*-----------------------------------------------------* SCIInit: PSHA ;总线频率 fBUS=2.4576MHz,定义波特率 Bt=9600 LDA #% STA SCBR ;设置允许 SCI,正常码输出、8 位数据、无校验 LDA #% STA SCC1 ;设置允许发送、允许接收,查询方式收发 LDA #% STA SCC2 PULA RTS;*-----------中断向量--------------------------------* ORG $DFFE ;复位矢量 DS.W MainInit②以中断方式进行串行通信 ;注意:在使用本程序的时候:请将实验板上的 JP0 用跳线帽短接上, ; 使用串口线将 PC 机与实验板的串口连接,本程序利用中断方式 ; 把收到的数据发送回去,并用 PC 显示,初步掌握利用中断方式进 ; 行串行通信的基本知识 ;*****************头文件*****************************************/ ; Include derivative-specific definitions- 46 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!INCLUDE 'derivative.inc' ; ; XDEF _Startup ABSENTRY _S ; variable/ ORG RAMS Insert your data definition here SerialBuff rmb 8 ;数据缓冲区 ; ; ORG _Startup: LDHX TXS CLI #RAMEnd+1 ; initializ复位后程序从此开始执行 ROMStartMainInit: ;[系统初始化] SEI LDHX #$023F TXS JSR GP32I[串行口初始化] JSR SCIInit BSET 5,SCC2 ;[开放总中断] CLI ;[程序总循环入口] MainLoop: NOP NOP ;*[接收中断子程序] SCIRecINT: SEI PSHH ;[接收 1 个数据];堆栈初始化 ;调系统初始化子程序 GP32Init;设置接收中断允许;关总中断- 47 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!JSR SCIRe1 ;[发送接到的数据] JSR SCISend1 PULH CLI BRA MainL*[以下为子程序存放处];开总中断注意:系统初始化子程序(GP32Init)、串行口初始化子程序(SCIInit)及串行通信子程序请 参考查询方式中的代码!! ! ;*------------------------------------------------------* ORG $DFE4 ;SCI 接收中断矢量 DS.W SCIRecINT ORG $DFFE ;复位矢量 DS.W MainInit实验三SPI 串行口实验一、实验目的 1.了解和掌握 SPI 的原理、以及 SPI 的编程和寄存器的使用方法。 二、实验任务 利用 SPI 实现开关控制串行通信、通过 LED 灯表示。掌握使用 C 语言编写代码,在监 控成和脱离监控程序两种方式的运行。 三、实验说明 为了实现 MCU 与外界联系,首先要对与 SPI 相关的寄存器进行初始化。 以下是 SPI 通信涉及到的寄存器。 (1) SPI 数据寄存器(SPI Data Refister,SPDR) SPDR 的地址是$0012。写入时,为要发送的 8 位数据,记作 T7~T0;读取时,为接收的 8 位数据,记作 R7~R0. (2)SPI 控制寄存器(SPI Control Refister,SPCR) 数据位 定义 复位 D7 SPRIE 0 D6 MDAS 0 D5 SPMSTR 0 D4 CPOL 0 D3 CPHA 1 D2 SPWOM 0 D1 SPE 0 D0 SPTIE 0D7--- SPRIE 位,SPI 接收中断允许位。SPRIE=1 时,允许 SPI 接收中断;SPRIE=0 时,不 允许接收中断。 D5--- SPMSTR 位,SPI 主机位。SPMSTR=1 时,为主机方式;SPMSTR=0 时,为从机方式。 D1--- SPE 位,SPI 允许位。SPE=1,允许 SPI; SPE=0,不允许 SPI。 D0--- SPTIE 位,SPI 发送中断允许位。SPTIE=1,允许发送中断;SPTIE=0,不允许发送中 断。 (3)SPI 状态和控制寄存器(SPI Status and Control Register,SPSCR)- 48 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!数据位 定义 复位D7 SPRF 0D6 ERRIE 0D5 OVRF 0D4 MODF 0D3 SPTE 1D2 MODFEN 0D1 SPR1 0D0 SPR0 0D7--- SPRF 位,SPI 接收器满标志位。 D1、D0--- SPR1、SPR0 位,SPI 比特率选择位。 四、实验要求 利用 SPI 实现 MCU 之间的数据传输、以及进行 MCU 的外设扩展。 注意:本程序由于是在监控程序下运行的,所以在编写程序的时候请用户注意必要的几点: 1、由于监控程序占用了 MCU 的 RAM 空间中的 0xF,所以要避开这一段 RAM, 这本监控程序下,用户可用的 RAM 要从 0xF。 2、由于监控程序占用了 MCU 的 ROM 空间的 0xE000-0xFDFF,所以用户可用 ROM 只能从 0x8000 开始到 0xDFFF。 3、中断向量的位置也被监控程序占用了,所以也被搬到了用户 ROM 空间的 0xDFDC-0xDFFF。 4、所以用户必须修改 Progect.prm 文件。 5、C 语言程序,在监控程序下运行的时候,程序的入口地址为 0x808C,所以运行的时候应 该将 PC 指针指向 0x808C 的位置。 堆栈和时钟都由监控程序提供,所以用户不需要再去设置这两个地方。 五、参考程序 //********************************************************** //注意:在使用本程序的时候:请将实验板上的 JP5 用跳线帽接上,再使 // 用 8 根杜邦线将 J8 和 JP4 连接,即采用 MCU 的 PTB 端口与 8 个 LED 灯连 // 接,JP4 有两排,接到与 LED 连接上的插针上,这样才是 PTB 口与 LED // 对应连起来。硬件连接完成之后,下载程序,通过改变拨线开关的 // 状态,可以观察到 LED 等的亮灭。 /*****************头文件*****************************************/ #include &hidef.h& /* for EnableInterrupts macro */ #include &derivative.h& /* include peripheral declarations */ void SPIInit(void); //SPI 初始化 void IO_INI(void); //端口初始化 /***************************SPI 初始化函数************************/ //函数:void SPIInit(void) //输入:无 //输出:无 //功能:SPI 初始化过程 /***************************SPI 初始化函数************************/ void SPIInit(void) { SPCR=0X3A; //CPOL=1,SPSCK 空闲时为高电平 //SPI 允许 SPSCR=0X03; //128 分频 SPDR=0X00; //清空 SPI 数据寄存器 } /***************************IO_INI 初始化函数************************/ //函数:void IO_INI(void)- 49 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!//输入:无 //输出:无 //功能:MCU 端口初始化过程,主要是对 SPI 口和 PTB 端口初始化(用于指示 LED 灯) /***************************IO_INI 初始化函数************************/ void IO_INI(void) { DDRD_DDRD0=1; ///SS DDRD_DDRD1=0; //MIOS DDRD_DDRD2=1; //MOSI DDRD_DDRD3=1; //SPSCK DDRB=0XFF; //定义 PTB 为输出 } /***************************主函数*********************************/ void main(void) { //变量,用于存放开关量输入的值 SPIInit(); IO_INI(); EnableI for(;;) { PTD_PTD0=0; //PTD_PTD0 先为低主要是为了 //将开关状态锁存到 165 内部的寄存器中 PTD_PTD0=1; //然后为高启动 SPI 接收模块 temp=SPDR; while((SPSCR&0X80)==0){//判断是否有新的数据到达 SPI 数据寄存器 } SPDR= PTB= //显示到达的数据 PTD_PTD0=0; //进行刷新数据 PTD_PTD0=1; } }以下程序时脱离监控程序时运行的程序,用户不要写该 Progect.prm 文件,除非 用户需要定义中断向量的时候,可以将中断向量定义这该文件中。但是,程序 要自立运行,用户就得自己配置时钟。本程序采用外部晶振 32.768K,总线频率 为 4MHz/*****************头文件*****************************************/ #include &hidef.h& /* for EnableInterrupts macro */ #include &derivative.h& /* include peripheral declarations */ void SPIInit(void); //SPI 初始化 void IO_INI(void); //端口初始化 void MCU_init(void); /*************************** MCU_init 初始化函数************************/ //函数:void MCU_init (void) //输入:无- 50 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!//输出:无 //功能:MCU_init 初始化过程,采用外部晶振 32.768K,总线时钟为 4MHz /*************************** MCU_init 初始化函数************************/ void MCU_init(void) { CONFIG1 = 0x11; CONFIG2 = 0x00; PCTL &= (unsigned char)~0x10; /* Select clock source from XTAL */ PCTL &= (unsigned char)~0x20; /* Disable the PLL */ PCTL = 0x01; /* Set VCO output Power-of-Two devider P=0 the VCO Power-of-Two multiplier E=1 */ PMS = 0x01E8; /* Set the Feedback divider N=488 */ PMRS = 0xD0; /* Set the VCO Linear multiplier L=208 */ PMDS = 0x01; /* Set the Reference clock devider R=1 */ PBWC = 0x80; /* Select the operating modes */ PCTL |= (unsigned char)0x20; /* Enable the PLL */ while(!PBWC_LOCK) { /* Wait */ } PCTL |= (unsigned char)0x10; /* Select clock source from PLL */ __asm(&nop&); __asm(&nop&); /* Common initialization of the CPU registers */ } /*MCU_init*/ /***************************SPI 初始化函数************************/ //函数:void SPIInit(void) //输入:无 //输出:无 //功能:SPI 初始化过程 /***************************SPI 初始化函数************************/ void SPIInit(void) { SPCR=0X3A; //CPOL=1,SPSCK 空闲时为高电平 //SPI 允许 SPSCR=0X03; //128 分频 SPDR=0X00; //清空 SPI 数据寄存器 } /***************************IO_INI 初始化函数************************/ //函数:void IO_INI(void) //输入:无 //输出:无 //功能:MCU 端口初始化过程,主要是对 SPI 口和 PTB 端口初始化(用于指示 LED 灯) /***************************IO_INI 初始化函数************************/ void IO_INI(void) {- 51 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!DDRD_DDRD0=1; DDRD_DDRD1=0; DDRD_DDRD2=1; DDRD_DDRD3=1; DDRB=0XFF;///SS //MIOS //MOSI //SPSCK //定义 PTB 为输出} /***************************主函数*********************************/ void main(void) { //变量,用于存放开关量输入的值 SPIInit(); IO_INI(); MCU_init();//MCU 时钟初始化 EnableI for(;;) { PTD_PTD0=0; //PTD_PTD0 先为低主要是为了 //将开关状态锁存到 165 内部的寄存器中 PTD_PTD0=1; //然后为高启动 SPI 接收模块 temp=SPDR; while((SPSCR&0X80)==0){//判断是否有新的数据到达 SPI 数据寄存器 } SPDR= PTB= //显示到达的数据 PTD_PTD0=0; //进行刷新数据 PTD_PTD0=1; } }实验四流水灯实验一、实验目的 1.了解和掌握串行输入并行输出的原理、 以及串行时序编程的使用。 了解和掌握 SPI 的原理、 以及 SPI 的编程和寄存器的使用方法。 二、实验任务 利用 74HCT595 通过模拟 SPI 和硬件 SPI 两种方式控制 LED 灯流水灯。 三、实验说明 了解 74HCT595 串入并出芯片的工作原理,以及它的编程时序,其为 SPI 接口。如下图 所示:74HCT595 芯片采用 MR 低电平选通,通过串行时序 SHCP 信号将 8 位二进制通过 DS 按位移入 74HCT595 寄存器,之后通过 STCP 时序将寄存器里的一个字节通过 Q0-Q7 输 出- 52 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!四、实验要求 利用串入并出数据传输、以及进行 MCU 的外设扩展。 五、参考程序 ①//********************************************************** //注意:在使用本程序的时候:请将实验板上的 JP4 采用跳线帽短接,本实验 // 采用模拟 SPI 接口的通讯方式和 74HCT595 实现流水灯。 /*****************头文件*****************************************/ #include &hidef.h& /* for EnableInterrupts macro */ #include &derivative.h& /* include peripheral declarations */ #define SHC PTD_PTD3 //移位时钟 #define STC PTD_PTD0 //移出时钟 #define DATA PTD_PTD2 //数据口 #define SHC_OUT DDRD_DDRD3 //指定方向 #define DATA_OUT DDRD_DDRD2 #define STC_OUT DDRD_DDRD0 #define SRCLK_LOW() SHC = 0 #define SRCLK_HIGH() SHC = 1 #define STCLK_LOW() STC = 0 #define STCLK_HIGH() STC = 1 void TxData(unsigned char Data); //数据发送函数 void Delay(unsigned int net); /******************************************************************/ //函数:void TxData(unsigned char Data) //输入:需要发送的数据 //输出:无 //功能:74HCT595 芯片发送函数 /******************************************************************/ void TxData(unsigned char Data)- 53 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!{ unsigned char state = 0x80; STCLK_LOW(); for(i=0;i&8;i++) { SRCLK_LOW(); if(Data&state){ DATA =1; } else { DATA =0; } SRCLK_HIGH(); Data&&=1; } STCLK_HIGH(); } void Delay(unsigned int net) { for(i=500;i&0;i--) for(j=j&0;j--); } //***********************main()函数********************************* void main(void) { buff = 0x01; STC_OUT = 1; SHC_OUT = 1; DATA_OUT = 1; EnableI /* enable interrupts */ /* include your code here */ for(;;) { for(i=0;i&8;i++) { TxData(buff); Delay(40); buff &&= 1; } buff = 0x01; } /* loop forever */ /* please make sure that you never leave main */ } ②//注意:在使用本程序的时候:请将实验板上的 JP4 采用跳线帽短接,本实验 // 采用硬件 SPI 接口的通讯方式和 74HCT595 实现流水灯。 /*****************头文件*****************************************/ #include &hidef.h& /* for EnableInterrupts macro */ #include &derivative.h& /* include peripheral declarations */ void SPIInit(void); //SPI 初始化 void IO_INI(void); //端口初始化 void Write_SPI(unsigned char data); void Delay(unsigned int net); /***************************SPI 初始化函数************************/ //函数:void SPIInit(void)- 54 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!//输入:无 //输出:无 //功能:SPI 初始化过程 /***************************SPI 初始化函数************************/ void SPIInit(void) { SPCR=0X3A; //CPOL=1,SPSCK 空闲时为高电平 //SPI 允许 SPSCR=0X03; //128 分频 SPDR=0X00; //清空 SPI 数据寄存器 } /***************************IO_INI 初始化函数************************/ //函数:void IO_INI(void) //输入:无 //输出:无 //功能:MCU 端口初始化过程,主要是对 SPI 口和 PTB 端口初始化(用于指示 LED 灯) /***************************IO_INI 初始化函数************************/ void IO_INI(void) { DDRD_DDRD0=1; ///SS //DDRD_DDRD1=0; //MIOS DDRD_DDRD2=1; //MOSI DDRD_DDRD3=1; //SPSCK DDRB=0XFF; //定义 PTB 为输出 } void Write_SPI(unsigned char data) { SPDR = while((SPSCR&0X08)==0){//判断是否有新的数据到达 SPI 数据寄存器 } } void Delay(unsigned int net) { for(i=500;i&0;i--) for(j=j&0;j--); } /***************************主函数*********************************/ void main(void) { //变量,用于存放开关量输入的值 temp= 0x01; SPIInit(); IO_INI(); EnableI for(;;) { PTD_PTD0=0; Write_SPI(temp);- 55 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!Delay(40); temp&&=1; if(temp&=0x80) temp = 0x01; PTD_PTD0=1; } }实验五Keyboard 实验一、实验目的 1、了解键盘结构,学习扫描法判断键盘的方法。 2、了解 8 个 I/O 设计更多的按键方法。 二、实验任务 在 实 验 板 上 设 计 并 连 接小 键 盘 接 口 的 连 线 , 识别 小 键 盘 上 按 下 的 各 键状 态 并 用 keyboard.exe 显示。 三、实验说明 参考如下的电路图图 12.1 4x4 行列式键盘原理图 PORTA 0―&3 接 Y1―&Y4; PORTA 4―&7 接 X1―&X4;可用 PORTB 接的八个发光二 极管作为按键状态指示灯(即哪个键按下) 。 (1)键盘状态和控制寄存器(Keyboard Status and Control Regisrer,INTKBSCR) INTKBSCR 包含了键盘中断标志、屏蔽键盘中断请求、定义键盘中断的触发方式、清除键 盘中断标志等功能。其地址是$001A 数据位 定义 复位 0 0 0 0 D7 D6 D5 D4 D3 KEYF 0 D2 ACKK 0 D1 IMASKK 0 D0 MODEK 0D7―D4,未用,读出均为 0.没有具体含义。 D3――KEY 位,(只读位),键盘(中断)标志位(Keyboard Flag Bit).KEYF=1,键盘中断已 产生,KEYF=0,未产生键盘中断。 D2――ACKK 位(只写位) ,键盘(中断)应答位(Keyboard Acknowledge Bit)写入 1,则 清除键盘中断请求。 D1――IMASKK 位,键盘中断屏蔽位(Keyboard Interrupt Mask Bit ) ,IMASKK=1,屏 蔽键盘中断请求,IMASKK=0.,开放键盘中断请求。- 56 - 为理想去奋斗,多远也不累,为爱好去努力,再苦也是乐!D0――MODEK 位,键盘中断引脚触发方式位(Keyboard Triggering Sensitivity Bit)。 MODEK=1,下降沿及低电平触发,MODEK=0,仅下降沿触发。 (2)键盘中断允许寄存器(Keyboard Interrupt Enable Regisrer,INTBIER) INTBIER 的各位决定所对应的引脚是否允许终端进入。地址为: $001B 数据位 定义 复位 D7 KBIE7 0 D6 KBIE6 0 D5 KBIE5 0 D4 KBIE4 0 D3 KBIE3 0 D2 KBIE2 0 D1 KBIE1 0 D0 KBIE0 0D7-D0,分别记为 KBIE7―KBIE0,可读写.若 KBIEx=1,表示相应引脚 KBIEx pin(也就是 引脚 PTAx pin)被定义位中断引入引脚,反之则不能作为中断输入引脚,复位时,全为 0。 (3)键盘中断编程相关问题。 要进行键盘中断方面的编程,下列问题也需要了解。 1.键盘中断矢量地址为$DFE0---$DFE1. 2.键盘中断初始化顺序,先设置键盘状态和控制寄存器(INTKBSCR),后设置键盘中断允许 寄存器(INTKBIER),旦设置了引脚 KBIEx pin 为键盘中断引入引脚,就默认了它为输入, 但先它之前通过 A 接口数据寄存器定义该引脚为输入且通过上拉电阻寄存器设置其上有上 拉电阻,再设置其为键盘中断引入引脚,则更可靠。 3.当定义 KBIEx pin 为键盘中断引入引脚时,由于内部上拉到逻辑 1 也许需要一些时间,可 能产生开始的键盘误中断,建议在键盘初始化时,按下列顺序工作: 令 IMASKK=1(屏蔽键盘中断) ,设置 KBIEx=1(定义中断引脚) ,写 ACKK=1(清除 键盘中断请求) ,令 IMASKK=0(开放键盘中断) 也可以通过 DDRA 定义 PTAx pin 为输出,写 1 到 PTAx(使得 PTAx pin 为高电平) , 设置 KBIEx=1(定义中断引脚) 4.注意在中断子程序中的入口和出口参数。 5.在 wait 和 stop 模式下,键盘中断仍可发生。 四、实验要求 1、掌握键盘中断使用方法,用扫描法读取键值、键值转为定义值的编程方法。 2、了解如何识别键盘上的按键、如何区分按键是被真正地按下还是抖动。 3、如何处理重建问题。 五、参考程序 main.c 程序 /*-------------------键盘实验--------------------------* *硬件连接:PTA.7-4 接键盘 4 根列线,PTA.3-0 接键盘 4 根行线 * *程序描述:按下键盘按键,串口发送对应的键值 * *目 的:键盘扫描,键盘中断,键值识别,键盘编码 * *注 意:如果键盘插在实验板上排插孔,无须连线,若插在下 * * 排插孔,需手工接线 * *-----------------------------------------------------*/ #include &hidef.h& /* for EnableInterrupts macro */ #include &derivative.h& /* include perip}

我要回帖

更多关于 kk按键怎么用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信