HI wildbilly,

Sounds like your up to speed with me now.

I've been bogged down all week with work, so I'm kind of glad you had problems.
I'm sure it's not the same from your point of view.

So anyhow, I've found that the resistors used to select each display seem to act as a filter with the extra capacitance of the ribbon. The enable line gets rounded off pretty bad.

Fortunately, with "HighJack", we're not limited to just one Enable pin anymore.
We can have as many as needed. And that's the next step.

We'll use the previous "Disable" pins as the "Enable" line for each LCD. The resistors are no longer needed. Then instead of Disabling the display you don't want to write to, you'll Enable the one's you do want.

This takes a few modifications, but it's not too bad.

First, in the main program, change the LCD definitions to this ...
Code:
;----[ Change these to match your LCD ]---------------------------------------
LCD_DB4   VAR PORTB.0
LCD_DB5   VAR PORTB.1
LCD_DB6   VAR PORTB.2
LCD_DB7   VAR PORTB.3
LCD_RS    VAR PORTB.4

LCD_E1    VAR PORTB.5
LCD_E2    VAR PORTB.6
LCDEN     VAR BYTE BANK0  ; Enable bits for each LCD
  LCD1EN  VAR LCDEN.0
  LCD2EN  VAR LCDEN.1
   
LCD_Lines     CON 2     ; # of Lines on LCD,  1 or 2 (Note: use 2 for 4 lines)
LCD_DATAUS    CON 50    ; Data delay time in us 
LCD_COMMANDUS CON 2000  ; Command delay time in us 

INCLUDE "LCD_AnyPin.pbp"  ; *** Include MUST be AFTER LCD Pin assignments ****

LOW LCD_E1         ; Start with Enables OUTPUT LOW
LOW LCD_E2
Next, in the LCD_AnyPin file, there's a section that says "DO NOT Change anything below this line".
Change it to this ...
Code:
ASM
LCD_Port_HNIB  macro           ; Port definition for LCD High Nibble
    Vbit   LCDCDFLAG, _LCD_RS  ; Select Command/Data register
    DelayUS  2
    NOP
    Vpin   4, _LCD_DB4         ; Put the High Nibble on the bus
    Vpin   5, _LCD_DB5
    Vpin   6, _LCD_DB6
    Vpin   7, _LCD_DB7
    DelayUS  2

    btfsc    _LCD1EN           ; Set enable(s) High
    bsf      _LCD_E1
    btfsc    _LCD2EN
    bsf      _LCD_E2
    DelayUS  5                 ; hold for 5us
    bcf      _LCD_E1           ; Enable(s) Low - Clocks data
    bcf      _LCD_E2
  endm
;-----------------------    
LCD_Port_LNIB  macro           ; Port definition for LCD Low Nibble 
    Vpin   0, _LCD_DB4         ; Put the Low Nibble on the bus
    Vpin   1, _LCD_DB5
    Vpin   2, _LCD_DB6
    Vpin   3, _LCD_DB7
    DelayUS  2

    btfsc    _LCD1EN           ; Set enable(s) High
    bsf      _LCD_E1
    btfsc    _LCD2EN
    bsf      _LCD_E2
    DelayUS  5                 ; hold for 5us
    bcf      _LCD_E1           ; Enable(s) Low - Clocks data
    bcf      _LCD_E2
  endm
ENDASM
And finally, also in the LCD_AnyPin file, change LCD_Init to this ...
Code:
;----[Initialize the LCD]-------------------(DO NOT Change)-------------------
LCD_Init:
@   OutputPort  LCD_Port_HNIB    ; Set LCD bus to OUTPUT
    LCDEN = 1 + 2
    LOW LCD_RS                   ; Start with RS LOW
    Char = 3   : gosub  LCDsendShortCOM : @  DelayUS 6000
                 gosub  LCDsendShortCOM : @  DelayUS 1000
                 gosub  LCDsendShortCOM : @  DelayUS 1000
    Char = 2   : gosub  LCDsendShortCOM : @  DelayUS 1000  ; Start 4-bit mode
    Char = $28 : gosub  LCDsendCOM  ; Function Set, 4-bit, 2-line, 5x7
    Char = $0C : gosub  LCDsendCOM  ; Display ON
    Char = $01 : gosub  LCDsendCOM  ; Clear Screen
    Char = $06 : gosub  LCDsendCOM  ; Entry Mode
    LCD_Initialized = 1             ; LCD has been Initialized
goto LCDAfterInit

Click image to enlarge.

P.S. Until now I thought that 6 inches was the limit for LCD's. Just because somebody told me that once.
This is really cool. Thanks for the interesting things to play with.<hr>

ADDED: Oops, forgot to show you how to use it..
Code:
LCDEN = 1
LCDOUT $FE,1, "Display 1"

LCDEN = 2
LCDOUT $FE,1, "Display 2"

LCDEN = 1 + 2
LCDOUT $FE,$C0, "Both Displays"