;
; The eight LED displays or columns are 'scanned' one at a time
; for a 12.5% LED duty cycle. Each Port B pin may be sourcing
; current (CC driver) to segments up to 87.5% of the time.
;
ISR_LED bsf STATUS,RP0 ; bank 1 (RP1 already clear) |B1
movlw b'11111111' ; |B1
movwf TRISB ; turn off LED display |B1
bcf STATUS,RP0 ; bank 0 (RP1 already clear) |B0
xorwf BITPOS,W ; invert column/float bit |B0
movwf PORTB ; new output pattern |B0
; (only 1 output is ever low)
movf BUFPTR,W ; |B0
movwf FSR ; setup indirect address |B0
movf INDF,W ; get digit segment data |B0
andwf BITPOS,W ; AND the float/column bit |B0
btfss STATUS,Z ; turn 'float' segment on? |B0
iorlw b'10000000' ; yes |B0
iorwf BITPOS,W ; pick up the float/column bit |B0
iorwf INDF,W ; pick up digit segment bits |B0
xorlw b'11111111' ; invert all bits |B0
bsf STATUS,RP0 ; bank 1 (RP1 already clear) |B1
movwf TRISB ; display new digit |B1
;
bcf STATUS,RP0 ; bank 0 (RP1 already clear) |B0
incf BUFPTR,F ; increment buffer pointer |B0
bcf BUFPTR,3 ; keep in 30..37 LEDBUF range |B0
rlf BITPOS,W ; rotate the float/column bit |B0
rlf BITPOS,F ; |B0