主程序显示八位流水灯;
外部中断0:左右四位闪烁三次;
外部中断1:各位间隔闪烁三次。
仿真电路如下:
;程序如下:
ORG 0000H
LJMP START
ORG 0003H
LJMP X0_INT
ORG 0013H
LJMP X1_INT
ORG 0030H
START:
SETB IT0
SETB IT1
SETB EX0
SETB EX1
SETB EA
MOV SP, #50H
;----------------------
MOV A, #0FEH
LOOP:
MOV P1, A
CALL DELAY
RL A
SJMP LOOP
;----------------------
X0_INT:
PUSH ACC
PUSH PSW
SETB RS0
MOV A, #0F0H ;高低四位分别发光
MOV R2, #6
X0_1:
MOV P1, A
CALL DELAY
CPL A
DJNZ R2, X0_1
POP PSW
POP ACC
RETI
;----------------------
X1_INT:
PUSH ACC
PUSH PSW
SETB RS1
MOV A, #0AAH ;八位LED间隔发光
MOV R2, #6
X1_1:
MOV P1, A
CALL DELAY
CPL A
DJNZ R2, X1_1
POP PSW
POP ACC
RETI
;----------------------
DELAY:
MOV R5, #3
DJNZ R7, $
DJNZ R6, $ - 2
DJNZ R5, $ - 4
RET
;----------------------
END
;编写本程序的目的,是为了解答一个题目。
;这个题目给出了 C 程序,希望给出同样功能的汇编程序。
;C 程序原文如下:
#include《regx51.h》
#include《intrins.h》
void IRS0_init();
void IRS1_init();
void delay_ms(unsigned int n);
void main()
{
unsigned char temp = 0xfe;
IRS0_init();
IRS1_init();
while(1) {
P1 = temp; delay_ms(300);
temp=_crol_(temp, 1);
}
}
void IRS0_init()
{
IT0 = 1;
EX0 = 1;
EA = 1;
}
void IRS1_init()
{
IT1 = 1;
EX1 = 1;
}
void IRS0()interrupt 0
{
unsigned char temp = 0xf0;
unsigned char num;
for(num = 6; num 》 0; num--) {
P1 = temp; delay_ms(300);
temp = ~temp;
}
}
void IRS1()interrupt 2
{
unsigned char temp = 0xaa;
unsigned char num;
for(num = 6; num 》 0; num--) {
P1 = temp; delay_ms(300);
temp = ~temp;
}
}
void delay_ms(unsigned int n)
{
unsigned int x, y;
for(x = n; x 》 0; x--) for(y = 123; y 》 0; y--);
}
;这个 C 程序,其实,还有不足,如中断嵌套、正确恢复中断前的显示等等。
;为了尊重原作,做而论道在写汇编程序时,并没有对原程序功能进行修改。
;现场的保护、恢复可以参考: