第七章 汇编语言程序设计_第1页
第七章 汇编语言程序设计_第2页
第七章 汇编语言程序设计_第3页
第七章 汇编语言程序设计_第4页
第七章 汇编语言程序设计_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七章汇编语言程序设计何宾2023.08设计实例一:LED驱动和控制

--硬件设计原理设计实例一:LED驱动和控制

--I/O端口寄存器在该设计中,使用了用于控制STC32G12K128单片机P4口和P6口的端口模式寄存器以及数据寄存器I/O端口寄存器

--端口模式寄存器在STC32G系列单片机中,为P0口、P1口、P2口、P3口、P4口、P5口、P6口和P7口提供了两个端口模式寄存器PxM0和PxM1(x为对应的端口号),用于为一组端口内不同的引脚设置不同的驱动方式,包括准双向、推挽输出、高阻输入和开漏输出I/O端口寄存器

--端口模式寄存器P6端口模式寄存器P6端口模式寄存器P6M0位于SFR地址为0xCC的位置,当复位后,该寄存器的内容为“00000000”P6端口模式寄存器P6M1位于SFR地址为0xCB的位置。当复位时,该寄存器的内容为“11111111”位索引76543210名字P67M0P66M0P65M0P64M0P63M0P62M0P61M0P60M0位索引76543210名字P67M1P66M1P65M1P64M1P63M1P62M1P61M1P60M1I/O端口寄存器

--端口模式寄存器寄存器P6M0和寄存器P6M1中,一对相同的位索引设置对应的引脚工作模式寄存器P6M0中的位索引0(P6M0.0)和寄存器P6M1中的位索引0(P6M1.0)共同设置P6端口内引脚0(P6.0)的工作模式寄存器P6M0中的位索引7(P6M0.7)和寄存器P6M1中的位索引7(P6M1.7)共同设置P6端口内引脚7(P6.7)的工作模式I/O端口寄存器

--端口模式寄存器PxM0.y和PxM1.y(x对应具体的端口号,y对应端口中的某个引脚编号)组合在一起的功能PxM1.yPxM0.yPx.y引脚工作模式00准双向01推挽输出10高阻输入11开漏输出I/O端口寄存器

--端口模式寄存器P4端口模式寄存器P4端口模式寄存器P4M0位于SFR地址为0xB4的位置。当复位后,该寄存器的内容为“00000000”

P4端口模式寄存器P4M1位于SFR地址为0xB3的位置。当复位时,该寄存器的内容为“11111111”位索引76543210名字P47M0P46M0P45M0P44M0P43M0P42M0P41M0P40M0位索引76543210名字P47M1P46M1P45M1P44M1P43M1P42M1P41M1P40M1I/O端口寄存器

--端口数据寄存器P6端口数据寄存器P6端口数据寄存器P6位于SFR地址为0xE8的位置。当复位时,该寄存器的内容为“11111111”当给对应的位写”0”时,输出逻辑“0“(低电平)到端口对应引脚(P6.y)的缓冲区;当给对应的位写”1“时,输出逻辑”1“(高电平)到端口对应引脚(P6.y)的缓冲区当读取该寄存器时,直接读取端口对应引脚(P6.y)上的电平位索引76543210名字P6.7P6.6P6.5P6.4P6.3P6.2P6.1P6.0I/O端口寄存器

--端口数据寄存器P4端口数据寄存器P4端口数据寄存器P4位于SFR地址为0xC0的位置。当复位时,该寄存器的内容为“11111111”

当给对应的位写”0”时,输出逻辑“0“(低电平)到端口对应引脚(P4.y)的缓冲区;当给对应的位写”1“时,输出逻辑”1“(高电平)到端口对应引脚(P4.y)的缓冲区当读取该寄存器时,直接读取端口对应引脚(P4.y)上的电平位索引76543210名字P4.7P4.6P4.5P4.4P4.3P4.2P4.1P4.0设计实例一:LED驱动和控制

建立新的设计工程本节将建立新的设计工程,主要步骤包括:打开KeilμVision5集成开发环境(以下简称Keil)在Keil主界面主菜单下,选择Project->NewμVisionProject...弹出CreateNewProject对话框界面。在该对话框界面中,按如下设置参数:将路径定位到\stc32_example\example_7_9在文件名右侧的文本框中输入top,该工程的名字为top.uvproj单击OK按钮设计实例一:LED驱动和控制

