刚学到外部中断这一块儿,书上说实现中断要开总中断EA,外外部中断,然后设置外部中断的触发方式
比如一般要有这三句:
SETB EA ;开总中断
SETB EX0 ;开INT0中断
CLR IT0 ; 设置INT0为电平触发
但是书上一个例子的代码中却没有这样的设置。。。
这是为什么?
该例子完整代码如下:
ORG 0000H
LJMP START
ORG 0003H
LJMP INT_0
ORG 0100H
;主函数体,流水灯0到7依次点亮
;然后7到0依次点亮,每次点亮延时一秒
START: MOV A,#00H
MOV R0,#8
SETB C
;P1.0到P1.7的二极管依次点亮
LOOP1: RLC A
MOV P1,A
ACALL DELAY
DJNZ R0,LOOP1
MOV A,#00H
MOV R0,#8
SETB C
;P1.7到P1.0的二极管依次点亮
LOOP2: RRC A
MOV P1,A
ACALL DELAY
DJNZ R0,LOOP2
AJMP START
;延时1秒子程序
DELAY: MOV R5,#200
D1: MOV R6,#20
D2: MOV R7,#123
NOP
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
;中断子程序
INT_0: PUSH PSW
PUSH ACC
MOV A,#00H
MOV R2,#6
L4: MOV P1,A
LCALL DELAY
CPL A
DJNZ R2,L4
POP ACC
POP PSW
RETI
END
我的问题不在于这段代码执行的功能,我只是不明白为什么没有设置关于总中断(EA)和相关外部中断(EX0)的语句
就是说,书上的代码有错误?
追答有可能的。
缺少了这两行:
SETB EA ;开总中断.
SETB EX0 ;开INT0中断.
中断处理程序,肯定是不会执行的。
当然,使用字节传送指令,也可开中断:
MOV IE, #81H ;开总中断 同时 开INT0中断.
这一行,楼主给出的程序里面,也没有,所以,中断,就不可能发生。
51有外部中断0,外部中断1,定时计数器中断0,定时计数器中断1,以及串行发送接收中断这五个中断,是不是要使用其中任何一个中断,都需要编程者主动先开总中断EA,然后开具体相应的中断?没有默认开的中断?
追答默认,中断都是关闭的。
程序中需要使用中断,都必须由编程者主动打开。
先开总中断EA,然后开具体相应的中断?--次序,不重要,可说是无所谓。