18f4520 es la version ampliada del 452 y tiene 32k, en cuanto a la memoria externa para programa no hay manera
No , esto no es así, es un error. El 18F452 y el 18F4520 ambos tienen
32KBytes o
16KWords. Las diferencias estan en otras cosas, como en mayor cantidad de A/Ds de parte del 18F4520, oscilador interno, mayor velocidad de programación, la posibilidad de usar el RA6 y RA7 , modulo de comparación multiplexable y alguna otra cosa que se me está escapando.
Pablo, te sugiero reveas tu código, trates de reutilizar tu código lo más posible agrupando en funciones que contengan varias cosas juntas. Los menúes, si son texto, definelos como constantes en ROM en vez de que sean una mera asignación de código en el programa. Definirlos como constante en ROM, te garantiza (si el compilador funciona bien) que tengas 1 caracter por cada byte de la memoria de programa. Si armas el menú por código, te verás en graves problemas de optimización.
Si aún así no te cierra la idea, te sugiero bajes la Product Selection Guide de la página de Microchip, ahí verás toda la gama de pics y podrás elegir la que mejor se ajuste a tu aplicación.