I'm trying to get Les Johnsons 2 segment LED multiplexer running - however it's not compiling, rather than using an include I'm putting his code directly into my program as I have to modify it for the chip I'm using (PIC16F88) and find it more conveniant to have one file instead of 2.

The compile issue is coming up on line 109 - which is a blank line just after Les's code finishes and mine begins, it says it's a syntax error - when it's just a blank line??? If I delete the line it says line 108 has a syntax error.

I also cannot see how it gets to the Display: section of the code as i can't see any gosub pointing it there I'm using code designer lite and PBP2.46 ANy help you could give me would be greatly appreciated.


' Common Cathode seven segment display multiplexer Include file
' Displays the contents of the variable D_NUMBER on TWO common cathode displays
' using a TMR0 interrupt every 13ms (assuming a 20Mhz oscillator)
' ************************************************** *********************

' ** Declare the Variables **
LEDS VAR BYTE ' The amount of LEDs in the display
O_C VAR BYTE ' Used by the interrupt for time sharing
D_Number VAR BYTE ' The number to display on the LEDS
DP VAR BYTE ' Position of the decimal point
Disp_Patt VAR BYTE ' Pattern to output to PortC
Num VAR BYTE[2] ' Array to hold each digits value
Digit0 VAR PORTA.2 ' Controls the first DIGIT on the LED
Digit1 VAR PORTA.3 ' Controls the second DIGIT on the LED

' ** Declare the bits and flags of the various registers **

T0IE VAR INTCON.5 ' Timer0 Overflow Interrupt Enable
T0IF VAR INTCON.2 ' Timer0 Overflow Interrupt Flag
GIE VAR INTCON.7 ' Global Interrupt Enable
PS0 VAR OPTION_REG.0 ' Prescaler division bit-0
PS1 VAR OPTION_REG.1 ' Prescaler division bit-0
PS2 VAR OPTION_REG.2 ' Prescaler division bit-0
PSA VAR OPTION_REG.3 ' Prescaler Assignment (1= assigned to WDT)
' (0= assigned to oscillator)
T0CS VAR OPTION_REG.5 ' Timer0 Clock Source Select (0=Internal clock)
' (1=External PORTA.4)
ADCON0 = %1100000 'turn ad convertor off
ADCON1 = %10000110 'Right justify result set digi
OSCCON = %01100000 'Set internal osc to 8MHz
ANSEL = %00000000


' Set TMR0 to interrupt
GIE=0 ' Turn off global interrupts
While GIE=1:GIE=0:Wend ' Make sure they are off
PSA=0 ' Assign the prescaler to external oscillator
PS0=1 ' Set the prescaler
PS1=1 ' to increment TMR0
PS2=1 ' every 256th instruction cycle
T0CS=0 ' Assign TMR0 clock to internal source
TMR0=0 ' Clear TMR0 initially
T0IE=1 ' Enable TMR0 overflow interrupt
GIE=1 ' Enable global interrupts

ON INTERRUPT GoTo Mult_Int ' Point to the interrupt handler

TRISB=0 ' Make PortB outputs
TRISA.3=0:TRISA.2=0 ' Make only the specific bits of PortB outputs

PORTB=0:PORTA=0 ' Clear PortB and PortA
O_C=0 ' Clear the time share variable

GoTo Over_MULTIPLEXER ' Jump over the subroutines

' Build up the seperate digits of variable D_NUMBER
' into the array NUM. Each LED is assigned to each array variable.
' LED-0 (right) displays the value of NUM[0]
' LED-1 (middle) displays the value of NUM[1]
' The decimal point is placed by loading the variable DP
' with the LED of choice to place the point (0..2). where 1 is the farthest right LED,
' and 0 disables the decimal point.
For LEDS=1 TO 0 STEP -1 ' Loop for 2 digits (0-99)
Disable ' Disable the interrupt while we calculate
Num[LEDS]=D_Number DIG LEDS ' Extract the seperate digits into the array
IF D_Number<10 AND LEDS=1 Then Num[LEDS]=10 ' Zero Suppression for the second digit
Enable ' Re-enable the interrupt

' Multiplexes the 2-digits
Disable ' Disable all interupts during the interrupt handler
LookUp Num[O_C],[63,6,91,79,102,109,124,7,127,103,0],Disp_Patt ' Decode the segments for the LED
' Process the first display (farthest right)
IF O_C=0 Then ' If it is our turn then
Digit1=0 ' Turn OFF the second LED
PORTB=Disp_Patt ' Place the digit pattern on portC
IF DP=1 Then PORTB.7=1 ' Check the value of DP and Turn ON the decimal point
Digit0=1 ' Turn ON the first LED
' Process the second display
IF O_C=1 Then ' If it is our turn then
Digit0=0 ' Turn OFF the first LED
PORTB=Disp_Patt ' Place the digit pattern on portC
IF DP=2 Then PORTB.7=1 ' Check the value of DP and Turn ON the decimal point
Digit1=1 ' Turn ON the second LED

O_C=O_C+1 ' Increment the time share counter
IF O_C>=2 Then O_C=0 ' If it reaches 3 or over then clear it

T0IF=0 ' Reset TMR0 interrupt flag
Resume ' Exit the interrupt
Enable ' Allow more interrupts


For b0 = b0 + 1

IF b0 > 10000 Then
D_Number = D_Number + 1
b0 = 0

IF b0 > 5000 Then
DP = 2
DP = 1

IF D_Number > 99 Then D_Number = 0