5
收藏
微博
微信
复制链接

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

提问于
2022-07-26 19:57

如下程序,在实验板上调试的时候出现这种情况:
当按下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

收藏 588 0 5
粉丝
0
关注
0
主题
10
终于找出原因来了,是delay那里出了问题,将ret改成reti就可以。
我想应该是中断程序中的子程序也需要加入reti,一旦发现中断就可以跳出,然后再跳到中断程序,最后再跳到优先级别高的中断程序。
    否则就不会跳出子程序,一直在做延时后,跳回原程序。
0

回答于 · 2022-07-27 14:35

粉丝
0
关注
0
主题
9
你这样改了以后是不是手一放开按键就停止了?
0

回答于 · 2022-07-27 18:38

粉丝
0
关注
0
主题
3
你应该在中断程序里面仅仅做标记,退出中断后,根据标记来执行动作。
K3:
        SETB    F0
        RETI
K4:
        CLR     F0
       RETI

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

回答于 · 2022-07-27 22:36

粉丝
1
关注
0
主题
4

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

回答于 · 2022-07-28 12:04

粉丝
1
关注
0
主题
4

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

回答于 · 2022-07-28 13:04