;**************************************************** ;RGB LED FX.asm * ;24 sequences to demonstrate the possibiities with * ;an RGB LED * ;22-5-2011 * ;**************************************************** ; ; ; --+---------------+-------+-------+---------- +5v ; | _|_ _|_ _|_ ; | R\ / G\ / B\ / ; |Vdd ---v--- | | | ; +---|1 Gnd| | | | | | | ; | | | |220R | |150R | |150R ; +--------------|GP5 | | | | ; | | GP0|---+ | | ; | +--------|GP4 GP1|-----------+ | ; | | | | | ; | | +--|GP3 GP2|-------------------+ ; | | | ------- ; o o o PIC12F629 ; A / B / C / ; / / / common anode RGB LED ; | | | ; -+------+----+---------------------------------------- 0v list p=12F629 radix dec include "p12f629.inc" errorlevel -224 ; Don't complain about tris errorlevel -302 ; Don't complain about BANK 1 Registers __CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT ;Internal osc. ;_MCLRE_OFF - master clear must be off for gp3 to work as input pin ;**************************************************************** ; variables - names and files ;**************************************************************** temp1 equ 20h ; temp2 equ 21h ; temp3 equ 22h ; temp4 equ 23h ; jump equ 24h ;jump value for table1 fadeUp equ 25h fadeDwn equ 26h sequences equ 27h sw_duration equ 28h testing equ 29h loops equ 2Ah ; ;**************************************************************** ;Equates ;**************************************************************** status equ 0x03 rp1 equ 0x06 rp0 equ 0x05 GPIO equ 0x05 status equ 03h option_reg equ 81h ; bits on GPIO pin7 equ 0 ;GP0 red LED = A pin6 equ 1 ;GP1 green LED = B pin5 equ 2 ;GP2 blue LED = C pin4 equ 3 ;GP3 Sw A pin3 equ 4 ;GP4 Sw B pin2 equ 5 ;GP5 Sw C ;bits rp0 equ 5 ;bit 5 of the status register ;**************************************************************** ;Beginning of program ;**************************************************************** org 0x00 nop nop nop nop nop SetUp bsf status, rp0 ;Bank 1 movlw b'11111000' ;Set TRIS GP0,1,2 out GP3,4,5 input movwf TRISIO ; bcf option_reg,7 ;pull-ups enabled bcf status, rp0 ;bank 0 movlw 07h ;turn off Comparator ports movwf CMCON ;must be placed in bank 0 clrf GPIO ; decf GPIO,1 ;turn off all LEDs in RGB LED call _memory btfss gpio,5 ;SwA to: "record new sequence" goto record btfsc gpio,3 ;SwC removes attract sequence goto $+.10 movlw 0FFh bsf status,rp0 ;select bank1 movwf EEDATA bcf status,rp0 ;select bank0 movlw .101 bsf status,rp0 ;select bank1 movwf EEADR bcf status,rp0 ;select bank0 call write movlw .101 bsf status,rp0 movwf EEADR bsf EECON1,0 ;starts EEPROM read operation storing result in EEDATA movf EEDATA,w ;move read data into w bcf status,rp0 xorlw .8 ;look for 8 - for Attract mode btfsc 03,2 goto Attract_Seq ;selected sequence will appear first goto Main ;**************************************************************** ;* Tables * ;**************************************************************** table1 addwf PCL,F ;02h,1 add W to program counter retlw .10 ; retlw .50 retlw .30 ; retlw .50 retlw .100 ; retlw .40 ; program starts at bottom of table retlw .10 ; retlw .50 retlw .30 ; retlw .50 retlw .60 ; retlw .10 ; retlw .50 retlw .10 ; retlw .50 retlw .100 ; retlw .20 ; retlw .50 retlw .30 ; retlw .50 retlw .70 retlw .60 ; retlw .100 ; retlw .50 retlw .100 ; retlw .50 retlw .100 ; retlw .70 ; retlw .50 retlw .30 ; retlw .50 retlw .70 ; table2 addwf PCL,F ;02h,1 add W to program counter goto seq1 goto seq1A goto seq2 goto seq3 goto seq4 goto seq5 goto seq6 goto seq7 goto seq8 goto seq9 goto seq10 goto seq11 goto seq12 goto seq13 goto seq14 goto seq15 goto seq16 goto seq17 goto seq18 goto seq19 goto seq20 goto seq21 goto seq22 goto seq23 goto seq24 ;******************** ;* Delays * ;******************** _xuS movwf temp2 _uS movlw .10 movwf temp1 decfsz temp1,f goto $-1 decfsz temp2,f goto _uS retlw 00 _ZuS movwf temp2 goto $+2 goto $+2 decfsz temp2,f goto $-3 retlw 00 _xmS movwf temp2 _x nop decfsz temp1,f goto _x decfsz temp2,f goto _x retlw 00 ;1mS delay for PWM _1mS movlw 01h movwf temp2 nop decfsz temp1,f goto $-2 decfsz temp2,f goto $-4 retlw 00 ;5mS delay for increments in timing for "New Sequence" _5mS movlw 05h movwf temp2 _5 nop decfsz temp1,f goto _5 decfsz temp2,f goto _5 retlw 00 _10mS movlw 0Ah movwf temp2 _10 nop decfsz temp1,f goto _10 decfsz temp2,f goto _10 retlw 00 _50mS movlw .50 movwf temp2 _50 nop decfsz temp1,f goto _50 decfsz temp2,f goto _50 retlw 00 _100mS movlw .100 movwf temp2 _100 nop decfsz temp1,f goto _100 decfsz temp2,f goto _100 retlw 00 _150mS movlw .150 movwf temp2 _150 nop decfsz temp1,f goto _150 decfsz temp2,f goto _150 retlw 00 _250mS nop decfsz temp1,f goto $-2 decfsz temp2,f goto $-4 retlw 00 ;**************************** ;* Sub Routines * ;**************************** _memory movlw .48 movwf temp1 movlw 2Fh movwf fsr incf fsr,f movlw 0FFh movwf indf decfsz temp1,f goto $-4 retlw 00 ;SwB puts current sequence into EEPROM for turn on. ;and puts "marker" in location 101 Attract movf sequences,w ;put sequence number into w bsf status,rp0 ;select bank1 movwf EEDATA bcf status,rp0 ;select bank0 movlw .100 bsf status,rp0 ;select bank1 movwf EEADR bcf status,rp0 ;select bank0 call write movlw .8 bsf status,rp0 ;select bank1 movwf EEDATA incf EEADR,1 bcf status,rp0 ;select bank0 call write nop goto $-1 ;Project must be turned off ;Seq selected as Attract will be displayed when project turned on Attract_Seq movlw .100 bsf status,rp0 movwf EEADR bsf EECON1,0 ;starts EEPROM read operation storing result in EEDATA movf EEDATA,w ;move read data into w bcf status,rp0 movwf temp4 movf temp4,w call table2 goto $-2 ;record new sequence - looks for "no switch pressed" for 1.25 seconds to exit ;uses files 30h to 5Fh (48 files) ;three files per "step" 1st file = LEDs, 2nd = Off time, 3rd = on time ;15 steps allowed - look for 5Dh record btfss gpio,5 ;wait for release of button A goto $-1 movlw 30h movwf fsr ;start storage at file 30h clrf gpio decf gpio,1 ;turn off al LEDs ;look at keys being pressed - identifies 2 or 3 keys pressed together _r1 clrf sw_duration _r1a call _5mS incfsz sw_duration,1 ;5mS x 256 = 1.25seconds goto $+2 goto Store ;time out! store files 30h to 5Fh in EEPROM btfss gpio,5 ;see if one or more Sw is pressed goto $+5 btfss gpio,4 goto $+3 btfsc gpio,3 goto _r1a ;no sw pressed create 2.5 sec timing ;1,2,or 3 sw pressed call _10mS ;delay to detect 2 or 3 switches incfsz sw_duration,1 goto $+2 goto Main btfsc gpio,5 ;SwA goto $+2 bcf gpio,0 ;turn on red LED A btfsc gpio,4 ;SwB goto $+2 bcf gpio,1 ;turn on green LED B btfsc gpio,3 ;SwC goto $+2 ; bcf gpio,2 ;turn on blue LED C ;LEDs have been illuminated movf gpio,w movwf indf ;w moved to fsr's file (30h+) incf fsr,f movf sw_duration,w ;off time!! movwf indf ;w moved to fsr's file (30h+) incf fsr,f clrf sw_duration _r2 call _5mS incfsz sw_duration,1 goto $+2 goto record ;time out! keys pressed too long. Start again btfss gpio,5 goto _r2 ;sw pressed btfss gpio,4 goto _r2 ;sw pressed btfss gpio,3 goto _r2 ;sw pressed ;file empty. Put duration into file movf sw_duration,w ;on time movwf indf ;w moved to fsr's file (30h+) incf fsr,f movlw 5Dh xorwf fsr,w btfss 03,2 goto $+2 goto Store ;stop at 15 steps. store files 30h to 5Fh in EEPROM clrf gpio decf gpio,1 ;turn off al LEDs goto _r1 ;sequences: ;seq1 Self-Programmed sequence ;1St file:LEDs 2nd file:OFF time 3rd file:On time seq1 bsf status,rp0 clrf EEADR bcf status,rp0 bsf status,rp0 bsf EECON1,0 ;starts EEPROM read operation storing result in EEDATA movf EEDATA,w ;move read data into w bcf status,rp0 movwf gpio bsf status,rp0 incf EEADR,1 bsf EECON1,0 ; movf EEDATA,w ;move read data into w bcf status,rp0 movwf temp4 ;this is OFF time. Store it bsf status,rp0 incf EEADR,1 bsf EECON1,0 ; movf EEDATA,w ;move read data into w bcf status,rp0 movwf sw_duration ;this is ON time call _5mS decfsz sw_duration,1 goto $-2 clrf gpio decf gpio,1 ;turn off all LEDs call _5mS decfsz temp4,f ;create OFF duration goto $-2 bsf status,rp0 incf EEADR,1 bsf EECON1,0 ; movf EEDATA,w ;move read data into w bcf status,rp0 xorlw 0FFh ;look for 0FFh - end of routine btfss 03,2 goto $-32 retlw 00 ;seq1A cycles through most of the colours for an RGB LED ;sub-routine starts with blue 50% green 0% and fades red up/down ;the on-off time for each loop of red is the same, so it is separated into ;two parts and blue is turned on for first loop and off for ;second loop to create 50%. Must make sure fadeDwn goes to zero to exit seq1A clrf fadeUp ; clrf fadeDwn incf fadeUp,f ;to create 1 (delay routine does not like 00) . bcf gpio,0 ;turn on red LED bcf gpio,2 ;turn on blue LED movf fadeUp,w call _xuS bsf gpio,0 ;turn off red LED movf fadeDwn,w call _xuS decf fadeDwn,f ; incf fadeUp,f ; bcf gpio,0 ;turn on red LED bsf gpio,2 ;turn off blue LED movf fadeUp,w call _xuS bsf gpio,0 ;turn off red LED movf fadeDwn,w call _xuS decfsz fadeDwn,f ; goto $-18 incf fadeDwn,f ;removes glitch between fade up and fade down incf fadeDwn,f bcf gpio,0 ;turn on red LED . bcf gpio,2 ;turn on blue LED movf fadeUp,w call _xuS bsf gpio,0 ;turn off red LED movf fadeDwn,w call _xuS incf fadeDwn,f ; decf fadeUp,f ; bcf gpio,0 ;turn on red LED bsf gpio,2 ;turn off blue LED movf fadeUp,w call _xuS bsf gpio,0 ;turn off red LED movf fadeDwn,w call _xuS decf fadeUp,f incfsz fadeDwn,f ; goto $-18 clrf fadeUp ; clrf fadeDwn incf fadeUp,f ;to create 1 (delay routine does not like 00) . bcf gpio,0 ;turn on red LED bcf gpio,1 ;turn on green LED movf fadeUp,w call _xuS bsf gpio,0 ;turn off red LED bsf gpio,1 ;turn off green LED movf fadeDwn,w call _xuS decf fadeDwn,f ; incf fadeUp,f ; bcf gpio,0 ;turn on red LED bsf gpio,1 ;turn off green LED movf fadeUp,w call _xuS bsf gpio,0 ;turn off red LED movf fadeDwn,w call _xuS decfsz fadeDwn,f ; goto $-19 incf fadeDwn,f ;removes glitch between fade up and fade down incf fadeDwn,f bcf gpio,0 ;turn on red LED . bcf gpio,1 ;turn on green LED movf fadeUp,w call _xuS bsf gpio,0 ;turn off red LED bsf gpio,1 ;turn off green LED movf fadeDwn,w call _xuS incf fadeDwn,f ; decf fadeUp,f ; bcf gpio,0 ;turn on red LED bsf gpio,1 ;turn off green LED movf fadeUp,w call _xuS bsf gpio,0 ;turn off red LED movf fadeDwn,w call _xuS decf fadeUp,f incfsz fadeDwn,f ; goto $-19 retlw 00 seq2 movlw .50 ;produce red @50% PWM movwf loops bcf gpio,0 call _5mS bsf gpio,0 call _5mS decfsz loops,1 goto $-5 bsf gpio,0 retlw 00 seq3 movlw .50 ;produce green @50% PWM movwf loops bcf gpio,1 call _5mS bsf gpio,1 call _5mS decfsz loops,1 goto $-5 bsf gpio,1 retlw 00 seq4 movlw .50 ;produce blue @50% PWM movwf loops bcf gpio,2 call _5mS bsf gpio,2 call _5mS decfsz loops,1 goto $-5 bsf gpio,2 retlw 00 seq5 movlw .50 ;produce white @50% PWM movwf loops clrf gpio ;makes gpio all LOW call _5mS decf gpio,1 ;makes gpio all HIGH call _5mS decfsz loops,1 goto $-5 bsf gpio,2 retlw 00 seq6 movlw .85 ;produce red @20% PWM movwf loops bcf gpio,0 call _1mS bsf gpio,0 call _5mS decfsz loops,1 goto $-5 bsf gpio,0 retlw 00 seq7 movlw .85 ;produce green @20% PWM movwf loops bcf gpio,1 call _1mS bsf gpio,1 call _5mS decfsz loops,1 goto $-5 bsf gpio,1 retlw 00 seq8 movlw .85 ;produce blue @20% PWM movwf loops bcf gpio,2 call _5mS bsf gpio,2 call _5mS decfsz loops,1 goto $-5 bsf gpio,2 retlw 00 seq9 movlw .85 ;produce white @20% PWM movwf loops clrf gpio ;makes gpio all LOW call _1mS decf gpio,1 ;makes gpio all HIGH call _5mS decfsz loops,1 goto $-5 bsf gpio,2 retlw 00 ;seq10 slow colour change for RGB LED @100% PWM seq10 bcf gpio,0 ; call _250mS call _250mS bsf gpio,0 bcf gpio,1 call _250mS call _250mS bsf gpio,1 bcf gpio,2 call _250mS call _250mS bsf gpio,2 retlw 00 ;seq11 slow colour change for RGB LED @50% PWM seq11 movlw .50 ;produce red @50% PWM movwf loops bcf gpio,0 call _5mS bsf gpio,0 call _5mS decfsz loops,1 goto $-5 bsf gpio,0 movlw .50 ;produce green @50% PWM movwf loops bcf gpio,1 call _5mS bsf gpio,1 call _5mS decfsz loops,1 goto $-5 bsf gpio,1 movlw .50 ;produce blue @50% PWM movwf loops bcf gpio,2 call _5mS bsf gpio,2 call _5mS decfsz loops,1 goto $-5 bsf gpio,2 movlw .50 ;produce white @50% PWM movwf loops clrf gpio ;makes gpio all LOW - ledS on call _5mS decf gpio,1 ;makes gpio all HIGH - ledS off call _5mS decfsz loops,1 goto $-5 retlw 00 ;seq12 slow colour jump red, blue green @20% PWM seq12 movlw .85 ;produce red @20% PWM movwf loops bcf gpio,0 call _1mS bsf gpio,0 call _5mS decfsz loops,1 goto $-5 bsf gpio,0 movlw .85 ;produce green @20% PWM movwf loops bcf gpio,1 call _1mS bsf gpio,1 call _5mS decfsz loops,1 goto $-5 bsf gpio,1 movlw .85 ;produce blue @20% PWM movwf loops bcf gpio,2 call _5mS bsf gpio,2 call _5mS decfsz loops,1 goto $-5 bsf gpio,2 movlw .85 ;produce white @20% PWM movwf loops clrf gpio ;makes gpio all LOW - ledS on call _1mS decf gpio,1 ;makes gpio all HIGH - ledS off call _5mS decfsz loops,1 goto $-5 retlw 00 ;seq13 RED BLUE RED BLUE seq13 bCf gpio,0 call _150mS bSf gpio,0 bCf gpio,2 call _150mS bSf gpio,2 retlw 00 ;seq14 red on red off seq14 bcf gpio,0 call _150mS bsf gpio,0 call _150mS clrf gpio decf gpio,1 retlw 00 ;seq15 green on green off seq15 bCf gpio,1 call _150mS bSf gpio,1 call _150mS clrf gpio decf gpio,1 retlw 00 ;seq16 blue on blue off seq16 bCf gpio,2 call _150mS bSf gpio,2 call _150mS clrf gpio decf gpio,1 retlw 00 ;seq17 white on white off seq17 movlw .15 ;produce white @50% PWM movwf loops clrf gpio ;makes gpio all LOW - ledS on call _5mS decf gpio,1 ;makes gpio all HIGH - ledS off call _5mS decfsz loops,1 goto $-5 call _150mS retlw 00 ;seq18 police flasher 3 times red 3 times blue seq18 bcf gpio,0 call _50mS bsf gpio,0 call _50mS bcf gpio,0 call _50mS bsf gpio,0 call _50mS bcf gpio,0 call _50mS bsf gpio,0 call _50mS bcf gpio,2 call _50mS bsf gpio,2 call _50mS bcf gpio,2 call _50mS bsf gpio,2 call _50mS bcf gpio,2 call _50mS bsf gpio,2 call _50mS retlw 00 ;seq19 random flicker - white light seq19 movlw .32 ;start at bottom of table movwf jump clrf gpio ; . back to here - turn on all LEDs movf jump,w ;put table jupmp value into w call table1 call _xmS clrf gpio decf gpio,1 ;turn off all LEDs decfsz jump,f goto $+2 retlw 00 ;top of table found movf jump,w ;put table jupmp value into w call table1 call _xmS goto $-12 ; . ;seq20 slow fade up down red seq20 clrf fadeUp ; clrf fadeDwn incf fadeUp,f ;to create 1 (delay routine does not like 00) . bcf gpio,0 ;turn on red LED movf fadeUp,w call _xuS bsf gpio,0 ;turn off red LED movf fadeDwn,w call _xuS decfsz fadeDwn,f ; goto $-8 incf fadeDwn,f ;to produce 1 bcf gpio,0 ;turn on red LED . movf fadeUp,w call _xuS bsf gpio,0 ;turn off red LED movf fadeDwn,w call _xuS decf fadeUp,f incfsz fadeDwn,f goto $-8 retlw 00 ;seq21 slow fade up down green seq21 clrf fadeUp ; clrf fadeDwn incf fadeUp,f ;to create 1 (delay routine does not like 00) . bcf gpio,1 ;turn on green LED movf fadeUp,w call _xuS bsf gpio,1 ;turn off green LED movf fadeDwn,w call _xuS decfsz fadeDwn,f ; goto $-8 incf fadeDwn,f ;to produce 1 bcf gpio,1 ;turn on green LED . movf fadeUp,w call _xuS bsf gpio,1 ;turn off green LED movf fadeDwn,w call _xuS decf fadeUp,f incfsz fadeDwn,f goto $-8 retlw 00 ;seq22 slow fade up down blue seq22 clrf fadeUp ; clrf fadeDwn incf fadeUp,f ;to create 1 (delay routine does not like 00) bcf gpio,2 ;turn on blue LED . movf fadeUp,w call _xuS bsf gpio,2 ;turn off blue LED movf fadeDwn,w call _xuS decfsz fadeDwn,f ; goto $-8 incf fadeDwn,f ;to produce 1 bcf gpio,2 ;turn on blue LED . movf fadeUp,w call _xuS bsf gpio,2 ;turn off blue LED movf fadeDwn,w call _xuS decf fadeUp,f incfsz fadeDwn,f goto $-8 retlw 00 ;seq23 slow fade up down white Light seq23 clrf fadeUp ; clrf fadeDwn incf fadeUp,f ;to create 1 (delay routine does not like 00) clrf gpio ;turn on LEDs . movf fadeUp,w call _xuS clrf gpio decf gpio,1 ;turn off LED movf fadeDwn,w call _xuS decfsz fadeDwn,f ; goto $-9 incf fadeDwn,f ;to produce 1 clrf gpio ;turn on LEDs . movf fadeUp,w call _xuS clrf gpio decf gpio,1 ;turn off LEDs movf fadeDwn,w call _xuS decf fadeUp,f incfsz fadeDwn,f goto $-9 clrf gpio retlw 00 ;seq24 fast fade up down white light seq24 clrf fadeUp ; clrf fadeDwn incf fadeUp,f ;to create 1 (delay routine does not like 00) clrf gpio ;turn on LEDs . movf fadeUp,w call _ZuS clrf gpio decf gpio,1 ;turn off LED movf fadeDwn,w call _ZuS decfsz fadeDwn,f ; goto $-9 incf fadeDwn,f ;to produce 1 clrf gpio ;turn on LEDs . movf fadeUp,w call _ZuS clrf gpio decf gpio,1 ;turn off LEDs movf fadeDwn,w call _ZuS decf fadeUp,f incfsz fadeDwn,f goto $-9 clrf gpio retlw 00 ;Store Store the 15 steps in EEPROM Store bsf status,rp0 ;select bank1 clrf eeadr bcf status,rp0 ;select bank0 movlw .48 movwf temp1 movlw 2Fh movwf fsr incf fsr,f ;fsr starts at file 30h movf indf,w ;retreive data in file 30h bsf status,rp0 ;select bank1 movwf eedata ; bcf status,rp0 ;select bank0 call write bsf status,rp0 ;select bank1 incf eeadr,1 bcf status,rp0 ;select bank0 decfsz temp1,f goto $-10 goto Main write bsf status,rp0 ;select bank1 bsf eecon1,wren ;enable write movlw 55h ;unlock codes movwf eecon2 movlw 0aah movwf eecon2 bsf eecon1,wr ;write begins bcf status,rp0 ;select bank0 writeA btfss pir1,eeif ;wait for write to complete goto writeA bcf pir1,eeif bsf status,rp0 ;select bank1 bcf eecon1,wren ;disable other writes bcf status,rp0 ;select bank0 retlw 00 ;************************ ;* Main * ;************************ Main clrf sequences movf sequences,w call table2 btfss gpio,5 ;Is swA still pressed? goto $-3 ;SwA still pressed movf sequences,w ;SwA released call table2 btfss gpio,4 ;SwB puts current sequence at turn-on goto Attract btfsc gpio,5 goto $-5 ;SwA not pressed incf sequences,f movlw .25 xorwf sequences,w btfss 03,2 goto $-12 goto Main ;************************ ;*EEPROM * ;************************ org 2100h END