// https://arduinointro.com/lcdcustomcharacter
uint8_t block[][8] = {
{ 0, 0, 0, 0, 0, 0, 0, 31}, // 1/8
{ 0, 0, 0, 0, 0, 0, 31, 31}, // 2/8
{ 0, 0, 0, 0, 0, 31, 31, 31}, // 3/8
{ 0, 0, 0, 0, 31, 31, 31, 31}, // 4/8
{ 0, 0, 0, 31, 31, 31, 31, 31}, // 5/8
{ 0, 0, 31, 31, 31, 31, 31, 31}, // 6/8
{ 0, 31, 31, 31, 31, 31, 31, 31}, // 7/8
{31, 31, 31, 31, 31, 31, 31, 31}, // 8/8
};
uint8_t line[][8] = {
{0, 0, 0, 0, 0, 0, 0, 31},
{0, 0, 0, 0, 0, 0, 31, 0},
{0, 0, 0, 0, 0, 31, 0, 0},
{0, 0, 0, 0, 31, 0, 0, 0},
{0, 0, 0, 31, 0, 0, 0, 0},
{0, 0, 31, 0, 0, 0, 0, 0},
{0, 31, 0, 0, 0, 0, 0, 0},
{31, 0, 0, 0, 0, 0, 0, 0},
};
uint8_t grid[][8] = {
{16, 16, 16, 16, 16, 16, 16, 31}, // 0
{ 8, 8, 8, 8, 8, 8, 31, 8}, // 1
{ 8, 8, 8, 8, 8, 31, 8, 8}, // 2
{ 4, 4, 4, 4, 31, 4, 4, 4}, // 3
{ 4, 4, 4, 31, 4, 4, 4, 4}, // 4
{ 2, 2, 31, 2, 2, 2, 2, 2}, // 5
{ 2, 31, 2, 2, 2, 2, 2, 2}, // 6
{31, 1, 1, 1, 1, 1, 1, 1}, // 7
};
uint8_t swirl[][8] = {
{31, 0, 0, 0, 0, 0, 0, 0},
{31, 1, 1, 1, 1, 1, 1, 1},
{31, 1, 1, 1, 1, 1, 1, 31},
{31, 17, 17, 17, 17, 17, 17, 31},
{31, 31, 17, 17, 17, 17, 17, 31},
{31, 31, 19, 19, 19, 19, 19, 31},
{31, 31, 19, 19, 19, 19, 31, 31},
{31, 31, 27, 27, 27, 27, 31, 31},
};
#include <LiquidCrystal.h>
int RS = 12, EN = 10, D4 = 5, D5 = 4, D6 = 3, D7 = 2;
LiquidCrystal lcd(RS, EN, D4, D5, D6, D7);
#define COLS 20
#define ROWS 4
int counter, col, row, dir = 1, i, j, mark = 255, space = 32;
bool done = 0;
unsigned long timer, timeout = 5000;
void setup() {
}
void loop() {
switch (counter) {
case 0: cylon(); break;
case 1: fill(); break;
case 2: blink(); break;
case 3: grassy(); break;
case 4: steps(); break;
case 5: linear(); break;
case 6: sifter(); break;
case 7: swirls(); break;
default: break;
}
if (millis() - timer > timeout) {
timer = millis();
counter++;
if (counter == 8)
counter = 0;
}
}
void swirls() {
// non-I2C must define characters before initializing object
for (int i = 0; i < 8; i++) {
lcd.createChar(i, swirl[i]);
}
lcd.begin(20, 4);
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 8; j++) {
for (int k = 0; k < 4; k++) {
for (int l = 0; l < 20; l++) {
lcd.setCursor(l, k);
if (i)
lcd.write(j);
else
lcd.write(7 - j);
}
}
}
}
}
void sifter() {
getGrid();
int d = 50;
for (int j = 0; j < 2; j++) {
for (int i = 0; i < 8; i++) {
for (int k = 0; k < 4; k++) {
for (int m = 0; m < 20; m++) {
lcd.setCursor(m, k);
if (j)
lcd.write(i);
else
lcd.write(7 - i);
}
}
}
}
}
void linear() {
getLines();
int d = 5;
for (int i = 0; i < 4; i++) { // four rows
for (int j = 0; j < 20; j++) { // twenty columns
lcd.setCursor(j, 3 - i); // in every cell...
lcd.write(32); // ... write a space
}
delay(d); // pause before next character
for (int k = 0; k < 8; k++) { // eight custom characters
delay(d);
for (int j = 0; j < 20; j++) {
lcd.setCursor(j, 3 - i);
lcd.write(k); // ... write custom characters
}
}
delay(d);
for (int j = 0; j < 20; j++) {
lcd.setCursor(j, 3 - i);
lcd.write(32); // ... write block character
}
}
delay(500);
lcd.clear();
}
void grassy() {
getBlocks();
int d = 10;
for (int i = 0; i < 4; i++) { // four rows
for (int j = 0; j < 20; j++) { // twenty columns
lcd.setCursor(j, 3 - i); // in every cell...
lcd.write(32); // ... write a space
}
delay(d); // pause before next character
for (int k = 0; k < 8; k++) { // eight custom characters
delay(d);
for (int j = 0; j < 20; j++) {
lcd.setCursor(j, 3 - i);
lcd.write(k); // ... write custom characters
}
}
delay(d);
for (int j = 0; j < 20; j++) {
lcd.setCursor(j, 3 - i);
lcd.write(255); // ... write block character
}
}
delay(500);
lcd.clear();
}
void steps() {
getBlocks();
lcd.setCursor(0, 0);
for (int i = 0; i < 8; i++) {
lcd.write(i);
}
}
void getBlocks() {
if (!done) { // moved from setup() to loop(), run one time only
done = 1;
for (int i = 0; i < 8; i++) {
lcd.createChar(i, block[i]);
}
lcd.begin(20, 4);
}
}
void getLines() {
if (!done) { // run one time
done = 1;
for (int i = 0; i < 8; i++) {
lcd.createChar(i, line[i]);
}
lcd.begin(20, 4);
}
}
void getGrid() {
if (!done) { // run one time
done = 1;
for (int i = 0; i < 8; i++) {
lcd.createChar(i, grid[i]);
}
lcd.begin(20, 4);
}
}
void fill() {
int speed = 25;
for (int k = 0; k < 2; k++) {
for (int j = 0; j < ROWS; j++) {
for (int i = 0; i < COLS; i++) {
lcd.setCursor(i, j);
if (k)
lcd.write(space);
else
lcd.write(mark);
delay(speed);
}
}
}
}
void cylon() {
int speed = 25;
for (int j = 0; j < 2; j++) {
dir = -dir;
for (int i = 0; i < COLS; i++) {
for (row = 0; row < 4; row++) {
lcd.setCursor(j * (COLS - 1) - i * dir, row);
lcd.write(mark);
}
delay(speed);
for (row = 0; row < 4; row++) {
lcd.setCursor(j * (COLS - 1) - i * dir, row);
lcd.write(space);
}
}
}
}
void blink() {
lcd.setCursor(8, 2);
lcd.print("BLINK");
delay(500);
lcd.clear();
delay(500);
}