如下程序,在实验板上调试的时候出现这种情况:
当按下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
外部中断0和中断1交替设置优先级时候出现问题?
我想应该是中断程序中的子程序也需要加入reti,一旦发现中断就可以跳出,然后再跳到中断程序,最后再跳到优先级别高的中断程序。
否则就不会跳出子程序,一直在做延时后,跳回原程序。
回答于 · 2022-07-27 14:35
K3:
SETB F0
RETI
K4:
CLR F0
RETI
HERE: ;你原来的标号
JB F0, XXXX
......
SJMP HERE
回答于 · 2022-07-27 22:36
不会,因为程序一直都在做跳转循环,没有按下比它更高级别的优先时候,程序一直都在做循环,松手也一直在run
回答于 · 2022-07-28 12:04
谢谢提示,我试试行不行,这是我移植c程序里面的内容再写的。现在学着发现手头能参考的只有c程序了。所以现在慢慢转去用c写。
回答于 · 2022-07-28 13:04