51 汇编语言编程:外部中断实验


;主程序显示八位流水灯;

;外部中断0:左右四位闪烁三次;

;外部中断1:各位间隔闪烁三次。


;仿真电路如下:

51 汇编语言编程:外部中断实验 - 非著名博主 - 电子信息角落

;图片链接:http://xiangce.baidu.com/picture/detail/f07000d4ddcb74074c5fd14ae100a41f08316fdd


;程序如下:


    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



;编写本程序的目的,是为了解答一个题目。

;题目链接:http://zhidao.baidu.com/question/936016199538778092.html


;这个题目给出了 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 程序,其实,还有不足,如中断嵌套、正确恢复中断前的显示等等。


;为了尊重原作,做而论道在写汇编程序时,并没有对原程序功能进行修改。


;现场的保护、恢复可以参考:


;http://hi.baidu.com/do_sermon/item/92e081f975f6120ad99e72ec


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值