建立新的设计工程出现SelectDeviceforTarget‘Target1’...对话框界面。在该对话框的Device标签界面中,按如下设置参数:在下拉框中,选择STCMCUDatabase在左下角窗口中,单击STC前面的+。在展开项中,选中STC32G12K128Series条项单击OK按钮出现SelectDeviceforTarget’Target1’...对话框界面。在该界面中左侧的窗口中,找到并展开STC前面的“+”。在展开项中,找到并选择STC32G12K128单击OK按钮设计实例一:LED驱动和控制

建立新的设计工程在Keil主界面左侧的Project窗口中,找到并用鼠标右键单击Target1文件夹,出现浮动菜单。在浮动菜单内,选择OptionsforTarget‘Target1’...弹出OptionsforTarget‘Target1’对话框界面。在该界面中:单击Target标签。在该标签界面中,将MemoryModel设置为XSmall:nearvars,farconst,ptr-4单击Output标签。在该标签界面中,勾选CreateHEXFile前面的复选框单击OK按钮,退出OptionsforTarget‘Target1‘对话框界面设计实例一:LED驱动和控制

添加汇编语言文件本节将为当前工程添加新的汇编语言文件,主要步骤包括:在Keil主界面左侧的Project窗口中,找到并展开Target1文件夹。在展开项中,找到并选中SourceGroup1条项。单击鼠标右键,出现浮动菜单。在浮动菜单内,选择AddNewItemtoGroup‘SourceGroup1’选项出现AddNewItemtoGroup’SourceGroup1’对话框界面,按下面设置参数:在该界面左侧窗口中,选中AsmFile(.s)在Name右侧的文本框中输入main。该汇编语言文件的名字为main.asm设计实例一:LED驱动和控制

添加汇编语言文件单击Add按钮在Project窗口中,在SourceGroup1条目下添加了名字为main.asm的汇编语言文件在右侧窗口中,自动打开了名字为main.asm的汇编源文件P4M0DATA0xB4;声明P4M0寄存器的地址0xB4P4M1DATA0xB3;声明P4M1寄存器的地址0xB3P4DATA0xC0;声明P4寄存器的地址0xC0

P6M0DATA0xCC;声明P6M0寄存器地址0xCCP6M1DATA0xCB;声明P6M1寄存器地址0xCBP6DATA0xE8;声明P6寄存器地址0xE8设计实例一:LED驱动和控制

添加汇编语言文件CSEGAT0x0000;声明代码段的绝对地址在0x0000LJMPmain;跳转到入口main my_progSEGMENTCODE;声明代码段my_prog RSEGmy_prog;引用该段ORG0x200 ;强制到偏移地址0x200的位置main:;main入口 USING0;使用第0组寄存器R0~R7MOVP4M0,#0x00;P4M0设置为0x00MOVP4M1,#0x00;P4M1设置为0x00,P4端口准双向设计实例一:LED驱动和控制

添加汇编语言文件MOVP6M0,#0x00;P6M0设置为0x00MOVP6M1,#0x00 ;P6M1设置为0x00,P4端口准双向

MOVP4,#0x00;P4端口所有引脚设置为逻辑低电平 MOVA,#0xFE;累加器A初始值设置为0xFEMOVP6M0,#0x00;P6M0设置为0x00MOVP6M1,#0x00 ;P6M1设置为0x00,P4端口准双向

MOVP4,#0x00;P4端口所有引脚设置为逻辑低电平 MOVA,#0xFE;累加器A初始值设置为0xFE设计实例一:LED驱动和控制

添加汇编语言文件LOOP1: ;标号LOOP1 ACALLdelay;调用延迟子程序delay RLA;累加器A的内容循环左移MOVP6,A ;将累加器A的值加载到端口P6JMPlOOP1 ;无条件跳转到标号LOOP1的位置;********************************设计实例一:LED驱动和控制

--添加汇编语言文件;********延迟子程序***************delay:;标号delayMOVWR4,#0xFFFF;将初值0xFFFF加载到字寄存器WR4delay1:;标号delay1 SUB WR4,#1;(WR4)-1→(WR4) JNEdelay1 ;如果(WR4)≠0,跳转到delay1标号位置 RET;从delay子程序返回

END;标记该文件的结束保存设计代码设计实例一:LED驱动和控制

--设计汇编和链接本节将对设计进行汇编和链接,并生成HEX文件,主要步骤包括:在Keil主界面主菜单下,选择Project->Buildtarget,开始对设计进行建立的过程,在BuildOutput窗口输出的信息从图中可知,对该设计进行处理的过程包括汇编(assembling)和链接(linking)设计实例一:LED驱动和控制

