Код: list p=12F629 #include p12F629.inc
#DEFINE DISABLE_INT
;__config _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF __config H'1F81' __idlocs 0x0001
cblock 0x20 dtime smalld vsd pdelay status_temp W_temp fsr_temp color endc
org H'0000' goto main
org H'0004' goto handle_interrupts
org H'0005'
handle_interrupts ;push: movwf W_temp ;save W register swapf STATUS, W ;movf STATUS,W movwf status_temp ; (1tcy) banksel FSR movf FSR,W movwf fsr_temp bcf STATUS, RP0 ; select bank 0
banksel INTCON btfsc INTCON, GPIF goto gp_int goto end_interrupts
;a port state changed gp_int banksel GPIO movlw GP0 btfsc GPIO, GP1 movlw GP2 movwf color
;BANKSEL PIR1 ; (2tcy) select correct SFR bank ;btfss INTCON,GPIF ; (2tcy) did a Timer1 overflow occur? goto end_interrupts ; (2tcy) no, check another interrupt source
end_interrupts
;POP: banksel FSR MOVF fsr_temp,W MOVWF FSR SWAPF status_temp,W MOVWF STATUS SWAPF W_temp, F SWAPF W_temp,W retfie
;delay time = 4*(cntr-1)+10 delay bcf STATUS,RP0 ;movlw 255 movwf dtime delay_loop movlw 0FFh movwf smalld small_loop
movlw 0FFh movwf vsd vsl decfsz vsd,f goto vsl
decfsz smalld,f goto small_loop
bcf STATUS,RP0 decfsz dtime,f goto delay_loop return
main movlw 80h banksel OPTION_REG movwf OPTION_REG ; bank1
banksel WPU clrf WPU ;21 ;??? movlw 37h movwf WPU
banksel TRISIO clrf TRISIO ; bank1 ;GP1 - input, the rest output. GP3 - always input bsf TRISIO, GP1 ; bank1
IFNDEF __12F629 clrf ANSEL, 0 ;bank 1 ENDIF
IFNDEF DISABLE_INT banksel IOC ;Enable interrupt on change for port 1: 00010 bsf IOC, GP1 ; bank 1 ENDIF
banksel GPIO ;movlw 1 movlw 0 bcf STATUS, RP0 ; 3,5 movwf GPIO ;bank 0
banksel CMCON movlw 7 movwf CMCON ; bank 0
IFNDEF DISABLE_INT banksel INTCON clrf INTCON ; 11 ;volatile bsf INTCON, GIE bsf INTCON, GPIE ENDIF
banksel pdelay movlw 2 movwf pdelay
bcf STATUS, RP0 ; 3,5 movlw 04h ;; 0000 0100 movwf color
;movlw -2 ;movlw FE ;bsf STATUS,RP0 ; 3,5 ;movwf GPIO
main_loop banksel GPIO movlw 04h btfsc GPIO, GP1 movlw 01h movwf color
bcf STATUS, RP0 ; 3,5 movf color,W iorwf GPIO
;movlw 1 movf pdelay,w call delay
bcf STATUS, RP0 ; 3,5 ;clear bit in color comf color,W andwf GPIO,F
;movlw 1 movf pdelay,w call delay
goto main_loop
end
|