Stap 6: De tank bits verschuiven
Met de tekens nu op het scherm, kunt u hun bits wijzigen. Uiteindelijk hebt bel de createChar (index, byteArray) functie om de bits op de LCD-, en dat betekent dat je moet hebben een scala van acht byte per teken. Ik ben met behulp van vier aangepaste tekens, dus ik vier byte-matrices gebruikte.byte sprite0 [8];
byte sprite1 [8];
byte sprite2 [8];
byte sprite3 [8];
Binnen de loop nam ik de bitsgewijze modulo positie te komen met een offset. Daarna, ging ik een regel op een tijd door middel van de tank. Hier komt de efficiëntie van de lange ints meespelen. Ten eerste zou ik de lange int kopiëren van de statische tank tekening naar een lokale variabele. Dan zou ik de hele lange int verschuiving terug door het aantal bits die ik nodig zou hebben.
int. shiftbits = (vergaarbak % BITS_PER_CHAR); Als (shiftbits < 0) {shiftbits += BITS_PER_CHAR;}
voor (int y = 0; y < 8; y ++)
{
lange lval = tankImg [y];
...
lange lshifted = lval << (BITS_PER_CHAR-shiftbits);
sprite0 [y] (byte) = ((lshifted >> (3 * BITS_PER_CHAR)) & B011111);
sprite1 [y] (byte) = ((lshifted >> (2 * BITS_PER_CHAR)) & B011111);
sprite2 [y] (byte) = ((lshifted >> (1 * BITS_PER_CHAR)) & B011111);
sprite3 [y] (byte) = ((lshifted >> (0 * BITS_PER_CHAR)) & B011111);
}
Ten slotte, wanneer alle de byte-matrices had zijn berekend, ik zou hen over duwen naar het LCD-scherm.
lcd.createChar (0, sprite0);
lcd.createChar (1, sprite1);
lcd.createChar (2, sprite2);
lcd.createChar (3, sprite3);
Als u waren dit door het verschuiven van bytes computing, zou u moeten ervoor zorgen dat u "carry" het laatste stukje naar de volgende byte horizontaal, maar aangezien ik blijf binnen de 32-bits lange int met elke ronde, de processor doet de bit die uitvoering voor mij.
Aan het eind van de lus, ik verplaatsen van de tank, en vervolgens een lus rond aan het begin, nadat de tank uit het scherm.
++ vergaarbak;
Als (vergaarbak > = 50) {vergaarbak = -15;}
...
delay(100);
Tot slot zie je de vertraging. Het is belangrijk om het gebruik van een vertraging die geschikt is voor uw LCD. Mijn hobby LCD is blauw met witte verlichting, en het verdwijnt heel langzaam, dus een korte vertraging met een heleboel blurriness eindigen zou.