You do not need a seperate hardware timer for each led. A single timer would do the job.Adapt the following code to suit your needs.
pic used is a 16F882.Code:#config __CONFIG _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_ON & _BOR_ON & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_ON & _XT_OSC __CONFIG _CONFIG2, _WRT_OFF & _BOR40V #endconfig TIMER0 VAR BYTE TIMER1 VAR BYTE TIMER2 VAR BYTE TIMER3 VAR BYTE TIMER4 VAR BYTE TIMER5 VAR BYTE TIMER6 VAR BYTE TIMER7 VAR BYTE LED0 VAR PORTB.0 LED1 VAR PORTB.1 LED2 VAR PORTB.2 LED3 VAR PORTB.3 LED4 VAR PORTB.4 LED5 VAR PORTB.5 LED6 VAR PORTB.6 LED7 VAR PORTB.7 wsave VAR BYTE $70 SYSTEM ssave VAR BYTE $71 SYSTEM psave VAR BYTE $72 SYSTEM GOTO START: DEFINE INTHAND MYINT ASM MYINT movwf wsave ; <=2k codespace swapf STATUS,W ; <=2k codespace clrf STATUS ; <=2k codespace movwf ssave ; <=2k codespace movf PCLATH,W ; <=2k codespace movwf psave ; <=2k codespace TSTF _TIMER0 ;test timer0 BTFSS STATUS,Z ;skip if zero DECF _TIMER0,F ;decrement timer 0 TSTF _TIMER1 BTFSC STATUS,Z DECF _TIMER1,F TSTF _TIMER2 BTFSC STATUS,Z DECF _TIMER2,F TSTF _TIMER3 BTFSC STATUS,Z DECF _TIMER3,F TSTF _TIMER4 BTFSC STATUS,Z DECF _TIMER4,F TSTF _TIMER5 BTFSC STATUS,Z DECF _TIMER5,F TSTF _TIMER6 BTFSC STATUS,Z DECF _TIMER6,F TSTF _TIMER7 BTFSC STATUS,Z DECF _TIMER7,F BCF PIR1,0 MOVF psave,W MOVWF PCLATH SWAPF ssave,W MOVWF STATUS SWAPF wsave,F SWAPF wsave,W RETFIE ENDASM START: ANSEL=0 'all pins are digital ANSELH=0 TRISB=$00 'all outputs PORTB=0 OPTION_REG=$80 T1CON=$01 'interrupt every 65.5 ms PIE1=$01 'enable timer 1 interrupts INTCON=$C0 'enable interrupts AGAIN: IF TIMER0=0 THEN TIMER0=10 TOGGLE LED0 ENDIF IF TIMER1=0 THEN TIMER1=9 TOGGLE LED1 ENDIF IF TIMER2=0 THEN TIMER2=5 TOGGLE LED2 ENDIF IF TIMER3=0 THEN TIMER3=7 TOGGLE LED3 ENDIF IF TIMER4=0 THEN TIMER4=12 TOGGLE LED4 ENDIF IF TIMER5=0 THEN TIMER5=6 TOGGLE LED5 ENDIF IF TIMER6=0 THEN TIMER6=8 TOGGLE LED6 ENDIF IF TIMER7=0 THEN TIMER7=11 TOGGLE LED7 ENDIF GOTO AGAIN


Adapt the following code to suit your needs.


Bookmarks