微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > PIC单片机中断嵌套

PIC单片机中断嵌套

时间:11-29 来源:互联网 点击:
#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 B00000001;位码

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 B00000001;位码

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top