#INCLUDE"P16F877.inc" W_TEMP EQU 20H ; 實(shí)際上20H、A0H、120H和1A0H STATUS_TEMP EQU 21H ;在體0中建立保護(hù)單元 PCLATH_TEMP EQU 22H ;在體0中建立保護(hù)單元 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;設(shè)置A口為輸出口 MOVLW 06H MOVWF ADCON1;設(shè)置A口為普通I/O口模式 movlw 0FFH movwf TRISB;設(shè)定RB為輸入 BCF STATUS,RP0 BCF STATUS,RP1;體0 MOVLW 0FFH; MOVFW TMR0;初值 MOVLW 0FFH MOVWF PORTA;A口輸出高電平 MOVLW 1;位1顯示數(shù) MOVWF 50H; MOVLW 2;位2顯示數(shù) MOVWF 51H; MOVLW 3;位3顯示數(shù) MOVWF 52H; MOVLW 4;位4顯示數(shù) MOVWF 53H; MOVLW 4;顯示位數(shù) MOVWF 40H; MOVLW B'00000001';位碼 MOVWF 41H; MOVLW 50H; MOVWF FSR ;間接尋址 BCF INTCON,INTF;清中斷標(biāo)志 BSF INTCON,INTE;開外部中斷 BCF INTCON,T0IF;清定時(shí)中斷標(biāo)志 BSF INTCON,T0IE;開定時(shí)中斷 BSF INTCON,GIE;開總中斷 GOTO $ ZD01 BTFSS INTCON,INTF;判斷是否發(fā)生外部中斷 GOTO ZD02 BCF INTCON,INTE;關(guān)閉外部中斷避免2次中斷 BSF INTCON,GIE;開總中斷允許定時(shí)中斷嵌套進(jìn)來 BCF INTCON,INTF;清中斷標(biāo)志 BTFSS PORTB,0;;判斷觸發(fā)中斷鍵是否抬起避免產(chǎn)生2次中斷 GOTO $-1; COMF PORTA,1;取反A口 BSF INTCON,INTE;開外部中斷 RETFIE ;中斷標(biāo)志結(jié)束 ZD02 BTFSS INTCON,T0IF;判斷是否產(chǎn)生定時(shí)中斷 GOTO ZD04;否跳出是繼續(xù)執(zhí)行 ;*************************************************** ; 保護(hù)現(xiàn)場 MOVWF W_TEMP;W備份到W_TEMP中 SWAPF STATUS,0;STATUS半字交換后送W CLRF STATUS;選擇體0為當(dāng)前體備份 MOVWF STATUS_TEMP;將原來的STATUS送體0上的 MOVF PCLATH,0;PCLATH送W MOVWF PCLATH_TEMP;W送備份寄存器中 CLRF PCLATH ;設(shè)置為0頁 ;*************************************************** BCF INTCON,T0IF BSF STATUS,RP0;體1 BCF STATUS,RP1; MOVLW 0; MOVWF TRISC;RB口設(shè)為輸出口 MOVWF TRISD;RD口設(shè)為輸出口 BCF STATUS,RP0;體0 BCF STATUS,RP1; MOVLW 0FFH; MOVWF PORTC;RB口輸出高電平 MOVLW 0 MOVWF PORTD;RD口輸出低電平起清屏作用 MOVFW INDF;間接尋址顯示數(shù)據(jù) CALL Q1;查數(shù)據(jù)表 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;否則繼續(xù)顯示 MOVLW 4;顯示位數(shù) MOVWF 40H; MOVLW B'00000001';位碼 MOVWF 41H; MOVLW 50H; MOVWF FSR ;間接尋址 ZD03 ;*************************************************** ; 恢復(fù)現(xiàn)場 CLRF STATUS;恢復(fù)到體0 MOVF PCLATH_TEMP,0;開始恢復(fù)數(shù)據(jù) MOVWF PCLATH;恢復(fù)PCLATH SWAPF STATUS_TEMP,0 MOVWF STATUS;恢復(fù)STATUS SWAPF W_TEMP,1;半字交換后放回 SWAPF W_TEMP,0;再半字交換后送W ;*************************************************** MOVLW 0FFH; MOVFW TMR0;重裝初值 ZD04 RETFIE ;中斷結(jié)束 ;******************************************** ; 數(shù)據(jù)表 ;******************************************** 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