Stap 9: Tank code voor 44780 / RT0802B-1 ver 2.0
/ / Deze code is voor een 44780 LCD 14-pins paneel met 2 meer pinnen voor anode/kathode terug verlichting#include < LiquidCrystal.h >
LiquidCrystal lcd (7, 8, 9, 10, 11, 12);
RS, NL, DB4, DB5, DB6, DB7
Raad van bestuur
1 = aarde
2 = Vcc
3 = pot 10k - 20k voor contrast
4 = RS
5 = RW
6 = NL
11 = D4
12 = D5
13 = D6
14 = D7
Zoek internet op 44780 voor verschillende pagina's die de bedrading in groot detail beschrijven
RW heeft worden bedraad laag om te schrijven, anders blijft het in de modus "lezen"
byte sprite0 [8];
byte sprite1 [8];
byte sprite2 [8];
byte sprite3 [8];
VOID Setup {}
de LCD's aantal kolommen en rijen instellen:
LCD.begin (8, 2);
lcd.setCursor(0,0);
LCD.Print("tankdemo");
lcd.setCursor(0,1);
LCD.Print("
memset(sprite0,7,8);
memset(sprite1,7,8);
memset(sprite2,7,8);
memset(sprite3,7,8);
lcd.setCursor(0,1);
Serial.begin(9600);
}
Nodig acht 32-bits hoeveelheden die ik voor verschuiven bits rond gebruiken kan.
Het oorspronkelijke beeld van de tank is in deze waarden.
[lange tankImg] = {}
((lange) B010000 << 10) | ((lange) B000000 << 5) | B000000 / / antenne tip
, (B010111 (lange) << 10) | ((lange) B011110 << 5) | B000000 / / top torentje
, (B001111 (lange) << 10) | ((lange) B011111 << 5) | B011110 / / torentje medio met vat
, (B000111 (lange) << 10) | ((lange) B011110 << 5) | B000000 / / torentje basis
, (B001111 (lange) << 10) | ((lange) B011111 << 5) | B010000 / / top loopvlak
, (B010000 (lange) << 10) | ((lange) B000000 << 5) | B001000
, (B010000 (lange) << 10) | ((lange) B000000 << 5) | B001000
, (B001111 (lange) << 10) | ((lange) B011111 << 5) | B010000 / / bodem, 24 pixels totaal in loopvlak het loopvlak
};
vergaarbak is de bit-gewijze positie op het scherm.
tankcharx is de character-wise positie, dus vergaarbak / 5.
Het kan het negatieve.
Vergaarbak nul is de tank aan de linkerkant van het scherm
dus tankImg bytes zijn onderverdeeld in vier aangepaste tekens
de vierde waarvan leeg bits wordt
De tank bits verschuiven op vergaarbak een, een beetje naar rechts
en als ik slim ben, de treden zijn berekend, zodat ze "draaien"
En zo verder
Want er vijf bits horizontaal per aangepaste char zijn
en de tank treden gaan elke andere, ik kan het herhalen van het origineel
tank loopvlakken basisgewicht van zelfs char posities
int vergaarbak = -15;
int tankcharx;
int tankchary = 1;
int treadx = 0;
#define BITS_PER_CHAR 6
void loop {}
tankcharx = vergaarbak / BITS_PER_CHAR;
Serial.Print ("vergaarbak =");
Serial.Print(tankx);
Serial.Print ("tankcharx =");
Serial.println(tankcharx);
Eerste uitlevering, geen rotatie van loopvlakken
Als ((tankx % BITS_PER_CHAR) == 0) {}
Volledige verschuiving is ingeschakeld, moet het tekenen van een leeg waar de tank was voor het laatst
Als (tankcharx > = 1) {}
lcd.setCursor (tankcharx-1, tankchary);
LCD.write(' ');
}
Als (tankcharx > = 0 & & tankcharx < = 7) {}
lcd.setCursor (tankcharx, tankchary);
LCD.write((byte)0);
}
Als (tankcharx + 1 > = 0 & & tankcharx + 1 < = 7) {}
lcd.setCursor (tankcharx + 1, tankchary);
LCD.write((byte)1);
}
Als (tankcharx + 2 > = 0 & & tankcharx + 2 < = 7) {}
lcd.setCursor (tankcharx + 2, tankchary);
LCD.write((byte)2);
}
Als (tankcharx + 3 > = 0 & & tankcharx + 3 < = 7) {}
lcd.setCursor (tankcharx + 3, tankchary);
LCD.write((byte)3);
}
}
Berekenen van de bits van de afzonderlijke aangepaste tekens
int. shiftbits = (vergaarbak % BITS_PER_CHAR);
Serial.Print ("shiftbits =");
Serial.println(shiftbits);
Als (shiftbits < 0) {shiftbits += BITS_PER_CHAR;}
voor (int y = 0; y < 8; y ++)
{
lange lval = tankImg [y];
schakelaar (treadx) {}
Case 0:
schakelaar (y) {}
Case 4:
lval ^ = 0x2cb0; breken;
Case 7:
lval ^ = 0x2490; breken;
}
breken;
Case 1:
schakelaar (y) {}
Case 4:
lval ^ = 0x1240; breken;
lval ^ = 0x36d0; breken;
Case 5:
lval ^ = 0x0008; breken;
Case 6:
lval ^ = 0x4000; breken;
Case 7:
lval ^ = 0x0920; breken;
}
breken;
Case 2:
schakelaar (y) {}
Case 4:
lval ^ = 0x0920; breken;
lval ^ = 0x1b60; breken;
Case 5:
lval ^ = 0x4000; breken;
Case 6:
lval ^ = 0x0008; breken;
Case 7:
lval ^ = 0x1240; breken;
}
breken;
}
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);
}
lcd.createChar (0, sprite0);
lcd.createChar (1, sprite1);
lcd.createChar (2, sprite2);
lcd.createChar (3, sprite3);
++ vergaarbak;
Als (vergaarbak > = 50) {vergaarbak = -15;}
++ treadx;
Als (treadx == 3) {treadx = 0;}
delay(100);
}