Lo siento, quizás debí decir "Mi experiencia ha sido..." y no lo de "tienes que cambiear...". Lo siento.
Bueno, pues te cuento lo que me ha ocurrido a mí. Es cierto que a veces funcionaba en modo fast, pero al intentar hacer un test de los displays no se encendían. Por contra, cuando borré lo de fast (osea, en modo slow por defecto), si que funciona correctamente. Entre otras cosas porque los tiempos de escritura y eso siempre van a estar dentro del rango aun en el peor de los casos.
Lo del test se hace poniendo a 1 el bit C3 del byte de control (a eso me refería con C1 también). Prueba con el test en Fast.
En cuanto al proteus te explico el fallo que tiene. Más bien, lo que difiere con la realidad.
Tu has colocado uno de esos displays que traen dos y los vas multiplexando. Bien. Cuando se quiere conectar dos displays al SAA1064 va cada uno a un "puerto" (uno a P1-P8 y el otro a P9-16). Mira el montaje que viene en el data. Por lo que no hay que multiplexar ni nada de eso.
Supongo que tu en proteus tienes conectados esos dos (el módulo) a la salida de un "puerto" y entonces te funcionará, pero no como debe.
Fíjate en tu ejemplo de 4 displays. Tu pones en el código:
i2c_start();
i2c_write(0b01110110); // Dirección (Escritura)
i2c_write(0b00000000); // Instrucción
i2c_write(0b01000111); // Control
i2c_write(disp[0]); ESTO SERIA PARA EL DISPLAY 1
i2c_write(disp[1]); ESTO SERIA PARA EL 2
i2c_write(disp[2]); PARA EL 3
i2c_write(disp[3]); PARA EL 4
i2c_stop();
Bien, pues si te fijas si haces esto físicamente te va a mostrar 0213 tal y como tú lo tienes montado. Es decir, por P1-P8 salen el display 1 y el 3 (1+3) y por P9-P16 el display 2 y el 4 (2+4).
Pues ahí es donde está el fallo. Si te fijas, lo que tu escribes para el display 2 (i2c_write(disp[1]); ESTO SERIA PARA EL 2) lo saca por P1-P8 en lugar de por P9-P16 que es por donde debería.
Ese es el fallo.
Buenooooo, ya dejo de escribir...
Saludos y un abrazo!