- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
单片机原理和应用课件
* ?所谓调用子程序,暂时中断主程序的执行,而转到子程序的入口地址 去执行子程序,子程序执行完后返回主程序继续执行。 1. 必要性:程序结构简单,利用程序库; 2. 形式与要求 (1)名称、地址(标明子程序的首地址或称为入口地址,以方便调用); (2)功用 (3)说明占用资源(寄存器、存储单元),以便保护和恢复现场; (4)指出入口与出口参数,以正确进行参数传递; (5)子程序的末尾用RET返回指令结束; 参数传递:在调用子程序前,主程序应先把有关参数(即入口参数)放到某些约定的位置,子程序在运行结束返回前,也应该把运算结果(出口参数)送到约定的位置/ 单元。 4、子程序及其调用程序设计 * 子程序设计举例 子程序设计应考虑的问题 (1)参数的传递 一般方法:用工作寄存器或累加器,用地址指针寄存器,用堆栈 (2)信息的保护(现场的恢复和保护) 利用堆栈 : PUSH ACC PUSH PSW PUSH B POP B POP PSW POP ACC 利用工作寄存器或内存单元 * 1. 用累加器A或工作寄存器Rn传递参数 例1:把A中一个十六进制数的ASCⅡ字符转换为一位十六进制数。 主程序部分: START: ┋ ; MOV A,#34H ;设置入口参数于A中 子程序: ASCH: CLR C SUBB A,#30H CJNE A,#10,$+3 ;$+3为下条指令的首址 JC NEXT ;〈10,转NEXT SUBB A,#07H ;≥0AH,则再减07H(共减37H) NEXT: NOP RET * 2. 用寄存器作指针来传递参数 例2:将片内一组区域清零子程序如下: ZOER: CLR A LOOP: MOV @R0, A; INC R0 DJNZ R2 ,LOOP; RET 分析入口参数? 出口参数? 编程完成20H~28H和30H~39H两段区域清零. 例3:在内RAM40H、50H开始的空间中,分别存有单字节的无符号数据块,长度分别为12和8。编程求这两个数据块中的最大数,存入MAX单元。 思路:用子程序求某数据块的最大值, 入口参数:数据块的首地址存入R0,长度存入R2,出口参数在A中,即最大数。 * ? FMAX: MOV A,@R0 ;取第一个数 LOOP0:INC R0 MOV B,@R0 ;取下一个数 CJNE A,B,$+3 ;比较 JNC LOOP1 MOV A,B ;把大的数送A LOOP1:DJNZ R2,LOOP0 RET ;出口参数在A中 主程序 ORG 1000H MAX EQU 30H MOV R0,#40H ;设置入口参数R0,R2 MOV R2,#12-1 ACALL FMAX MOV MAX,A ;出口参数暂存MAX中 MOV R0,#50H ;设置入口参数R0,R2 MOV R2,#8-1 ACALL FMAX CJNE A,MAX,$+3 ;比较两个数中较大值 JC NEXT MOV MAX,A NEXT:SJMP $ * 方法:在调用子程序之前,先把参与运算的操作数压入堆栈;在执行子程序过程中,通过堆栈指针SP间接访问到堆栈中的操作数,取出参加运算,最后把运算的结果压入堆栈,由主程序再从堆栈中弹出结果。 注意问题:由于调用子程序时,主程序的断点地址被自动压入堆栈,占用了堆栈的两个字节,所以在子程序中弹出参数时一定要用修改SP指针,指向该参数;同时,在子程序返回指令RET之前一定要作相应修改SP指令,以便SP指向断点地址,确保能正确返回主程序。 3.用堆栈来传递函数 例4:把内RAM30
文档评论(0)