目的:计划用INT1中断发生时,P1.5输出约高电平,延时约0.5秒后,P1.5 输出低电平,P1.6再输出高电平,载延时约0.5秒后,P1.6输出低电平;
程序如下:
但实测后发现奇怪的现象:用示波器接到P1.5, P1.6,中断发生时,居然出现了2次上述过程,即 P1.5输出约高电平,延时约0.5秒后,P1.5 输出低电平,P1.6再输出高电平,载延时约0.5秒后,P1.6输出低电平 ; 按道理到此应该结束了,但事实上紧接着 又出现了P1.5输出约高电平,延时约0.5秒后,P1.5 输出低电平,P1.6再输出高电平,载延时约0.5秒后,P1.6输出低电平 ;
想了半天想不出为什么,请指点下哪里错了?多谢
org 0000h
ljmp start
org 0013h
ljmp ext1
org 0030h
start: ; 主程序开始
setb ea ; cpu开中断
setb ex1 ; 允许外部中断1,P3.3引脚,即INT1
setb it1 ; 设置外部中断1触发方式为跳变触发
lcall dis_0 ; 调用初始输出状态子程序
ajmp $ ; 等待按键发出中断申请
ext1: clr ea ; 进入中断,先关闭中断
lcall dis_key ; 调用输出子程序
pass: setb ea ; 返回主程序之前先开中断
reti ; 中断返回指令,
dis_0: clr p1.5 ; 初始输出子程序
clr p1.6
ret
dis_key: lcall D_100MS
SETB p1.5 ; 中断后输出子程序
lcall D_100MS
lcall D_100MS
lcall D_100MS
lcall D_100MS
lcall D_100MS
lcall D_100MS
lcall D_100MS
CLR p1.5
lcall D_100MS
lcall D_100MS
lcall D_100MS
lcall D_100MS
lcall D_100MS
lcall D_100MS
lcall D_100MS
lcall D_100MS
lcall D_100MS
SETB p1.6
lcall D_100MS
lcall D_100MS
lcall D_100MS
lcall D_100MS
lcall D_100MS
lcall D_100MS
CLR p1.6
next: ret
D_100MS: MOV R3,#100
CALL D_1ms
RET
D_1MS: MOV R1,#10
DL1: MOV R0,#50
DJNZ R0,$
DJNZ R1,DL1
DJNZ R3,D_1MS
RET
end
|