Few suggestions
  • 1. add an external EEPROM to store your Text and ARRAY variables to save code space BUT BEFORE look if all of them can fit in the internal one.

    2. do some Subroutine with all command you call often as I2CREAD, SEROUT, LCDOUT. Just call those with all your specific need (variables, EEPROM address range for text....)

    3. Use internal USART(if your actual design permit) with HSERIN command

    4. Use BRANCHL instead of SELECT CASE Bmenu (line 302)

    5. this
    Code:
    	for X = 1 to 16
    		LCDout "."
    	Pause 30
    	Next X
    could be LCDOUT REP "."\16

there's probably other things but begin with it