1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| ORG 0000H LJMP START ORG 0003H;如果没有指明外部中断地址,外部中断不会发生 LJMP X0_INT ORG 0013H START: CLR IT0;设置外部中断0为电平触发 ;SETB IT0;设置外部中断0位下降沿触发 ;CLR IT1;设置外部中断1为电平触发 ;SETB IT1;设置外部中断1为下降沿触发 SETB EX0;EX0这一位置1,就是拉成高电平 SETB EX1;EX1这个位也置1,具体意思自己查 SETB EA;打开总中断 MOV SP,#60H;堆栈,必须大于50H,就是栈的空间 MOV A,#0FEH;流水灯的第一个灯亮 ;到此完成外部中断初始化设置 LOOP: MOV P0,A CALL DELAY RL A;把A向左循环 SJMP LOOP X0_INT: CLR EA;清除总中断 PUSH PSW;把PSW寄存器状态压入堆栈 PUSH ACC;把累加器寄存器状态压入堆栈来保护现场 SETB RS1;快速返回主程序 SETB EA ;以上是写外部中断的固定写法 MOV A,#0F0H;这是灯的初始状态 MOV R2,#6;向R2移入立即数6 ;接下来就需要中断返回 X0_1:MOV P0,A;这里开始是中断后运行的主程序 CALL DELAY CPL A;按位取反 DJNZ R2,X0_1 ;接下来的也是中断函数的固定写法,和开始的差不多,直接复制过来,但是出栈顺序要放一下,因为栈是先进后出 CLR EA POP ACC;出栈 POP PSW;出栈 SETB EA RETI;这是特殊的伪指令,一定要有,代表中断函数的返回 DELAY:MOV R5,#50 D1:MOV R6,#100 D2:MOV R7,#100 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END
|