专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

PIC单片机中断嵌套

作者:佚名   来源:本站原创   点击数:  更新时间:2012年09月27日   【字体:
   #INCLUDE"P16F877.inc"
  
   W_TEMP  EQU 20H ; 实际上20H、A0H、120H和1A0H
   STATUS_TEMP EQU 21H ;在体0中建立保护单元 
   PCLATH_TEMP EQU 22H ;在体0中建立保护单元


   ORG  000H
   GOTO A1
   ORG  04H;中断入口地址
   GOTO ZD01
A1   BSF  STATUS,RP0
   BCF  STATUS,RP1;体1
   
   MOVLW 00H;1:2TMRO比例
   MOVWF OPTION_REG;分频1/2

   MOVLW 0H
   MOVWF TRISA;设置A口为输出口
   MOVLW   06H  
   MOVWF   ADCON1;设置A口为普通I/O口模式 
   movlw 0FFH
   movwf TRISB;设定RB为输入
   BCF  STATUS,RP0
   BCF  STATUS,RP1;体0

   MOVLW 0FFH;
   MOVFW TMR0;初值

   MOVLW 0FFH
   MOVWF PORTA;A口输出高电平

   MOVLW 1;位1显示数
   MOVWF 50H; 
   MOVLW 2;位2显示数
   MOVWF 51H;
   MOVLW 3;位3显示数
   MOVWF 52H;
   MOVLW 4;位4显示数
   MOVWF 53H;

   MOVLW 4;显示位数
   MOVWF 40H;
   MOVLW B'00000001';位码
   MOVWF 41H;
   MOVLW 50H;
   MOVWF FSR ;间接寻址


   BCF  INTCON,INTF;清中断标志
   BSF  INTCON,INTE;开外部中断
   BCF  INTCON,T0IF;清定时中断标志
   BSF  INTCON,T0IE;开定时中断
   BSF  INTCON,GIE;开总中断
   GOTO $

ZD01  
   BTFSS INTCON,INTF;判断是否发生外部中断
   GOTO ZD02

   BCF  INTCON,INTE;关闭外部中断避免2次中断
   BSF  INTCON,GIE;开总中断允许定时中断嵌套进来

   BCF  INTCON,INTF;清中断标志
   BTFSS PORTB,0;;判断触发中断键是否抬起避免产生2次中断
   GOTO $-1;
   COMF PORTA,1;取反A口

   BSF  INTCON,INTE;开外部中断
   
   RETFIE ;中断标志结束


ZD02  BTFSS INTCON,T0IF;判断是否产生定时中断
   GOTO ZD04;否跳出是继续执行
;***************************************************
;     保护现场

   MOVWF  W_TEMP;W备份到W_TEMP中
   SWAPF  STATUS,0;STATUS半字交换后送W
   CLRF  STATUS;选择体0为当前体备份
   MOVWF  STATUS_TEMP;将原来的STATUS送体0上的
   MOVF  PCLATH,0;PCLATH送W 
   MOVWF  PCLATH_TEMP;W送备份寄存器中
   CLRF  PCLATH ;设置为0页
;***************************************************

   BCF  INTCON,T0IF
   BSF  STATUS,RP0;体1
   BCF  STATUS,RP1;
   MOVLW 0;
   MOVWF TRISC;RB口设为输出口
   MOVWF TRISD;RD口设为输出口

   BCF  STATUS,RP0;体0
   BCF  STATUS,RP1;
   MOVLW 0FFH;
   MOVWF PORTC;RB口输出高电平
   MOVLW 0
   MOVWF PORTD;RD口输出低电平起清屏作用
   
   MOVFW INDF;间接寻址显示数据  
   CALL Q1;查数据表
   MOVWF PORTC;显示断码输出到RB口
   INCF FSR,1;间接寻址地址加1
   MOVFW 41H ;位码
   MOVWF PORTD;位码输出到RD口
   RLF  41H,0;处理C
   RLF  41H,1;左移位码
   DECFSZ 40H,1;判断是否显示完4位
   GOTO ZD03;否则继续显示

   MOVLW 4;显示位数
   MOVWF 40H;
   MOVLW B'00000001';位码
   MOVWF 41H;
   MOVLW 50H;
   MOVWF FSR ;间接寻址

ZD03 
;***************************************************
;     恢复现场
   CLRF STATUS;恢复到体0
   MOVF    PCLATH_TEMP,0;开始恢复数据 
   MOVWF PCLATH;恢复PCLATH
   SWAPF STATUS_TEMP,0
   MOVWF STATUS;恢复STATUS
   SWAPF W_TEMP,1;半字交换后放回
   SWAPF W_TEMP,0;再半字交换后送W
;***************************************************

   MOVLW 0FFH;
   MOVFW TMR0;重装初值
ZD04 
   RETFIE ;中断结束
   
;********************************************
;    数据表
;********************************************      
Q1   ADDWF   PCL,1  
    RETLW     00C0H        ;0
       RETLW     00F9H        ;1
        RETLW     00A4H        ;2
        RETLW     00B0H        ;3
      RETLW     0099H        ;4
      RETLW     0092H        ;5
      RETLW     0082H        ;6
      RETLW     00F8H        ;7
      RETLW     0080H        ;8
      RETLW     0090H        ;9
      RETLW     0088H        ;A
      RETLW     0083H        ;B
      RETLW     00C6H        ;C
      RETLW     00A1H        ;D
      RETLW     0086H        ;E
      RETLW     008EH        ;F

       END
关闭窗口

相关文章