1. If you're going to use the internal 8MHz oscillator, then you need to first conffigure it by writing to the OSCCON register.

OSCCON = %01110000 ' INTRC = 8MHz

DEFINE OSC 8 only tells PBP you're using an 8MHz oscillator and to adjust timing to work at this speed. It doesn't configure the internal osc on the 16F88 for 8MHz.

2. If you use the upper 4-bits of PORTB for LCD data, then you can't use any of "the same pins" for your remaining LCD control lines.

Define LCD_DREG PORTB
Define LCD_DBIT 4 <-- use RB4 to RB7 for LCD data
Define LCD_RSREG PORTB
Define LCD_RSBIT 5 <-- already being used for data
Define LCD_EREG PORTB
Define LCD_EBIT 6 <-- already being used for data

3. Always start out with DEFINE LCD_COMMANDUS 2000 in the top section of your code. You can tinker with the value, and for some LCDs, maybe even eliminate it altogether, but I recommend at least starting out with it in there. Some LCDs are slow. Some are fast.

The example below has been tested with a 16F88 and 2-line LCD.

@ DEVICE INTRC_OSC, LVP_OFF, WDT_OFF, MCLR_OFF

DEFINE OSC 8
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 2
DEFINE LCD_COMMANDUS 2000

OSCCON = %01110000 ' INTRC = 8MHz

Pause 500 ' Wait for LCD to startup

loop:
Lcdout $fe, 1, "Hello" ' Display Hello
Pause 500 ' Wait .5 second

Lcdout $fe, $C0, "World"
Pause 500 ' Wait .5 second

Goto loop ' Do it forever