I am building a clock that uses a 20x4 LCD display. I want to use custom characters to display 4x4 numbers. I am repeating a lot of things here, which leads me to believe there are some better ways:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args) write(args);
#else
#define printByte(args) print(args,BYTE);
#endif
//create custom characters
uint8_t topBlock[8] = {0x0E,0x0E,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
uint8_t middleBlock[8] = {0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
uint8_t blankBlock[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uint8_t colon[8] = {0x00,0x00,0x0E,0x0E,0x1F,0x1F,0x00,0x00};
uint8_t eightTop[8]={0x00,0x00,0x00,0x00,0x0E,0x0E,0x1F,0x1F};
uint8_t eightBot[8]={0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00};
//create the layout of each digit (4x4 of custom characters)
uint8_t num0[16] = {2,2,2,2,
1,0,0,1,
1,0,0,1,
1,1,1,1};
uint8_t num1[16] ={0,0,0,2,
0,0,2,1,
0,0,0,1,
0,0,0,1};
uint8_t num2[16] ={2,2,2,2,
0,0,4,1,
2,1,5,0,
1,1,1,1};
uint8_t num3[16] ={2,2,2,2,
0,4,4,1,
0,5,5,1,
2,1,1,1};
uint8_t num4[16] ={2,0,0,2,
1,0,0,1,
1,2,2,1,
0,0,0,1};
uint8_t num5[16] ={2,2,2,2,
1,4,4,0,
0,5,5,2,
2,1,1,1};
uint8_t num6[16] ={2,0,0,0,
1,2,2,2,
1,0,0,1,
1,2,2,1};
uint8_t num7[16] ={2,2,2,2,
0,0,4,1,
0,2,5,0,
0,1,0,0};
uint8_t num8[16] ={2,2,2,2,
1,4,4,1,
1,5,5,1,
1,2,2,1};
uint8_t num9[16] ={2,2,2,2,
1,0,0,1,
1,2,2,1,
0,0,0,1};
LiquidCrystal_I2C lcd(0x27,20,4);
void setup()
{
lcd.init(); // initialize the lcd
lcd.backlight();
lcd.createChar(2, topBlock);
lcd.createChar(1, middleBlock);
lcd.createChar(0, blankBlock);
lcd.createChar(3, colon);
lcd.createChar(4, eightTop);
lcd.createChar(5, eightBot);
lcd.home();
}
void loop()
{
printNumber(0,1);
delay(2000);
printNumber(1,1);
delay(2000)
}
void printNumber(uint8_t num, uint8_t posn) {
//allow the digit to be placed in the three positions across the screen, the first spot is a skinny version of number 1
uint8_t digitOffset = 0;
if (posn == 1) digitOffset = 4;
else if (posn == 2) digitOffset = 11;
else if (posn == 3) digitOffset = 16;
if (num == 0) {
lcd.setCursor(digitOffset,0);
for (uint8_t i = 0; i < 4; i++) {
lcd.printByte(num0[i]);
}
lcd.setCursor(digitOffset,1);
for (uint8_t i = 4; i < 8; i++) {
lcd.printByte(num0[i]);
}
lcd.setCursor(digitOffset,2);
for (uint8_t i = 8; i < 12; i++) {
lcd.printByte(num0[i]);
}
lcd.setCursor(digitOffset,3);
for (uint8_t i = 12; i < 16; i++) {
lcd.printByte(num0[i]);
}
}
else if (num == 1) {
lcd.setCursor(digitOffset,0);
for (uint8_t i = 0; i < 4; i++) {
lcd.printByte(num1[i]);
}
lcd.setCursor(digitOffset,1);
for (uint8_t i = 4; i < 8; i++) {
lcd.printByte(num1[i]);
}
lcd.setCursor(digitOffset,2);
for (uint8_t i = 8; i < 12; i++) {
lcd.printByte(num1[i]);
}
lcd.setCursor(digitOffset,3);
for (uint8_t i = 12; i < 16; i++) {
lcd.printByte(num1[i]);
}
}
}