;------------------------------------------------------------------------ ; RGB LED ; FULL COLOR Controll [PWM} ; ; Microchip PIC12F629 ; Version 1.00 2003.DEC.05 ; YS Design Studio ;------------------------------------------------------------------------ list p=12f629 #include __CONFIG _CP_OFF & _CPD_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF BANK1 macro bsf STATUS,RP0 ;SELECT BANK1 endm BANK0 macro bcf STATUS,RP0 ;SELECT BANK0 endm ;--------------------------------------------------------------------------- ; Define ;--------------------------------------------------------------------------- RGB EQU 20 ; RGB1 EQU 21 ; RGB2 EQU 22 ; level EQU 23 ; level2 EQU 24 ; p_high EQU 25 ; p_low EQU 26 ; COLOR EQU 27 ; WAIT1 EQU 28 ; WAIT2 EQU 29 ; WAIT3 EQU 2A ; WAIT4 EQU 2B ; K_WAIT1 EQU 2C ; K_WAIT2 EQU 2D ; MODE EQU 2E ; FLAG EQU 2F ; WSAVE EQU 30 ; CCRSAVE EQU 31 ; CYCLE EQU 32 ; #define IO_PORT 0x08 ; GPIO5-0 {HSB} 001000 [LSB} 0=OUT / 1=IN ;GPIO0 7PIN G ;GPIO1 6PIN B ;GPIO2 5PIN R ;GPIO3 4PIN MODE SELECT ;GPIO4 3PIN BUZZ #define MODE1 0 ; FULL COLOR CYCLE LOW #define MODE2 1 ; FULL COLOR CYCLE MID #define MODE3 2 ; FULL COLOR CYCLE HIGH #define MODE4 3 ; G #define MODE5 4 ; R #define MODE6 5 ; B #define MODE7 6 ; POWER OFF #define MODEMAX 7 ; FULL COLOR/RED/GREEN/BLUE/POWER OFF #define MODE_CHANGE 1 ; MODE CHANGE FLAG #define KEY_WAIT1 7F ; #define KEY_WAIT2 7F ; #define BEEP_WAIT1 03 ; #define BEEP_WAIT2 64 ; #define SWITCH_WAIT2 64 ; #define SWITCH_WAIT3 64 ; ;--------------------------------------------------------------------------- ; Power On vector ;--------------------------------------------------------------------------- ORG 0x00 goto main ;--------------------------------------------------------------------------- ; Interrupt vector ;--------------------------------------------------------------------------- ORG 0x04 goto interrupt ;--------------------------------------------------------------------------- ; Interrupt Routine ;--------------------------------------------------------------------------- interrupt push movwf WSAVE swapf STATUS,0 movwf CCRSAVE bcf INTCON,GIE ; Interrupt Disable clrf GPIO ; LED OFF btfss INTCON,GPIF ; FLAG CHECK goto none ;50mS Wait ;GPIO3 Key Scan Chattering Wait 150mS movlw KEY_WAIT1 ; movwf K_WAIT1 ; KEY in Detect timer1 set key_loop1 movlw KEY_WAIT2 ; movwf K_WAIT2 ; KEY in Detect timer2 set key_loop2 decfsz K_WAIT2,F ; goto key_loop2 decfsz K_WAIT1,F ; goto key_loop1 btfsc GPIO,GPIO3 ; GPIO3 = HIGH[SW-OFF] to none goto none ;------------------------------ ; MODE Change ;------------------------------ bcf STATUS,0 ; Clear Carry Bit bsf FLAG,MODE_CHANGE rlf MODE,F ; MODE Change btfss MODE,MODEMAX ; MODE End ? goto none movlw b'00000001' movwf MODE none bcf INTCON,GPIF ; Interrupt Flag Clear bsf INTCON,GIE ; Interrupt Enable pop swapf CCRSAVE,0 movwf STATUS swapf WSAVE,1 swapf WSAVE,0 retfie ;-------------------------------------------- ; Main ;-------------------------------------------- ;---------------------------- ; Initialize PIC Microchip ;---------------------------- main bcf INTCON,GIE ; Interrupt Disable clrf GPIO ; Clear GPIO Port movlw b'00000111' movwf CMCON ; CMCON = CM0/CM1/CM2 ON (COMPARATOR OFF) BANK1 bcf OPTION_REG,INTEDG ;Interrupt on rising edge of GP2/INT pin movlw IO_PORT movwf TRISIO ; Port I/O Set movlw b'00001000' ; Interrupt PIN SET movwf IOCB ; BANK0 movlw b'00000001' movwf MODE ;Interrupt Port ON bsf INTCON,GPIE ; GPIO External Interrupt Enable bsf INTCON,GIE ; Interrupt Enable ;----------------------------------- ; Main Loop ;----------------------------------- main_loop btfsc MODE,MODE1 ; MODE 1 call mode1 btfsc MODE,MODE2 ; MODE 2 call mode2 btfsc MODE,MODE3 ; MODE 3 call mode3 btfsc MODE,MODE4 ; MODE 4 call mode4 btfsc MODE,MODE5 ; MODE 5 call mode5 btfsc MODE,MODE6 ; MODE 6 call mode6 btfsc MODE,MODE7 ; MODE 7 call mode7 goto main_loop ;-------------------------------------------- ; Sub Routine ;-------------------------------------------- ;------------------------------------------- ; FULL COLOR PATTERN ;------------------------------------------- rgb_pat1_1 andlw 0X3F addwf PCL,F retlw 0x07 ;0 retlw 0x06 ;1 retlw 0x05 ;2 retlw 0x04 ;3 retlw 0x03 ;4 retlw 0x02 ;5 retlw 0x01 ;6 retlw 0x00 ;7 retlw 0x00 ;8 retlw 0x01 ;9 retlw 0x02 ;10 retlw 0x03 ;11 retlw 0x04 ;12 retlw 0x05 ;13 retlw 0x06 ;14 retlw 0x07 ;15 retlw 0x05 ;16 retlw 0x06 ;17 retlw 0x04 ;18 retlw 0x03 ;19 retlw 0x01 ;20 retlw 0x02 ;21 retlw 0x00 ;22 retlw 0x00 ;23 retlw 0x02 ;24 retlw 0x01 ;25 retlw 0x03 ;26 retlw 0x04 ;27 retlw 0x06 ;28 retlw 0x05 ;29 retlw 0x07 ;30 retlw 0x03 ;31 retlw 0x05 ;32 retlw 0x01 ;33 retlw 0x06 ;34 retlw 0x02 ;35 retlw 0x04 ;36 retlw 0x00 ;37 retlw 0x00 ;38 retlw 0x04 ;39 retlw 0x02 ;40 retlw 0x06 ;41 retlw 0x01 ;42 retlw 0x05 ;43 retlw 0x03 ;44 retlw 0x07 ;45 rgb_pat1_2 andlw 0X3F addwf PCL,F retlw 0x06 ;0 retlw 0x07 ;1 retlw 0x06 ;2 retlw 0x05 ;3 retlw 0x04 ;4 retlw 0x03 ;5 retlw 0x02 ;6 retlw 0x01 ;7 retlw 0x00 ;8 retlw 0x00 ;9 retlw 0x01 ;10 retlw 0x02 ;11 retlw 0x03 ;12 retlw 0x04 ;13 retlw 0x05 ;14 retlw 0x06 ;15 retlw 0x07 ;16 retlw 0x05 ;17 retlw 0x06 ;18 retlw 0x04 ;19 retlw 0x03 ;20 retlw 0x01 ;21 retlw 0x02 ;22 retlw 0x00 ;23 retlw 0x00 ;24 retlw 0x02 ;25 retlw 0x01 ;26 retlw 0x03 ;27 retlw 0x04 ;28 retlw 0x06 ;29 retlw 0x05 ;30 retlw 0x07 ;31 retlw 0x03 ;32 retlw 0x05 ;33 retlw 0x01 ;34 retlw 0x06 ;35 retlw 0x02 ;36 retlw 0x04 ;37 retlw 0x00 ;38 retlw 0x00 ;39 retlw 0x04 ;40 retlw 0x02 ;41 retlw 0x06 ;42 retlw 0x01 ;43 retlw 0x05 ;44 retlw 0x03 ;45 ;-------------------------------------------- ; MODE1 ;-------------------------------------------- mode1 clrf FLAG movlw 0X0F ; movwf CYCLE ; call PWM2 return ;-------------------------------------------- ; MODE2 ;-------------------------------------------- mode2 clrf FLAG movlw 0X07 ; movwf CYCLE ; call PWM2 return ;-------------------------------------------- ; MODE3 ;-------------------------------------------- mode3 clrf FLAG movlw 0X01 ; movwf CYCLE ; call PWM2 return ;-------------------------------------------- ; MODE4 ;-------------------------------------------- mode4 clrf FLAG clrf COLOR bsf COLOR,0 call PWM1 return ;-------------------------------------------- ; MODE5 ;-------------------------------------------- mode5 clrf FLAG clrf COLOR bsf COLOR,1 call PWM1 return ;-------------------------------------------- ; MODE6 ;-------------------------------------------- mode6 clrf FLAG clrf COLOR bsf COLOR,2 call PWM1 return ;---------------------------------- ; MODE7 Auto Power OFF ;---------------------------------- mode7 clrf GPIO call BEEP movlw 0x10 ; Power OFF Count Down movwf WAIT4 ; loop_mode1 movlw 0x05 ; MODE Detect Cycle movwf WAIT1 ; call wait ; btfss MODE,MODE7 ; MODE Change ? return ; decfsz WAIT4,F ; goto loop_mode1 ; call BEEP ; Power OFF BEEP movlw 0x02 ; movwf WAIT1 ; call wait ; call BEEP ; sleep ; Sleep Mode nop return ;-------------------------------------------- ; LED RBG SELECT ; 0x01 GREEN ; 0x02 RED ; 0x04 BLUE ;-------------------------------------------- PWM1 call BEEP clrf RGB1 clrf RGB2 movf COLOR,W movwf RGB1 PWM_LOOP ;----------------------------- ; SET ON/OFF PATTERN ;----------------------------- ;WIDTH1 LEVEL comf RGB1,W movwf RGB1 movf COLOR,W andwf RGB1,f ;WIDTH2 LEVEL comf RGB2,W movwf RGB2 movf COLOR,W andwf RGB2,f ;SET PWM WIDTH movlw 0XFE ; movwf level ; LEVEL_LOOP ;----------------------------- ; PWM SET ;----------------------------- movf level,W ; movwf p_high ; HIGH SIDE WIDTH comf level,W ; movwf p_low ; movlw 0xFF ; andwf p_low,f ; LOW SIDE WIDTH ;----------------------------- ; PWM ;----------------------------- ;WIDTH1 clrf GPIO ;LED OFF movf RGB1,W ; movwf GPIO ;LED ON high_loop movlw 0X0F ;0x0F movwf WAIT1 ; wait1_loop decfsz WAIT1,F ;WAIT1 LOOP goto wait1_loop ; decfsz p_high,F ;WIDTH1 LOOP goto high_loop ; ;WIDTH2 clrf GPIO ;LED OFF movf RGB2,W ; movwf GPIO ;LED ON low_loop movlw 0X0F ;0x0F movwf WAIT1 ; wait2_loop decfsz WAIT1,F ;WAIT2 LOOP goto wait2_loop ; decfsz p_low,F ;WIDTH2 LOOP goto low_loop ; btfsc FLAG,MODE_CHANGE ; Mode Change Flag Bit1 = 1 = Return return decfsz level,F ; goto LEVEL_LOOP ; goto PWM_LOOP ;--------------------------------------------------- ; LED RGB FULL COLOR ; 0x0F LOW SPEED ; 0x07 MID ; 0x01 HIGH SPEED ;--------------------------------------------------- PWM2 call BEEP PWM_LOOP2 movlw 0X2D ;LED RGB movwf RGB ; RGB_LOOP2 ;----------------------------- ; SET ON/OFF PATTERN ;----------------------------- movf RGB,W ; call rgb_pat1_1 ; movwf RGB1 ; movf RGB,W ; call rgb_pat1_2 ; movwf RGB2 ; movlw 0XFE ; movwf level ; LEVEL_LOOP2 ;----------------------------- ; PWM SET ;----------------------------- movf CYCLE,w ;0X0F CYCLE movwf level2 ; LEVEL_LOOP3 movf level,W ; movwf p_high ; HIGH SIDE WIDTH comf level,W ; movwf p_low ; movlw 0xFF ; andwf p_low,f ; LOW SIDE WIDTH ;----------------------------- ; PWM ;----------------------------- ;WIDTH1 clrf GPIO ;LED OFF movf RGB1,W ; movwf GPIO ;LED ON high_loop2 movlw 0X07 ;0X0F movwf WAIT1 ; wait1_loop2 decfsz WAIT1,F ;WAIT1 LOOP goto wait1_loop2 ; decfsz p_high,F ;WAIT1 LOOP goto high_loop2 ; ;WIDTH2 clrf GPIO ;LED OFF movf RGB2,W ; movwf GPIO ;LED ON low_loop2 movlw 0X07 ;0X0F WAIT2 LOOP movwf WAIT1 ; wait2_loop2 decfsz WAIT1,F ;WAIT2 LOOP goto wait2_loop2 ; decfsz p_low,F ;WIDTH2 LOOP goto low_loop2 ; btfsc FLAG,MODE_CHANGE ; Mode Change Flag Bit1 = 1 = Return return decfsz level2,F ; goto LEVEL_LOOP3 ; decfsz level,F ; goto LEVEL_LOOP2 ; decfsz RGB,F ; goto RGB_LOOP2 ; goto PWM_LOOP2 ;------------------------------------------------------------ ; Click BEEP ; 5Khz 100mS ;------------------------------------------------------------ BEEP bcf INTCON,GIE ;Interrupt Disable movlw BEEP_WAIT1 ; movwf WAIT1 ; beep_loop1 movlw BEEP_WAIT2 ; movwf WAIT2 ; beep_loop2 bsf GPIO,GPIO5 call WAIT100US bcf GPIO,GPIO5 call WAIT100US decfsz WAIT2,F ; goto beep_loop2 decfsz WAIT1,F ; goto beep_loop1 bsf INTCON,GIE ;Interrupt Enable return ;-------------------- ; 100uS WAIT ;-------------------- WAIT100US movlw 0X20 ; movwf WAIT3 ; beep_loop4 decfsz WAIT3,F ; goto beep_loop4 ; return ; ;------------------------------- ; Switching Mode Wait ; 3 Step Loop ;------------------------------- wait switch_loop1 movlw SWITCH_WAIT2 ; movwf WAIT2 ; switch_loop2 movlw SWITCH_WAIT3 ; movwf WAIT3 ; switch_loop3 decfsz WAIT3,F ; goto switch_loop3 decfsz WAIT2,F ; goto switch_loop2 decfsz WAIT1,F ; goto switch_loop1 return END