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.
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
pic used is a 16F882.
Bookmarks