Ten eerste moet je de initialisatie van array1 niet in een repeat until loop zetten, maar daar voor.
Dat je het laatste element krijgt is logisch, de andere gillen er zo snel doorheen dat je ze niet ziet. "Str array1" verstuurt namelijk 8 bytes/64 bits achter elkaar. Door de 5 seconden pause zie je alleen de laatste byte/8 bits: array index 7
De vergelijking "Until array1[0] = array1[7]" is niet erg zinnig, je wilt toch niet continu je array overschrijven?
Dus doe het als volgt
pic basic code:
dim index as byte
...
Init:
array1[0] = 1
...
array1[7] = 255
index = 0
repeat
SHOut datapin, clockpin, LsbFirst, [array1[index]]
High latchpin
DelayMS 5000
Low latchpin
inc index
until index = 8
Voor de goede orde, de bitpatronen die je straks wilt tonen haal je uit een tabel, die staat vast ergens in je uC. Daar banjer je doorheen met behulp van één of meerdere indexen en de waarde die je daar opvist stuur je naar de ledmatrices.
De 'Str' modifier is hier totaal niet zinvol.
Als je straks telkens 5 bits uit een tabel wilt halen zul je, vanwege de eenvoud van het programma, waarschijnlijk telkens bytes gebruiken waarvan je slechts 5 bits gebruikt. Er is geen enkele reden om een byte naar een string om te zetten, shout werkt prima met bytes.
Voor 5*5*5 heb je dan 8x8x8 = 512 bytes nodig, voor RGB kun je dat nog eens met 3 vermenigvuldigen, hoewel je dan wellicht het geheugen wat 'zuiniger' kunt indelen.
Wat Arco al zegt: gebruik constanten en geen variabelen want dan gaat het echt niet lukken met een 16F877 (368 byte RAM). Die heeft wel voldoende code-geheugen om een tabel in op te slaan.