;****************************************************************************************** ; PIC12F1822 Sample Program ; Project : ; Program Name : ; Programer : ; Create date : Version 1.0 H27.03.08 ; History : ; Laungage : MPLAB MPASM ;****************************************************************************************** ; Description ; OSC : Internal OSC 32MHz ; Assign I/O pins ; Ra2[O] : PL9823(Shift register programmable RGB Lamp) DIN pin ;****************************************************************************************** LIST P=PIC12F1822,ST=OFF,R=DEC INCLUDE "P12F1822.inc" __CONFIG _CONFIG1 , _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF ; __CONFIG _CONFIG2 , _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_HI & _LVP_OFF __CONFIG _CONFIG2 , _WRT_OFF & _PLLEN_ON & _STVREN_OFF & _BORV_HI & _LVP_OFF ; ; Define GENERAL PURPOSE RAM AREA (80 bytes maximum) ; TMP_G EQU 20H TMP_LP1 EQU 21H TMP_LP2 EQU 22H WAT1M1 EQU 23H ; ; Define Common RAM AREA (16 bytes) ; TMP_C EQU 70H ; ; Define Macro ; SELBANK MACRO #BANK_NO MOVLW #BANK_NO MOVWF BSR ENDM WAIT10M MACRO #WAT MOVLW #WAT CALL WAT10M ENDM NOP2 MACRO NOP NOP ENDM NOP10 MACRO NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP ENDM ; ; Define Parameter ; MLED_P EQU 2 ORG 0h GOTO START ORG 4h GOTO START START ; ***************************** ; 1.Initialize ; ***************************** ; (1)Define OSC SELBANK 1 ; SET BANK1 ; MOVLW B'01111010' ; Internal OSC 16MHz MOVLW B'11110000' ; Internal OSC 32MHz MOVWF OSCCON ; (2)Define ANSELA Register SELBANK 3 ; SET BANK3 CLRF ANSELA ; All degital port ; (3)Define I/O port SELBANK 1 ; SET BANK1 MOVLW B'11111011' MOVWF TRISA SELBANK 0 ; SET BANK0 CLRF PORTA SELBANK 0 ; SET BANK0 ; (4)Reset LED Module CALL RES_MLED ; ***************************** ; 2.Program main ; ***************************** MAIN CALL RES_MLED ; CALL COL_F CALL COL_R CALL COL_G CALL COL_B ; CALL COL_W WAIT10M 100 ; ; CALL RES_MLED CALL COL_G CALL COL_B CALL COL_W WAIT10M 100 ; ; CALL RES_MLED CALL COL_B CALL COL_W CALL COL_R WAIT10M 100 ; ; CALL RES_MLED CALL COL_W CALL COL_R CALL COL_G WAIT10M 100 GOTO MAIN ;****************************************************************************************** ; Program : COL_F ; Title : Lights off ; Input : ; Output : ;****************************************************************************************** COL_F ; *************************************** ; Set the color data ; *************************************** ; (1)Set RED MOVLW H'8' MOVWF TMP_C COL_F_R BSF PORTA,MLED_P NOP2 BCF PORTA,MLED_P NOP10 DECFSZ TMP_C,F GOTO COL_F_R ; (2)Set GREEEN MOVLW H'8' MOVWF TMP_C COL_F_G BSF PORTA,MLED_P NOP2 BCF PORTA,MLED_P NOP10 DECFSZ TMP_C,F GOTO COL_F_G ; (3)Set BLUE MOVLW H'8' MOVWF TMP_C COL_F_B BSF PORTA,MLED_P NOP2 BCF PORTA,MLED_P NOP10 DECFSZ TMP_C,F GOTO COL_F_B RETURN ;****************************************************************************************** ; Program : COL_R ; Title : Lights red ; Input : ; Output : ;****************************************************************************************** COL_R ; *************************************** ; Set the color data ; *************************************** ; (1)Set RED MOVLW H'8' MOVWF TMP_C COL_R_R BSF PORTA,MLED_P NOP10 BCF PORTA,MLED_P NOP2 DECFSZ TMP_C,F GOTO COL_R_R ; (2)Set GREEEN MOVLW H'8' MOVWF TMP_C COL_R_G BSF PORTA,MLED_P NOP2 BCF PORTA,MLED_P NOP10 DECFSZ TMP_C,F GOTO COL_R_G ; (3)Set BLUE MOVLW H'8' MOVWF TMP_C COL_R_B BSF PORTA,MLED_P NOP2 BCF PORTA,MLED_P NOP10 DECFSZ TMP_C,F GOTO COL_R_B RETURN ;****************************************************************************************** ; Program : COL_G ; Title : Lights green ; Input : ; Output : ;****************************************************************************************** COL_G ; *************************************** ; Set the color data ; *************************************** ; (1)Set RED MOVLW H'8' MOVWF TMP_C COL_G_R BSF PORTA,MLED_P NOP2 BCF PORTA,MLED_P NOP10 DECFSZ TMP_C,F GOTO COL_G_R ; (2)Set GREEEN MOVLW H'8' MOVWF TMP_C COL_G_G BSF PORTA,MLED_P NOP10 BCF PORTA,MLED_P NOP2 DECFSZ TMP_C,F GOTO COL_G_G ; (3)Set BLUE MOVLW H'8' MOVWF TMP_C COL_G_B BSF PORTA,MLED_P NOP2 BCF PORTA,MLED_P NOP10 DECFSZ TMP_C,F GOTO COL_G_B RETURN ;****************************************************************************************** ; Program : COL_B ; Title : Lights blue ; Input : ; Output : ;****************************************************************************************** COL_B ; *************************************** ; Set the color data ; *************************************** ; (1)Set RED MOVLW H'8' MOVWF TMP_C COL_B_R BSF PORTA,MLED_P NOP2 BCF PORTA,MLED_P NOP10 DECFSZ TMP_C,F GOTO COL_B_R ; (2)Set GREEEN MOVLW H'8' MOVWF TMP_C COL_B_G BSF PORTA,MLED_P NOP2 BCF PORTA,MLED_P NOP10 DECFSZ TMP_C,F GOTO COL_B_G ; (3)Set BLUE MOVLW H'8' MOVWF TMP_C COL_B_B BSF PORTA,MLED_P NOP10 BCF PORTA,MLED_P NOP2 DECFSZ TMP_C,F GOTO COL_B_B RETURN ;****************************************************************************************** ; Program : COL_W ; Title : Lights white ; Input : ; Output : ;****************************************************************************************** COL_W ; *************************************** ; Set the color data ; *************************************** ; (1)Set RED MOVLW H'8' MOVWF TMP_C COL_W_R BSF PORTA,MLED_P NOP10 BCF PORTA,MLED_P NOP2 DECFSZ TMP_C,F GOTO COL_W_R ; (2)Set GREEEN MOVLW H'8' MOVWF TMP_C COL_W_G BSF PORTA,MLED_P NOP10 BCF PORTA,MLED_P NOP2 DECFSZ TMP_C,F GOTO COL_W_G ; (3)Set BLUE MOVLW H'8' MOVWF TMP_C COL_W_B BSF PORTA,MLED_P NOP10 BCF PORTA,MLED_P NOP2 DECFSZ TMP_C,F GOTO COL_W_B RETURN ;****************************************************************************************** ; Program : RES-MLED ; Title : Reset PL9823 ; Input : ; Output : ; Description : Wait more than 50 microseconds (more than 400 step when the 32MHz) ;****************************************************************************************** RES_MLED BCF PORTA,MLED_P ; MOVLW H'64' MOVWF TMP_LP1 RES_MLED1 MOVLW H'64' MOVWF TMP_LP2 DECFSZ TMP_LP2,F GOTO $-1 DECFSZ TMP_LP1,F GOTO RES_MLED1 RETURN ;************************************************************************************ ; Function Name : WAT10M ; Title : Wait 10[m] ; Input : W-reg ; Output : ;************************************************************************************ WAT10M ; MOVLW H'64' MOVWF WAT1M1 WAT10MA CALL TIMER DECFSZ WAT1M1,F GOTO WAT10MA RETURN ;************************************************************************************ ; Function Name : TIMER ; Title : Wait 0.01[S] ; Input : ; Output : ;************************************************************************************ TIMER ; ******************************************************* ; 1.Define T1CON(TIMER1 CONTROL REGISTER) Register ; T1CON(7-6) TMR1CS1,TMR1CS0: Timer1 Clock Source Select bits ; 11 =Timer1 clock source is Capacitive Sensing Oscillator (CAPOSC) ; 10 =Timer1 clock source is pin or oscillator: ; If T1OSCEN = 0: ; External clock from T1CKI pin (on the rising edge) ; If T1OSCEN = 1: ; Crystal oscillator on T1OSI/T1OSO pins ; 01 =Timer1 clock source is system clock (FOSC) ; 00 =Timer1 clock source is instruction clock (FOSC/4) ; T1CON(5-4) T1CKPS1,T1CKPS0: Timer1 Input Clock Prescale Select bits ; 11 = 1:8 Prescale value ; 10 = 1:4 Prescale value ; 01 = 1:2 Prescale value ; 00 = 1:1 Prescale value ; T1CON(3) T1OSCEN: LP Oscillator Enable Control bit ; 1 = Dedicated Timer1 oscillator circuit enabled ; 0 = Dedicated Timer1 oscillator circuit disabled ; T1CON(2) T1SYNC: Timer1 External Clock Input Synchronization Control bit ; TMR1CS1,TMR1CS0 = 1X ; 1 = Do not synchronize external clock input ; 0 = Synchronize external clock input with system clock (FOSC) ; TMR1CS1,TMR1CS0 = 0X ; This bit is ignored. Timer1 uses the internal clock when TMR1CS<1:0> = 1X. ; T1CON(1) Unimplemented: Read as e0f ; T1CON(0) TMR1ON: Timer1 On bit ; 1 = Enables Timer1 ; 0 = Stops Timer1 ; Clears Timer1 Gate flip-flop ; ******************************************************* SELBANK 0 ; SET BANK0 MOVLW B'00110001' MOVWF T1CON ; ******************************************************* ; 2.Define T1GCON (TIMER1 GATE CONTROL REGISTER) Register ; T1GCON(7) TMR1GE: Timer1 Gate Enable bit ; If TMR1ON = 0: ; This bit is ignored ; If TMR1ON = 1: ; 1 = Timer1 counting is controlled by the Timer1 gate function ; 0 = Timer1 counts regardless of Timer1 gate function ; T1GCON(6) T1GPOL: Timer1 Gate Polarity bit ; 1 = Timer1 gate is active-high (Timer1 counts when gate is high) ; 0 = Timer1 gate is active-low (Timer1 counts when gate is low) ; T1GCON(5) T1GTM: Timer1 Gate Toggle Mode bit ; 1 = Timer1 Gate Toggle mode is enabled ; 0 = Timer1 Gate Toggle mode is disabled and toggle flip-flop is cleared ; Timer1 gate flip-flop toggles on every rising edge. ; T1GCON(4) T1GSPM: Timer1 Gate Single-Pulse Mode bit ; 1 = Timer1 gate Single-Pulse mode is enabled and is controlling Timer1 gate ; 0 = Timer1 gate Single-Pulse mode is disabled ; T1GCON(3) T1GGO/DONE: Timer1 Gate Single-Pulse Acquisition Status bit ; 1 = Timer1 gate single-pulse acquisition is ready, waiting for an edge ; 0 = Timer1 gate single-pulse acquisition has completed or has not been started ; This bit is automatically cleared when T1GSPM is cleared. ; T1GCON(2) T1GVAL: Timer1 Gate Current State bit ; Indicates the current state of the Timer1 gate that could be provided to TMR1H:TMR1L. ; Unaffected by Timer1 Gate Enable (TMR1GE). ; T1GCON(1-0) T1GSS1,T1GSS0: Timer1 Gate Source Select bits ; 00 = Timer1 Gate pin ; 01 = Timer0 overflow output ; 10 = Comparator 1 optionally synchronized output (SYNCC1OUT) ; 11 = Comparator 2 optionally synchronized output (SYNCC2OUT) ; ******************************************************* MOVLW B'00000000' MOVWF T1GCON ; ******************************************************* ; 3.Define TMR1 Register ; ******************************************************* ; TMR1 data ( OSC:16MHz, FOSC/4, 1:8 Prescale value, 0.01[S];100Hz ) ; 10mS(100Hz): 16MHz / 4(FOSC/4) / 8(Prescale) / 100(100Hz)==> 0d5,000(Count) ==> 0x1388(Count) ; TMR1 = 0xFFFF - 0x1388 ==> 0xEC77 ; TMR1 data ( OSC:32MHz, FOSC/4, 1:8 Prescale value, 0.01[S];100Hz ) ; 10mS(100Hz): 32MHz / 4(FOSC/4) / 8(Prescale) / 100(100Hz)==> 0d10,000(Count) ==> 0x2710(Count) ; TMR1 = 0xFFFF - 0x2710 ==> 0xD8EF ; TMR1 data ( OSC:16MHz, FOSC/4, 1:8 Prescale value, 0.1[S];10Hz ) ; 100mS(10Hz): 16MHz / 4(FOSC/4) / 8(Prescale) / 10(10Hz) ==> 0d50,000(Count) ==> 0xC350(Count) ; TMR1 = 0xFFFF - 0xC350 ==> 0x3CAF ; TMR1 data ( OSC:16MHz, FOSC/4, 1:1 Prescale value, 0.001[S];1000Hz ) ; 1mS(1000Hz): 16MHz / 4(FOSC/4) / 1(Prescale) / 1000(Hz)==> 0d4,000(Count) ==> 0x0FA0(Count) ; TMR1 = 0xFFFF - 0x0FA0 ==> 0xF05F ; TMR1 data ( OSC:32MHz, FOSC/4, 1:2 Prescale value, 0.001[S];1000Hz ) ; 1mS(1000Hz): 32MHz / 4(FOSC/4) / 2(Prescale) / 1000(Hz)==> 0d4,000(Count) ==> 0x0FA0(Count) ; TMR1 = 0xFFFF - 0x0FA0 ==> 0xF05F MOVLW H'D8' MOVWF TMR1H MOVLW H'EF' MOVWF TMR1L ; ******************************************************* ; 4.Timer ; ******************************************************* BCF PIR1,TMR1IF BTFSS PIR1,TMR1IF GOTO $-1 RETURN END