Arduino text LCD animation (9 / 9 steg)
Steg 9: Tank koden för 44780 / RT0802B-1 ver 2.0
/ / Här koden är för en 44780 LCD-14-polig panel med 2 mer tappar för anod/katod bakgrundsbelysning#include < LiquidCrystal.h >
LiquidCrystal lcd (7, 8, 9, 10, 11, 12);
RS, SV, DB4, DB5, DB6, DB7
Styrelsen
1 = jord
2 = Vcc
3 = potten 10k - 20k för kontrast
4 = RS
5 = RW
6 = SV
11 = D4
12 = D5
13 = D6
14 = D7
Sök på internet på 44780 för olika sidor som beskriver ledningarna i detalj
RW har till vara fast lågt att skriva, annars återstår i "läsa" läge
byte sprite0 [8],
byte sprite1 [8],
byte sprite2 [8],
byte sprite3 [8],
void setup() {
Ange den LCD antal kolumner och rader:
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);
}
Behöver åtta 32-bitars kvantiteter som jag kan använda för skiftande bitar runt.
Den ursprungliga tank bilden är i dessa värden.
lång tankImg [] = {
((långa) B010000 << 10) | ((långa) B000000 << 5) | B000000 / / antenn tips
, ((långa) B010111 << 10) | ((långa) B011110 << 5) | B000000 / / tornets topp
, ((långa) B001111 << 10) | ((långa) B011111 << 5) | B011110 / / torn mitten med fat
, ((långa) B000111 << 10) | ((långa) B011110 << 5) | B000000 / / tornets bas
, ((långa) B001111 << 10) | ((långa) B011111 << 5) | B010000 / / trampa upp
, ((långa) B010000 << 10) | ((långa) B000000 << 5) | B001000
, ((långa) B010000 << 10) | ((långa) B000000 << 5) | B001000
, ((långa) B001111 << 10) | ((långa) B011111 << 5) | B010000 / / trampa botten, 24 pixlar totalt i slitbanan
};
tankx är bitvis positionen över skärmen.
tankcharx är den character-wise ståndpunkten, således tankx / 5.
Det kan vara negativt.
På tankx noll är tanken till vänster på skärmen
så tankImg byte är uppdelade i fyra anpassade tecken
den fjärde som är tomma bitar
På tankx en skifta tank bitar lite till höger
om jag är smart, slitbanor beräknas så att de "rotera" och
Och så vidare
Eftersom det finns fem bitar horisontellt per anpassade röding
och tank slitbanor går alla andra, jag kan upprepa ursprungliga
tank slitbanor början även röding positioner
int tankx = -15;
int tankcharx;
int tankchary = 1;
int treadx = 0;
#define BITS_PER_CHAR 6
void loop() {
tankcharx = tankx / BITS_PER_CHAR;
Serial.Print ("tankx =");
Serial.Print(tankx);
Serial.Print ("tankcharx =");
Serial.println(tankcharx);
Inledande rendering, ingen rotation av slitbanor
om ((tankx % BITS_PER_CHAR) == 0) {
Fullständig SKIFT är på, behöver man drar ett tomt där tanken senast var
om (tankcharx > = 1) {
lcd.setCursor (tankcharx-1, tankchary);
LCD.write(' ');
}
om (tankcharx > = 0 & & tankcharx < = 7) {
lcd.setCursor (tankcharx, tankchary);
LCD.write((byte)0);
}
om (tankcharx + 1 > = 0 & & tankcharx + 1 < = 7) {
lcd.setCursor (tankcharx + 1, tankchary);
LCD.write((byte)1);
}
om (tankcharx + 2 > = 0 & & tankcharx + 2 < = 7) {
lcd.setCursor (tankcharx + 2, tankchary);
LCD.write((byte)2);
}
om (tankcharx + 3 > = 0 & & tankcharx + 3 < = 7) {
lcd.setCursor (tankcharx + 3, tankchary);
LCD.write((byte)3);
}
}
Beräkna bitarna på individuella anpassade tecken
int shiftbits = (tankx % BITS_PER_CHAR);
Serial.Print ("shiftbits =");
Serial.println(shiftbits);
om (shiftbits < 0) {shiftbits += BITS_PER_CHAR;}
för (int y = 0; y < 8; y ++)
{
lång lval = tankImg [y];
växel (treadx) {
fall 0:
Växla (y) {
fall 4:
lval ^ = 0x2cb0; bryta;
fall 7:
lval ^ = 0x2490; bryta;
}
bryta;
fall 1:
Växla (y) {
fall 4:
lval ^ = 0x1240; bryta;
lval ^ = 0x36d0; bryta;
fall 5:
lval ^ = 0x0008; bryta;
fall 6:
lval ^ = 0x4000; bryta;
fall 7:
lval ^ = 0x0920; bryta;
}
bryta;
fall 2:
Växla (y) {
fall 4:
lval ^ = 0x0920; bryta;
lval ^ = 0x1b60; bryta;
fall 5:
lval ^ = 0x4000; bryta;
fall 6:
lval ^ = 0x0008; bryta;
fall 7:
lval ^ = 0x1240; bryta;
}
bryta;
}
lång 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).
++ tankx;
om (tankx > = 50) {tankx = -15;}
++ treadx;
om (treadx == 3) {treadx = 0;}
Delay(100);
}