You are on page 1of 11

flash led with PIC12F675

flash led project with Microchip PIC 12F675

home |

Flash Led with PIC12F675 - schematics:

http://www.bertys.ro/flashled.htm (1 of 2)04/11/2009 16:45:44


flash led with PIC12F675

view movie ( 136k ) with some flash modes

download code: pic12F675/FlashLed.asm

Some PIC Programmers can't rewrite the PIC12F675 microchip after first programming (the code use INTRC_OSC and MCLR_OFF) .
In this case try to use:

;----------------------------------------------------------------------
; Configurare
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF

and a pullup resistor (1 .. 10k ohm ) to Vdd for -MCLR pin (GP3).

instead:

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

http://www.bertys.ro/flashled.htm (2 of 2)04/11/2009 16:45:44


http://www.bertys.ro/pic12F675/FlashLed.asm

;----------------------------------------------------------------------
; NAME: Flash Led for PIC 12F675
; BY: Adrian Bergthaller
; WEB: http://www.bertys.ro
;----------------------------------------------------------------------

;****************************************************************************
;* 12F675 * *
;* -----uu----- *
;* +5 V ----| vdd vss |---- Gnd *
;* led1 <---| gp5 gp0 |---> led4 *
;* led2 <---| gp4 gp1 |---> led3 *
;* switch --->| gp3 gp2 |<--- NC *
;* ------------ *
;* *
;****************************************************************************

; 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

http://www.bertys.ro/pic12F675/FlashLed.asm (1 of 9)04/11/2009 16:45:54


http://www.bertys.ro/pic12F675/FlashLed.asm

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

http://www.bertys.ro/pic12F675/FlashLed.asm (2 of 9)04/11/2009 16:45:54


http://www.bertys.ro/pic12F675/FlashLed.asm

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
;-----------------------------------------------------------------------------

http://www.bertys.ro/pic12F675/FlashLed.asm (3 of 9)04/11/2009 16:45:54


http://www.bertys.ro/pic12F675/FlashLed.asm

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

http://www.bertys.ro/pic12F675/FlashLed.asm (4 of 9)04/11/2009 16:45:54


http://www.bertys.ro/pic12F675/FlashLed.asm

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

http://www.bertys.ro/pic12F675/FlashLed.asm (5 of 9)04/11/2009 16:45:54


http://www.bertys.ro/pic12F675/FlashLed.asm

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

http://www.bertys.ro/pic12F675/FlashLed.asm (6 of 9)04/11/2009 16:45:54


http://www.bertys.ro/pic12F675/FlashLed.asm

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

http://www.bertys.ro/pic12F675/FlashLed.asm (7 of 9)04/11/2009 16:45:54


http://www.bertys.ro/pic12F675/FlashLed.asm

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

http://www.bertys.ro/pic12F675/FlashLed.asm (8 of 9)04/11/2009 16:45:54


http://www.bertys.ro/pic12F675/FlashLed.asm

;-----------------------------------------------------------------------------
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'
;-----------------------------------------------------------------------------

http://www.bertys.ro/pic12F675/FlashLed.asm (9 of 9)04/11/2009 16:45:54

You might also like