;
; Dim red, grn, blu As Byte ' duty cycle, 0..255
; Dim dcy As Byte ' duty cycle counter, 0..255
; Dim shadow As Byte '
;
; Interrupt rgb_interrupt()
; t0if = 0 ' clear timer0 interrupt flag
; inc(dcy) ' increment duty cycle
; if dcy = 0 ' if new period
; shadow = %01110000 ' set RC6..RC4 shadow bits
; endif '
; if red = dcy then '
; shadow.bit6 = 0 ' turn off RC6 shadow bit
; endif '
; if grn = dcy then '
; shadow.bit4 = 0 ' turn off RC4 shadow bit
; endif '
; if blu = dcy then '
; shadow.bit5 = 0 ' turn off RC5 shadow bit
; endif '
; LATC = shadow ' update port from shadow
; End Interrupt
;
rgb_interrupt ; 14 words
bcf INTCON,T0IF ; clear timer 0 interrupt flag
movlw b'01110000' ;
infsnz dcy,F ; new period? no, skip, else
movwf shadow ; set led bits in shadow
movf dcy,W ; wreg = duty cycle, 0..255
cpfsgt red ; (F) - (W), skip if (F) > (W)
bcf shadow,6 ; clear bit if (F) <= (W)
cpfsgt grn ; grn - dcy, skip if grn > dcy
bcf shadow,4 ; clear bit if grn <= dcy
cpfsgt blu ; blu - dcy, skip if blu > dcy
bcf shadow,5 ; clear bit if blu <= dcy
movff shadow,LATC ; update port c from shadow
retfie FAST ;