Problem solved.

I originally had my TRIS statements immediately following the port definitions. By making the first line of my code a PAUSE 2500 statement followed by the TRIS etc, the system now works.

It seems the LCD wants to see floating drive for something more than one second before it is happy. With this approach I can eliminate all my initialise code and just rely on LCDOUT $FE, $01 to somehow do it for me.

The following code now works on both slow start and fast start power supplies as well as a direct MCLR.

define osc 20
define loader_used 1
Define LCD_DREG PORTD
Define LCD_DBIT 0
Define LCD_RSREG PORTD
Define LCD_RSBIT 5
Define LCD_EREG PORTD
Define LCD_EBIT 4
DEFINE LCD_LINES 2
DEFINE LCD_BITS 4
DEFINE LCD_RWREG PORTD 'LCD read/write port
DEFINE LCD_RWBIT 6 'LCD read/write bit
DEFINE LCD_COMMANDUS 2000 'Command delay time in us
DEFINE LCD_DATAUS 100 'Data delay time in us
define char_pacing 200
DEFINE SHIFT_PAUSEUS 100

@ Device pic16F877A, HS_OSC, BOD_ON, LVP_OFF, PWRT_ON, WDT_ON, PROTECT_OFF
'@__config_HS_OSC &_BOD_OFF &_PWRT_ON &_WDT_ON &_PROTECT_OFF &_LVP_OFF

'**************** hardware definition **************
'PortA
Function var porta.0 'pin 2 analog from 12 position switch IN
RunStop var porta.1 ' SWp6 to 877p3 Front panel toggle IN
Enter var porta.2 ' SWp4 to 877p4 Selects current value IN
Up var porta.3 ' SWp2 to 877p5 Advances selection IN
AutoMan var porta.4 ' SWp7 to 877p6 Local/Remote control IN
Down var porta.5 ' SWp3 to 877p7 Reduces selection IN
'TRISA = %00011111
'CMCON = %00000111 ' comparators disabled
'ADCON0 = %11000000 ' int RC clock, ADC disabled
'ADCON1 = %11001110 ' port 0 analog, all others digital

'PortB
GMData var portb.0 'bidirecional data to/from Master Controller
GMStrobe1 var portb.1 'signals MC that GM needs attention
GMStrobe2 var portb.2 'signals GM that MC has data
GMSpare var portb.3 'a PCB trace between PeeWee50 pin 9 and 877p36
LED2 var portb.4 'front panel LED2
N2 var portb.5 'Nitrogen solenoid
SClk var portb.6 'Intersema SClk OUT to MS5534 & 5535
DIn var portb.7 'Intersems Data In OUT from 877a to MS5534 & 5535

'TRISB = %00001111
'PortB = %00000000

'PortC
CO2 var portc.0 'CO2 solenoid
O2 var portc.1 'O2 solenoid
MClk var portc.2 'MClk to Intersema PWM2 32678 Hz OUT to MS5534/5
Vent var portc.3 'Vent/dump solenoid
Delvry var portc.4 'delivery solenoid controls final delivery
SpareSol var portc.5 'spare solenoid OUT
TxD var portc.6 'Boot loader and RS232 OUT
RxD var portc.7 'Boot & RS232 IN
'TRISC = %10000000
'PortC = %00000000

'PortD
DB4 var portd.0 'Data bit 4 to LCD
DB5 var portd.1 'Data bit 5 to LCD
DB6 var portd.2 'Data bit 6 to LCD
DB7 var portd.3 'Data bit 7 to LCD
LCDEnable var portd.4 'LCD ENABLE line OUT to LCD
RegSel var portd.5 'LCD Register Select OUT to LCD
ReadWrite var portd.6 'LCD Read/Write line OUT to LCD
LED1 var portd.7 'Front Panel LED1
'TRISD = %00000000
''PortD = %00110000
'PortD = %00000000

'PortE
ClrEntry var porte.0 'SWp5 to 877p8 Clears entry on front panel??? IN
Dout1 var porte.1 'Input from 14 bar Intersema
Dout2 var porte.2 'Input from 1 bar Intersema
'TRISE = %11111111
'PortE = %00000000

'******************** Variable assignments ************************
'OPTION_REG = %10001111 ' no pullups, prescaler to WDT /128

A var byte ' General purpose Variable
B var byte ' General purpose Variable
C var byte ' General purpose Variable
I var byte
J var byte
K var byte
FuncSel var byte ' Switch position after decoding ADC value
ADCval var word
LoopCtr var byte
U var word
V var word
W var word
X var word
Y var word
Z var word
RunFlag var bit
C1 var word ' Pressure sensitivity
C2 var word ' Pressure Offset
C3 var word ' Temp Coef of pressure sensitivity
C4 var word ' Temp Coef of Pressure Offset
C5 var word ' Reference temperature
C6 var word ' Temp coef of Temp reading
D1 var word ' raw word from 5535
D2 var word ' raw word from 5535
W1 var word ' coefficient from 5535
W2 var word ' coefficient from 5535
W3 var word ' coefficient from 5535
W4 var word ' coefficient from 5535
dT var word ' intermediate calc value
UT1 var word ' Calibration temperature
Temp var word ' Sensor temperature
Tempnegflag var bit ' set if temperature is below zero C
Press var word ' Pressure
Offset var word '
Sens var word '


pause 2500 '
TRISA = %00011111
CMCON = %00000111 ' comparators disabled
ADCON0 = %11000000 ' int RC clock, ADC disabled
ADCON1 = %11001110 ' port 0 analog, all others digital
TRISB = %00001111
PortB = %00000000
TRISC = %10000000
PortC = %00000000
TRISD = %00000000
PortD = %00000000
TRISE = %11111111
PortE = %00000000


Loop:
lcdout $FE, $01
LCDOUT "Hello "
pause 500
lcdout $FE, $01, $FE, $C0
lcdout "World"
pause 500
goto loop

end


thanks to all who helped.

Cheers
Brian