Flash Led Project PIC 12F675


;----------------------------------------------------------------------
; NAME: Flash Led for     PIC 12F675
; BY:     Arun.s 
; WEB:  http://www.3gesoft.blogspot.com
;----------------------------------------------------------------------


; config. GPIO xx543210 = xx00 1100

; vers 0.1    25.03.2006

    list      p=12f675            ; list directive to define processor
    #include <p12f675.inc>        ; processor specific variable definitions

;----------------------------------------------------------------------
; Configurare
    __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF
    ERRORLEVEL -302
;----------------------------------------------------------------------

;----------------------------------------------------------------------
; Constant define
;----------------------------------------------------------------------
#define Led4        GPIO,0        ; (o) led yellow / gelb / galben
#define Led3        GPIO,1        ; (o) led red / rot / rosu

#define rezerva        GPIO,2        ; (i) not connected

#define swNext        GPIO,3        ; (i) intrare switch next ( not implemented )
#define    Led2        GPIO,4        ; (o) led red / rot / rosu
#define    Led1        GPIO,5        ; (o) led yellow / gelb / galben

;----------------------------------------------------------------------
; RAM VARIABLES DEFINITIONS
;----------------------------------------------------------------------
; Bank0 = 20h-5Fh

    CBLOCK    0x020
; -------------------
; delays
    delayCnt:  1    ; contor delay 100uS
    delayCnt1: 1    ; contor delay 10mS
    delayCnt2: 1    ; contor delay 1S
; -------------------
; alte variabile ..
    cntFlash: 1        ; contor flash

    ENDC

;----------------------------------------------------------------------
; MACRO DEFINITIONS
;----------------------------------------------------------------------
; Selects register bank 0
BANK0 MACRO
    BCF    STATUS,RP0    ; clear bank select bits
    ENDM
;----------------------------------------------------------------------
; Selects register bank 1
BANK1 MACRO
    BSF    STATUS,RP0    ;
    ENDM

;----------------------------------------------------------------------
; disable global irq
DISABLE_IRQ MACRO
    LOCAL STOP_INT
STOP_INT
    BCF    INTCON,GIE    ; Disable global interrupt
    BTFSC INTCON,GIE    ; check if disabled
    GOTO STOP_INT        ; nope, try again
    ENDM
;----------------------------------------------------------------------
; enable global irq
ENABLE_IRQ MACRO
    LOCAL    START_INT
START_INT   
    BSF    INTCON,GIE    ; Enable global interrupt
    BTFSS INTCON,GIE    ; check if disabled
    GOTO START_INT        ; nope, try again
    ENDM

;----------------------------------------------------------------------
; macro definitions / comands / comenzi ..

Led1_ON MACRO
    bsf Led1
    nop
    ENDM

Led1_OFF MACRO
    bcf Led1
    nop
    ENDM


Led2_ON MACRO
    bsf Led2
    nop
    ENDM

Led2_OFF MACRO
    bcf Led2
    nop
    ENDM


Led3_ON MACRO
    bsf Led3
    nop
    ENDM

Led3_OFF MACRO
    bcf Led3
    nop
    ENDM

Led4_ON MACRO
    bsf Led4
    nop
    ENDM

Led4_OFF MACRO
    bcf Led4
    nop
    ENDM
;----------------------------------------------------------------------
; END macro definitions
;----------------------------------------------------------------------


;**********************************************************************
;  PROGRAMUL
;**********************************************************************
    ORG     0x000               ; processor reset vector
    goto    MAIN                ; go to beginning of program

;-----------------------------------------------------------------------------
;    Interrupt service routine
;-----------------------------------------------------------------------------
    ORG     0x004              ; interrupt vector location
    RETFIE                ; return from interrupt

;-----------------------------------------------------------------------------
;     MAIN ROUTINE START HERE
;-----------------------------------------------------------------------------
    ORG     0x010
MAIN:
;-----------------------------------------------------------------------------
; Init_Prog
;  - Initialize program & setups
;  - Initilaize all ports to known state before setup routines are called
;-----------------------------------------------------------------------------
Init_Prog:
; int osc calibration / Calibrarea oscilatorului intern de 4 Mhz
    BANK1
    call    0x3FF        ; get the calibration value
    movwf     OSCCAL
    BANK0
; disable irqs / dezactivare intreruperi
    DISABLE_IRQ
; ports init / initializare porturi
    call Init_Ports
; leds off / initializari leduri
    call Init_Led
; init.end / ok, la munca!

;-----------------------------------------------------------------------------
; Program loop start here (forever_loop)
;-----------------------------------------------------------------------------
Prog_Loop:
    ; back to BANK0 / revin la Bank-ul 0
    BANK0

    movlw 0x05
    movwf cntFlash

flash1        ; flash mode 1
    Led1_ON
    call Delay_100mS
    Led1_OFF
    call Delay_100mS

    Led2_ON
    call Delay_100mS
    Led2_OFF
    call Delay_100mS

    Led3_ON
    call Delay_100mS
    Led3_OFF
    call Delay_100mS

    Led4_ON
    call Delay_100mS
    Led4_OFF
    call Delay_100mS


    Led4_ON
    call Delay_100mS
    Led4_OFF
    call Delay_100mS


    Led3_ON
    call Delay_100mS
    Led3_OFF
    call Delay_100mS


    Led2_ON
    call Delay_100mS
    Led2_OFF
    call Delay_100mS


    Led1_ON
    call Delay_100mS
    Led1_OFF
    call Delay_100mS

    decfsz cntFlash, f
    goto flash1
; end 1

    call Init_Led
    call Delay_100mS
   
    movlw 0x10
    movwf cntFlash
