;********************************************************************** ; Programm ; ; ; Eine LED an RD4 blinkt wärend Taster RE4 über ; eine Interrupt-Routine LED an RD5 einschaltet. ;********************************************************************** list p=16f877 ; direktiva za definiran procesor #include ; processor specific variable definitions __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF errorlevel -207 ;vermeidet: "Found label after column 1" errorlevel -302 ;"Register in operand not in bank 0. Ensure that bank bits are correct. ;********************************************************************** org 0x00 init bsf STATUS, RP0 ;Bank 1 setzen movlw B'00000000' ;Port D alle out movwf TRISD bcf STATUS, RP0 ;Bank 0 setzen clrf PORTD ;Alle LED´s aus bsf STATUS, RP0 ;Bank 1 setzen bcf OPTION_REG,NOT_RBPU ;Pull-upp´s hoch movlw B'11111111' ;Port B alle Eingänge movwf TRISB bcf STATUS, RP0 ;Bank 0 setzen ; RB0-Interrupt einstellen bsf STATUS, RP0 ; auf Bank 1 umschalten bsf OPTION_REG, INTEDG ; 0-1-Flanke an RB0 bcf STATUS, RP0 ; auf Bank 0 zurückschalten bsf INTCON, INTE ; RB0-interrupt erlauben bsf INTCON, GIE ; Interrupt generell erlauben ;********************************************************** ;*********************************************************************** ; Variablen festlegen ab 10h cblock 0x20 loops loops2 endc #define LED PORTD,4 w_copy Equ 0x20 ; Backup für Akkuregister s_copy Equ 0x21 ; Backup für Statusregister ;******************************************************* ; 1.Interuppt-Routine clrf PCLATH ; ensure page bits are cleared goto main ; go to beginning of program ORG 0x004 ; interrupt vector location movwf w_copy ; save off current W register contents movf STATUS,w ; move status register into W register movwf s_copy ; save off contents of STATUS register ;********************************************************************** BTFSC PORTB,4 ;Taste nicht gedrückt,pin=high=1? BCF PORTD,5 ;dan lese diesen satz und LED aus BTFSS PORTB,4 ;Taste gedrückt, pin=low=0? BSF PORTD,5 ;dan lese diesen satz und LED einschalten ;********************************************************************** movf s_copy,w ; retrieve copy of STATUS register movwf STATUS ; restore pre-isr STATUS register contents swapf w_copy,f swapf w_copy,w ; restore pre-isr W register contents retfie ; return from interrupt ;Ende Interrupt-Routine 1 ;******************************************************* ;Beginn des Hauptprogramms main Mainloop bsf LED ; LED an call WAIT ; 250 ms warten bcf LED ; LED aus call WAIT ; 250 ms warten goto Mainloop ;******************************************************* ; Warteschleife für 250 ms WAIT movlw .250 movwf loops ; die top-Schleife verzögert 1 ms = 250 x 4µs top movlw .250 movwf loops2 ; die top2-Schleife verzögert 4 Takte = 4 µs top2 nop decfsz loops2, F goto top2 decfsz loops, F goto top retlw .0 end