Paso 9: Tanque código de 44780 / RT0802B-1 ver 2.0
/ / Este código es para un panel de 14 pines LCD 44780 con 2 pines más para ánodo/cátodo iluminación trasera#include < LiquidCrystal.h >
LiquidCrystal lcd (7, 8, 9, 10, 11, 12);
RS EN, DB4, DB5, DB6, DB7
Tablero
1 = tierra
2 = Vcc
3 = pote de 10k - 20k para contraste
4 = RS
5 = RW
6 = EN
11 = D4
12 = D5
13 = D6
14 = D7
Búsqueda internet 44780 de varias páginas que describen el cableado en gran detalle
RW debe cablearse baja a escribir, otra queda en modo "read"
sprite0 Byte [8];
sprite1 Byte [8];
sprite2 Byte [8];
sprite3 Byte [8];
void setup() {}
fijar número la pantalla del LCD de filas y columnas:
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);
}
Necesita ocho cantidades de 32 bits que puedo utilizar para pedacitos cambiantes alrededor.
La imagen original del tanque es en estos valores.
largo tankImg [] = {}
(B010000 (largo) << 10) | (B000000 (largo) << 5) | B000000 / y la punta de la antena
, (B010111 (largo) << 10) | ((largo) B011110 << 5) | B000000 / / parte superior de la torreta
, (B001111 (largo) << 10) | ((largo) B011111 << 5) | B011110 / / torrecilla mediados con barril
, (B000111 (largo) << 10) | ((largo) B011110 << 5) | B000000 / / base de la torreta
, (B001111 (largo) << 10) | ((largo) B011111 << 5) | B010000 / / tapa de la pisada
, (B010000 (largo) << 10) | (B000000 (largo) << 5) | B001000
, (B010000 (largo) << 10) | (B000000 (largo) << 5) | B001000
, (B001111 (largo) << 10) | ((largo) B011111 << 5) | B010000 / / pisada de la parte inferior, total en la banda de rodadura 24 píxeles
};
tankx es la posición de bit a bit a través de la pantalla.
tankcharx es la posición character-wise, por lo tanto tankx / 5.
Puede ser negativo.
Tankx cero, el tanque es el de la izquierda de la pantalla
tan tankImg bytes se dividen en cuatro caracteres personalizados
el cuarto del que ser bits en blanco
En tankx uno, los bits de tanque cambiar un poco a la derecha
y si soy inteligente, los peldaños se computan para "girar"
Y así sucesivamente
Porque hay cinco bits horizontalmente por char custom
y las pisadas del tanque van todos los demás, puedo repetir la original
tanque de peldaños a partir de las posiciones de caracteres incluso
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);
Interpretación inicial, no hay rotación de peldaños
Si ((tankx % BITS_PER_CHAR) == 0) {}
Turno completo es, necesita establecer un espacio en blanco donde el depósito pasado estaba
Si (tankcharx > = 1) {}
lcd.setCursor (tankcharx-1, tankchary);
LCD.Write(' ');
}
Si (tankcharx > = 0 & & tankcharx < = 7) {}
lcd.setCursor (tankcharx, tankchary);
LCD.Write((byte)0);
}
Si (tankcharx + 1 > = 0 & & tankcharx + 1 < = 7) {}
lcd.setCursor (tankcharx + 1, tankchary);
LCD.Write((byte)1);
}
Si (tankcharx + 2 > = 0 & & tankcharx + 2 < = 7) {}
lcd.setCursor (tankcharx + 2, tankchary);
LCD.Write((byte)2);
}
Si (tankcharx + 3 > = 0 & & tankcharx + 3 < = 7) {}
lcd.setCursor (tankcharx + 3, tankchary);
LCD.Write((byte)3);
}
}
Calcular los bits de lo caracteres personalizado individual
int shiftbits = (tankx % BITS_PER_CHAR);
Serial.Print ("shiftbits =");
Serial.println(shiftbits);
Si (shiftbits < 0) {shiftbits += BITS_PER_CHAR;}
para (int y = 0; y < 8; y ++)
{
largo lval = tankImg [y];
interruptor (treadx) {}
caso 0:
interruptor (y) {}
caso 4:
LVAL ^ = 0x2cb0; rotura;
caso 7:
LVAL ^ = 0x2490; rotura;
}
rotura;
caso 1:
interruptor (y) {}
caso 4:
LVAL ^ = 0x1240; rotura;
LVAL ^ = 0x36d0; rotura;
caso 5:
LVAL ^ = 0x0008; rotura;
caso 6:
LVAL ^ = 0 x 4000; rotura;
caso 7:
LVAL ^ = 0x0920; rotura;
}
rotura;
caso 2:
interruptor (y) {}
caso 4:
LVAL ^ = 0x0920; rotura;
LVAL ^ = 0x1b60; rotura;
caso 5:
LVAL ^ = 0 x 4000; rotura;
caso 6:
LVAL ^ = 0x0008; rotura;
caso 7:
LVAL ^ = 0x1240; rotura;
}
rotura;
}
lshifted largo = 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;
Si (tankx > = 50) {tankx = -15;}
++ treadx;
Si (treadx == 3) {treadx = 0;}
Delay(100);
}