flash2         ; flash mode 2
    Led1_ON
    Led4_ON
    call Delay_100mS

    Led1_OFF
    Led4_OFF
    call Delay_10mS
   
    Led1_ON
    Led4_ON
    call Delay_100mS

    Led1_OFF
    Led4_OFF
    call Delay_10mS
    call Delay_10mS


    Led2_ON
    Led3_ON
    call Delay_100mS

    Led2_OFF
    Led3_OFF
    call Delay_10mS
   
    Led2_ON
    Led3_ON
    call Delay_100mS

    Led2_OFF
    Led3_OFF
    call Delay_10mS
    call Delay_10mS

    decfsz cntFlash, f
    goto flash2
; end 2


    call Init_Led
    call Delay_100mS
   
    movlw 0x10
    movwf cntFlash

flash3    ; flash mode 3
    Led1_ON
    Led3_ON
    call Delay_100mS

    Led1_OFF
    Led3_OFF
    call Delay_10mS
   
    Led1_ON
    Led3_ON
    call Delay_100mS

    Led1_OFF
    Led3_OFF
    call Delay_10mS
    call Delay_10mS


    Led2_ON
    Led4_ON
    call Delay_100mS

    Led2_OFF
    Led4_OFF
    call Delay_10mS
   
    Led2_ON
    Led4_ON
    call Delay_100mS

    Led2_OFF
    Led4_OFF
    call Delay_10mS
    call Delay_10mS

    decfsz cntFlash, f
    goto flash3
; end 3

    goto Prog_Loop

;-----------------------------------------------------------------------------
; Library / PROCEDURI
;-----------------------------------------------------------------------------

;-----------------------------------------------------------------------------
; Delay 1S
;-----------------------------------------------------------------------------
Delay_1S:                    ; Call = 2 cycles
    movlw    d'100'                ; 1 cycles
    movwf    delayCnt2            ; 1 cycles
Delay_1S_1:
    call    Delay_10mS            ; 2 cycles
    decfsz    delayCnt2,f            ;
    goto    Delay_1S_1            ; 1+2 cycles
    return

;-----------------------------------------------------------------------------
; Delay 100 mS
;-----------------------------------------------------------------------------
Delay_100mS:                    ; Call = 2 cycles
    movlw    d'10'                ; 1 cycles
    movwf    delayCnt2            ; 1 cycles
Delay_100mS_1:
    call    Delay_10mS            ; 2 cycles
    decfsz    delayCnt2,f            ;
    goto    Delay_100mS_1            ; 1+2 cycles
    return

;-----------------------------------------------------------------------------
; Delay 10 mS
;-----------------------------------------------------------------------------
Delay_10mS:                        ; Call = 2 cycles
    movlw    d'100'                ; 1 cycles
    movwf    delayCnt1            ; 1 cycles
Delay_10mS_1:
    call    Delay_100uS            ; 2 cycles
    decfsz    delayCnt1,f            ;
    goto    Delay_10mS_1        ; 1+2 cycles
    return

;-----------------------------------------------------------------------------
; Delay 100 uS = (5+(3*Constant))*OSC/4
;-----------------------------------------------------------------------------
Delay_100uS:                    ; Call = 2 cycles
    movlw    d'31'                ; 1 cycle
    movwf    delayCnt            ; 1 cycle
    decfsz    delayCnt,f            ;
    goto    $-1                    ; 1+2 cycles
    return                        ; 2 cycles

;-----------------------------------------------------------------------------
; Port init / Initialize Port
;-----------------------------------------------------------------------------
Init_Ports:
    BANK0                ; Bank 0
    clrf    GPIO            ; 1)Status of pins:  GPIO (GPIO=0 <ViL, =1 >ViH)
    movlw    b'00000111'        ; 2)Comparator configuration
    movwf    CMCON            ; Set GP<2:0> digital IO (comparator Off)
    BANK1                ; Bank 1
    bcf     OPTION_REG,5        ; 3)TMR0 clock source select:  Internal instruction cycle clock (CLKOUT)
    bsf    OPTION_REG,7        ; 4)GPIO pull-ups: is disabled
    clrf    WPU            ; 5)Clear weak pull-up register
    clrf    IOC            ; 6)Clear Interrupt-on-change register

;-----------------------------------------------------------------------------
; Port setup GP0-GP5
;-----------------------------------------------------------------------------
;GP0 (Led Y)        act as output
;GP1 (Led R)        act as output (eventual rezerva)
;GP2 (NC)            act as input - rezerva
;GP3 (switch)        can be input only
;GP4 (Led R)        act as output
;GP5 (Led Y)        act as output
;-----------------------------------------------------------------------------

    movlw   b'00001100'        ; 7) data direction TRISO 0: output, 1: input (Hi-Z mode)
    movwf   TRISIO             ; {0,0,GPIO<5:0>} 0-Output 1-Input
; * 12F675 Only *            ; initializaz registrul de selectare a intrarilor analogice
    clrf ANSEL                ; 8)* xxxx ANS<3..0> =0 digital I/O, =1 analog input   
    ;
    BANK0
    return
;-----------------------------------------------------------------------------

;-----------------------------------------------------------------------------
; Initialize Leduri
;-----------------------------------------------------------------------------
Init_Led:
    Led1_OFF
    Led2_OFF
    Led3_OFF
    Led4_OFF
    return
;-----------------------------------------------------------------------------
; calibrarea oscilator intern
;-----------------------------------------------------------------------------
    org 3FFh
; [34]9Ch for  pic 12F675
    retlw 0x9C    ;
;-----------------------------------------------------------------------------
    END                    ; directive 'end of program'
;-----------------------------------------------------------------------------

Comments

Popular posts from this blog

Download Huawei Modem Unlocker v5.8.1b by BOJS

Hidden Secret Service Menu Codes for Sony, Samsung, LG and Philips TV

Solving power supply problems (s.m.p.s)