3630|7

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

又是RET返回错误,请高手指点,谢谢! [复制链接]

        org 0000h
        ajmp main
        org 0030h
main:
        ACALL INIT        ;调用初始化子程序
  LOOP: acall Scan_Key    ;调用键盘扫描子程序,判断有无按键按下
            acall Key_value   ;调用求键值子程序
            acall Display     ;调用显示子程序
            sjmp LOOP
;***************************************************************
      Scan_Key: PUSH A
                MOV P1,#0F0H
                acall d5ms
                MOV A,P1
                clr c
                subb a,#0f0h
                jz Scan_Exit            ;判断累加器是否为0,为0则无按键按下。
                            mov Key_Flag,#1
                POP A
      Scan_Exit:RET
;***************************************************************


请问为什么执行了ACALL Scan_Key后,RET到0000H,按理说应该执行ACALL Key_Value才对啊?请高手指点

最新回复

谢谢各位兄台,听了你们的建议,问题终于解决了。  详情 回复 发表于 2010-6-3 10:38
点赞 关注

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
RET到0000H,那不是复位了?0000H是复位的地址哦。
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
jz Scan_Exit ;判断累加器是否为0,为0则无按键按下。
  mov Key_Flag,#1
Scan_Exit ://
  POP A
  Scan_Exit:RET
//
Scan_Exit:RET;//POP A 被跳过!
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
可能是没初始化堆栈指针寄存器 引起的吧,在main后加个 MOV SP,#50H试试看,因为调用程序时需要将当前下一条指令的地址压入堆栈中,执行被调用完程序才将该地址弹出堆栈给程序计数器pc,默认情况sp的初值是07h,在通用寄存器的地址范围内,所以有可能是压入入堆栈后的程序地址刚好被某个通用寄存器Ri存入的数据00h给覆盖了
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
应该是的,我刚才测了,如果在被调用函数下,刚好有指令将该程序返回后的的下一条指令地址(就是由单片机调用程序时自动压入堆栈的)覆盖了,该程序就无法正常返回了,所以建议楼主先将sp初值设大些,不要和那32个通用寄存器组混在一起了
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

6
 
2楼正解!!!
有进栈出栈一定要注意这点
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

7
 
;***************************************************************
  Scan_Key: PUSH A
  MOV P1,#0F0H
  acall d5ms
  MOV A,P1
  clr c
  subb a,#0f0h
  jz Scan_Exit ;判断累加器是否为0,为0则无按键按下。
  mov Key_Flag,#1
  POP A
  Scan_Exit:RET
;***************************************************************
将该子程序的出口标号换个位置,改成如下这样:
;***************************************************************
  Scan_Key: PUSH A
  MOV P1,#0F0H
  acall d5ms
  MOV A,P1
  clr c
  subb a,#0f0h
  jz Scan_Exit ;判断累加器是否为0,为0则无按键按下。
  mov Key_Flag,#1
  Scan_Exit:POP A
  RET
;***************************************************************
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

8
 
谢谢各位兄台,听了你们的建议,问题终于解决了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表