Brain, Try the changes below - you read the data out of the LCD when E is asserted. Steve Lawther Read_Data call Wait_Busy ;wait for LCD bsf STATUS, RP0 ; Select Register page 1 movlw 0xF0 ; Set port to input iorwf LCD_DATA_TRIS,W ; Only set upper half of port movwf LCD_DATA_TRIS bcf STATUS, RP0 ; Select Register page 0 bsf LCD_CNTL, RS ; Set LCD for Data mode bsf LCD_CNTL, R_W ; Setup to read bsf LCD_CNTL, E ;toggle E for LCD nop movf LCD_DATA, W ;******** bcf LCD_CNTL, E ;not here movf LCD_DATA, W ; Read upper nibble data andlw 0xF0 ; Mask out lower nibble movwf Temp bsf LCD_CNTL, E ;toggle E for LCD nop swapf LCD_DATA, W ;********** bcf LCD_CNTL, E ;not here swapf LCD_DATA, W ; Read lower nibble data andlw 0x0F ; Mask out upper nibble iorwf Temp,F ; Combine nibbles bsf STATUS, RP0 ; Select Register page 1 movlw 0x0F andwf LCD_DATA_TRIS,W movwf LCD_DATA_TRIS ; Set Port for output bcf STATUS, RP0 ; Select Register page 0 movf Temp,W ;return with read data byte in W return