- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
4.5 子程序的设计 子程序设计原则和应注意的问题 一种能完成某一特定任务的程序段。其资源要为所有调用程序共享。因此,子程序在结构上应具有独立性和通用性,在编写子程序时应注意以下问题: 1.子程序的第一条指令的地址称为子程序的入口地址。该指令前必须有标号。 2.主程序调用子程序 两条子程序调用指令: (1)绝对调用指令:ACALL addr11 (2)长调用指令:LCALL addr16 3.注意设置堆栈指针和现场保护 4.最后一条指令必须是RET指令 5.子程序可以嵌套,即子程序可以调用子程序 6.在子程序调用时,还要注意参数传递的问题 4.5.1 子程序的基本结构 MAIN: ┇ ;MAIN为主程序或调用程序标号 ┇ LCALL SUB ;调用子程序SUB ┇ ┇ SUB: PUSH PSW ;现场保护 PUSH ACC ; 子程序处理程序段 POP ACC ;现场恢复 POP PSW ; RET ;最后一条指令必须为RET 4.5.2子程序调用 子程序调用时要注意两点: 现场的保护和恢复; 主程序与子程序的参数传递。 1.现场保护与恢复 在程序执行过程中常常要用到单片机的一些通用单元,如工作寄存器RO-R7、累加器A、数据指针DPTR以及有关标志和状态等。而这些单元中的内容在调用结束后的主程序中仍有用,所以需要进行保护,称为保护现场。在执行完子程序,返回继续执行主程序前恢复其原内容,称为恢复现场。现场保护与恢复是成套出现的。如: SUB1∶ PUSH PSW ;保护现场 PUSH ACC PUSH B MOV PSW,#10H ;换当前工作寄存器组 ... ... ... POP B ;恢复现场 POP ACC P0P PSW RET 2.参数传递 由于子程序是主程序的一部分,所以,在程序的执行时必然要发生数据上的联系。在调用子程序时,主程序有时需要通过某种方式把有关参数(即子程序的入口参数)传给子程序,当子程序执行完毕后,又需要通过某种方式把有关参数(即子程序的出口参数)传给主程序。 1)子程序无需传递参数 例4-11 调用延时20ms子程序DELY。 主程序 ... LCALL DELY ... 子程序: DELY∶ MOV R7,#100 DLY0∶ MOV R6,#98 NOP DLY1∶ DJNZ R6,DLY1 DJNZ R7,DLY0 RET 2)需用参数传递 例4-⒓ 编写程序,实现 c =a2+b2 。设a,b,c分别存于内部RAM中的30、31H、32H三个单元中。 START∶ MOV A,30H ;取a ACAL1 SQR ;调用查平方表子程序 MOV R1,A ;a的平方暂存于R1中 MOV A,31H ;取b ACAL1 SQR ;调用查平方表子程序 ADD A,R1 ;a、b两数求和,存于A中 MOV 32H,A ;存结果 ... ... SQR: MOV DPTR,#TAB ;子程序 MOVC A,A+DPTR RET TAB∶DB 0,1,4,9,16,25,36,49,64,81 4.5.3 中断服务程序是一段特殊的子程序 1、中断响应过程: 首先由硬件自动生成一条长调用指令: LCALL addr16 接着就由CPU执行该指令,将PC的内容压入堆栈以保护断点,再将中断入口地址装入PC。 2、各中断源服务程序的入口地址固定,如下所示: 中断源 入口地址 外部中断0 0003H 定时器/计数器T0 000BH 外部中断1 0013H 定时器/计数器T1 001BH 串行口中断 0023H 例4-4补 P107 用8751单片机设计一个航标灯控制器。当黑夜降临时,航标灯自动启动亮2s,灭2s,闪闪发光,指明航向。当白天到来时,航标灯自动熄灭,不再发光。 MOVC A,A+DPTR 这条指令的应用范围较为广泛,一般情况下,大多使用该指令,使用该指令时不必计算偏移量。 使用该指令的优点是表格可以设在64K程序存储器空间内的任何地方,而不像 MOVC A,A+PC那样只设在PC下面的256个单元中,使用较方便。 上面的程序可改成如下形式
文档评论(0)