He terminado de entender completamente el funcionamiento de tu diseño, y tengo una idea para el programa. En vez de activar de a una fila y cargar los datos en las columnas, podes cargar los datos en las filas y activas de a una columna. De esta forma va a ser mas facil poner los datos en los leds. Aunque va a demandar una velocidad mayor de actualizacion, ya que se tendrian 40 barras de 7 leds contra 7 barras de 40 leds. Pero como el micro esta dedicado solamente a la matriz de leds no va a ser problema. Deve correr a la maxima velocidad, 20MHz.
Tambien tendrias que modificar los datos de la eeprom, almacenando los caracteres en bytes consecutivos, no en saltos de a 8 como haces ahora. Despues voy a hacer un grafiquito para que lo entiendas mejor.
Modificando eso, el programa seria muy simple:
Para empezar cargas un 1 en el registro de desplazamiento, la idea es que este activo solamente un pin de todo el registro (para activar una sola columna).
Luego lees un byte en la eeprom, lo negas(porque el led se activaria con un 0) y lo pones en el puerto b.
Haces una pausa de unos 350us. (despues de esta pausa ya se mostro la primer columna)
Despues lo unico que tenes que hacer es darle pulsos de reloj al registro (con el pin de data a 0), leer el dato en la eeprom, negarlo, ponerlo en el puerto b, esperar los 350us y volver a repetir hasta que hayas mostrado las 40 columnas.
Con esto conseguirias mostrar el texto, pero no se moveria. Ya voy a explicar como hacer para que se desplaze.
Lo que vas a conseguir con estos cambios es una forma muy sencilla de mostrar los datos. Si queres probrar a hacer alguna de estas modificaciones, hacelas en una copia de tus archivos originales, por si despues queres volver a tu diseño y tu programa.
Tengo que buscar un compilador de basic(no lo tengo ahora porque no estoy en mi compu), asi te puedo ayudar con codigo testeado.