--分析HEX文件本节将对生成的IntelHEX-80格式的top.hex文件进行分析,帮助读者掌握编程文件的一些关键信息在当前设计工程的\stc32_example\example_7_9\Objects目录中,找到并用写字板打开top.hex文件:03000000020203F6:1002030075B40075B30075CC0075CB0075C0007470:10021300FE511B23F5E880F97E24FFFF9E24000195:0302230078FA2244:00000001FF设计实例一:LED驱动和控制

--分析HEX文件在该文件中,每一行称为一个记录,每个记录都由16进制字符构成,两个字符表示一个字节的值IntelHEX文件通常由若干记录组成,每个记录的格式如下::llaaaattdd...ddcc其中:符号“:”:标识记录的开始。HEX文件中的每一行都以冒号“:”开头ll:标识记录的长度,即该记录的数据字节数aaaa:标识装入的地址。它是该记录中第一个数据字节的16位地址值,用来表示该记录在STC32G系列单片机程序存储器(Flash存储器)中的绝对地址设计实例一:LED驱动和控制

--分析HEX文件tt:标识记录的类型。当取值为“00“时,表示数据记录;当取值为”01“时,表示文件结束dd...dd:标识记录的实际字节数据值。每一个记录都由ll标识的字节个数的数据值构成cc:标识校验和。将它的值与记录中所有字节(包括记录长度字节)内容相加,其结果应该为0。如果为其他值,则表明该记录出现错误设计实例一:LED驱动和控制

--程序下载和运行本节将使用STC公司提供的STC32系列单片机硬件开发平台,并将HEX文件下载到硬件开发平台上STC32G12K128单片机中的程序存储器中。包括:启动STC-ISP(V6.90N)软件在芯片型号右侧的下拉框中选择STC32G12K128-Beta或STC32G12K128(具体取决于STC32G系列单片机硬件开发平台上所使用的芯片)通过USB电缆,将STC32G系列单片机硬件开发平台的USB接口和PC/笔记本电脑的USB接口连接到一起设计实例一:LED驱动和控制

--程序下载和运行单击STC-ISP(V6.90N)软件中的“打开程序文件“按钮,弹出”打开程序代码文件“对话框界面。在该界面中,按如下设置参数:将查找范围设置到\stc32_example\example_7_9\Objects目录下选中top.hex文件

单击“打开“按钮,退出”打开程序代码文件“对话框界面

此时先按住STC32G系列单片机硬件开发平台上标记为ON/OFF的按键,然后再按下硬件开发平台上标记为INT0的按键,按住大约10秒钟设计实例一:LED驱动和控制

--程序下载和运行先释放掉硬件开发平台上标记为ON/OFF的按键,然后再释放掉硬件开发平台上标记为INT0的按键此时在STC-ISP(V6.90N)软件的扫描串口标题右侧的下拉框中显示“STCUSBWriter(HID1)”条项,表明硬件开发平台已经准备好下载程序在STC-ISP(V6.90N)软件中,单击左下角的“下载/编程”按钮。此时将生成的top.hex文件下载到STC32G12K128单片机内的程序存储器中设计实例二:按键中断和LED控制

--程序下载和运行本节将在设计实例一的基础上,添加外部按键来触发中断,以控制8个LED灯上显示的图案当触发INT0中断时,LED灯向左循环移动一位;当触发INT1中断时,LED灯向右循环移动一位设计实例二:按键中断和LED控制

--硬件设计原理在STC提供的STC32G系列单片机硬件开发平台上,提供外部中断0和外部中断1的按键电路设计实例二:按键中断和LED控制

--复制并打开设计本节将设计实例一的所有设计代码复制到新的文件夹中,主要步骤包括:在\stc32_example目录下,新建一个名字为example_7_10的子目录将\stc32_example\example_7_9目录下的所有文件(包括文件夹)复制粘贴到新建的example_7_10子目录中启动KeilμVision5集成开发环境(以下简称Keil)在Keil中打开top.uvproj工程文件设计实例二:按键中断和LED控制

--修改汇编语言文件本节将修改汇编语言文件,将添加外部中断0和中断1的中断服务程序,并与设计实例一中的LED驱动和控制代码进行整合,实现使用两个外部按键来控制LED灯的循环左移和循环右移主要步骤包括:在Keil主界面左侧的Project窗口中,找到并双击main.asm,打开该设计文件在该文件中,修改汇编语言代码设计实例二:按键中断和LED控制

--修改汇编语言文件P4M0DATA0xB4;定义寄存器P4M0的地址0xB4P4M1DATA0xB3;定义寄存器P4M1的地址0xB3P4DATA0xC0;定义寄存器P4的地址0xC0

