找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5458|回复: 5
打印 上一主题 下一主题
收起左侧

外部中断0和中断1交替设置优先级时候出现问题?

[复制链接]
跳转到指定楼层
楼主
如下程序,在实验板上调试的时候出现这种情况:
当按下k3时候,外部中断0触发,灯向右移动,接着按下k4,外部中断1触发(设置了中断0低优先级,中断1高优先级),灯向左移动,
接着再按k3按键,就不再实现中断0触发了。仍然在执行k4程序。这是为什么呢?
我在k3,K4程序内交替设置了中断0和中断1优先级别,这样执行循环是否有问题?
在keil里面仿真的时候如图



;==============================================================
;实验名称:中断实验程序
;实验功能:利用外部中断p3.2,p3.3,按下k3时候,灯右移动,按下k4时候灯左移动,数码管利用p2
;
;==============================================================



                  ORG 000H
                  AJMP MAIN
                  ORG 0003H                  ;中断0入口地址
                  AJMP K3              ;右移程序
                  ORG 0013H                  ;中断1入口地址
                  AJMP K4                  ;左移程度

                  GPIO_LED EQU P2
                  ORG 0030H                  ;主函数
                  MAIN:

                  SETB EA                  ;开总中断
                  CLR IT0                  ;设置外部中断触发方式为低电平触发
                  SETB EX0                  ;外部中断允许

                  CLR IT1
                  SETB EX1
                  MOV A,#11111110B             ;给累加器一个初始值,第一个灯亮

     HERE:SJMP HERE

              ORG 0060H
         K3:
                   SETB PX1
                  CLR PX0
                  MOV GPIO_LED,A
                  ACALL DELAY                                             
                  RR A                                                  ;累加器所有数字左移一位
                  MOV GPIO_LED,A                          ;将累加器值送到p2
                  AJMP K3
                  RETI

                   ORG 0090H
         K4:
              SETB PX0
                  CLR PX1
                  MOV GPIO_LED,A
                  ACALL DELAY                             
                  RL A                                                  ;累加器所有数字左移一位
                  MOV GPIO_LED,A                          ;将累加器值送到p2
                  AJMP K4
                  RETI

        DELAY:                                  ;延时程序
                MOV R1,#255
        D1:
                MOV R2,#255
                DJNZ R2,$
                DJNZ R1,D1
                RET
                END

111.jpg (2.85 MB, 下载次数: 133)

111.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:53308 发表于 2013-8-29 16:42 | 只看该作者
终于找出原因来了,是delay那里出了问题,将ret改成reti就可以。
我想应该是中断程序中的子程序也需要加入reti,一旦发现中断就可以跳出,然后再跳到中断程序,最后再跳到优先级别高的中断程序。
    否则就不会跳出子程序,一直在做延时后,跳回原程序。
回复

使用道具 举报

板凳
ID:7485 发表于 2013-8-30 08:24 | 只看该作者
你这样改了以后是不是手一放开按键就停止了?
回复

使用道具 举报

地板
ID:7485 发表于 2013-8-30 08:31 | 只看该作者
你应该在中断程序里面仅仅做标记,退出中断后,根据标记来执行动作。
K3:
        SETB    F0
        RETI
K4:
        CLR     F0
       RETI

HERE:                                      ;你原来的标号   
         JB    F0,  XXXX
        ......
       SJMP HERE     
回复

使用道具 举报

5#
ID:53308 发表于 2013-8-30 15:58 | 只看该作者
ahshmj 发表于 2013-8-30 08:24
你这样改了以后是不是手一放开按键就停止了?

不会,因为程序一直都在做跳转循环,没有按下比它更高级别的优先时候,程序一直都在做循环,松手也一直在run
回复

使用道具 举报

6#
ID:53308 发表于 2013-8-30 16:01 | 只看该作者
ahshmj 发表于 2013-8-30 08:31
你应该在中断程序里面仅仅做标记,退出中断后,根据标记来执行动作。
K3:
        SETB    F0

谢谢提示,我试试行不行,这是我移植c程序里面的内容再写的。现在学着发现手头能参考的只有c程序了。所以现在慢慢转去用c写。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表