P6M0DATA0xCC;定义寄存器P6M0的地址0xCCP6M1DATA0xCB;定义寄存器P6M1的地址0xCBP6DATA0xE8;定义寄存器P6的地址0xE8设计实例二:按键中断和LED控制

--修改汇编语言文件IT0EQUS:0x88.0;定义IT0位,在SFR地址0x88寄存器的第0位IT1EQUS:0x88.2;定义IT1位,在SFR地址0x88寄存器的第2位EX0EQUS:0xA8.0;定义EX0位,在SFR地址0xA8寄存器的第0位EX1EQUS:0xA8.2;定义EX1位,在SFR地址0xA8寄存器的第0位EAEQUS:0xA8.7;定义EA位,在SFR地址0xA8寄存器的第7位设计实例二:按键中断和LED控制

--修改汇编语言文件my_progSEGMENTCODE;定义代码段my_prog RSEGmy_prog;引用该段LJMPmain ;跳转到main入口ORG0x0003 ;偏移到地址0x0003,外部中断0的入口 LJMPint0;在偏移地址0x0003,有一条跳转指令到int0 ORG0x0013;偏移到地址0x0013,外部中断1的入口 LJMPint1;在偏移地址0x0013,有一条跳转指令到int1ORG0x200 ;偏移到地址0x0200,让开中断向量表的空间main:USING0;使用第0组寄存器 SETBIT0;设置IT0为“1“,外部中断0为下降沿触发 SETBIT1;设置IT1为“1”,外部中断1为下降沿触发设计实例二:按键中断和LED控制

--修改汇编语言文件SETBEX0;设置EX0为“1”,使能外部中断0 SETBEX1;设置EX1为“1”,使能外部中断1 SETBEA;设置EA为“1”,使能全局中断

MOVP4M0,#0x00;设置P4M0寄存器为0x00MOVP4M1,#0x00;设置P4M1寄存器为0x00,P4为准双向MOVP6M0,#0x00;设置P6M0寄存器为0x00MOVP6M1,#0x00 ;设置P6M1寄存器为0x00MOVP4,#0x00;将P4端口的所有引脚设置为逻辑“0“(低电平) MOVA,#0xFE;将立即数0xFE加载到累加器AMOVP6,A ;将累加器A的内容加载到端口P6设计实例二:按键中断和LED控制

--修改汇编语言文件loop: JMPloop;无限循环loop

int0:;外部中断0的入口int0RLA;累加器A的内容循环左移一位 MOVP6,A;累加器A的内容加载到端口P6RETI;从中断返回int1:;外部中断1的入口int1RRA;累加器A的内容循环右移一位 MOVP6,A;累加器A的内容加载到端口P6RETI ;从中断返回 END;标记文件的结束设计实例二:按键中断和LED控制

--修改汇编语言文件保存设计文件在Keil主界面主菜单中,选择Project->BuildTarget设计实例二:按键中断和LED控制

--程序的硬件调试本节将对设计执行硬件在线调试,以进一步理解并掌握中断的原理程序硬件调试的步骤主要包括:参照本书第3.2.2一节中硬件在线调试的内容,设置硬件在线调试的环境。其中,包括在STC-ISP软件中的Keil仿真设置,以及在KeilμVision5中的OptionsforTarget‘Target1’对话框中Debug标签和Utilities中的设置设计实例二:按键中断和LED控制

--程序的硬件调试分别在下面两行代码的前面设置断点,即LJMPint0和RLA在Keil主界面主菜单中,选择Debug->Start/StopDebugSession,进入调试器界面在Keil调试器界面主菜单中,选择Debug->Run。在调试器左侧的Register窗口中,找到寄存器SPX,该寄存器的内容为0x0007。并在Memory1窗口Address右侧的文本框中,输入e:0x0007设计实例二:按键中断和LED控制

--程序的硬件调试按一下STC32G系列单片机硬件开发平台上标记为INT0的按键。此时,可以看到程序停到了设置断点的代码LJMPint0处,程序计数器PC的内容为0xFF0003。此时,查看从e:0x0007开始的存储器的内容,即堆栈的内容,如下图所示此时,再查看堆栈指针寄存器的内容变成了e:0x000B。显然,在STC32G12K128单片机的CPU响应外部中断0时,执行了压栈(也称为入栈)操作设计实例二:按键中断和LED控制

--程序的硬件调试操作序列实现的功能(SP)+1→(SP)堆栈指针寄存器的内容加1,(SP)=0x0008PSW1→((SP))将寄存器PSW1的内容保存到edata空间地址为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论