LCD & OLED text display library for mbed OS 6
Mbed LCD & OLED text display library
Based on work by sstaub which is based on Simon’s work.
So what is the difference, why another fork?
- optional R/W pin which enables reading busy flag to avoid fixed waiting time (once the display finishes the task it will let you know)
- rewritten initialization - not done in constructor in case you are using voltage level translator with OE pin & avoids delays
- enums are within class context - in case you have a same variable defined elsewhere in the code, it will not collide
- all display types share the same codebase, they only rewrite pin handling & initialization
- you can specify char size 5x8 or 5x10 pixels
- I2C packpack (PCF8574) supported, there are two pinouts on the market - both are supported
Supports HD44780 (tested), RS0010 (tested) and WS0010 (untested) interfaces commonly found in text LCD/OLED displays.
Example
LCD
#include "TextLCD.h"
#define DISPLAY_RS_pin PB_1
#define DISPLAY_E_pin PB_2
#define DISPLAY_D4_pin PB_3
#define DISPLAY_D5_pin PB_4
#define DISPLAY_D6_pin PB_5
#define DISPLAY_D7_pin PB_6
const uint8_t upArrow[8] = {
0b00100,
0b01010,
0b10001,
0b00100,
0b00100,
0b00100,
0b00000,
};
const uint8_t downArrow[8] = {
0b00000,
0b00100,
0b00100,
0b00100,
0b10001,
0b01010,
0b00100,
};
const uint8_t rightArrow[8] = {
0b00000,
0b00100,
0b00010,
0b11001,
0b00010,
0b00100,
0b00000,
};
const uint8_t leftArrow[8] = {
0b00000,
0b00100,
0b01000,
0b10011,
0b01000,
0b00100,
0b00000,
};
TextLCD lcd(DISPLAY_RS_pin, DISPLAY_E_pin, DISPLAY_D4_pin, DISPLAY_D5_pin,
DISPLAY_D6_pin, DISPLAY_D7_pin);
int main() {
ThisThread::sleep_for(50ms); // give a time to wakeup the controller
lcd.init();
lcd.display(TextLCD::DISPLAY_ON);
lcd.printf("Hello world\n");
// try display functions
ThisThread::sleep_for(2s);
lcd.display(TextLCD::CURSOR_ON);
lcd.display(TextLCD::BLINK_ON);
ThisThread::sleep_for(4s);
lcd.display(TextLCD::BLINK_OFF);
ThisThread::sleep_for(2s);
lcd.display(TextLCD::CURSOR_OFF);
ThisThread::sleep_for(2s);
// clear
lcd.cls();
// create custom characters
lcd.create(0, downArrow);
lcd.create(1, upArrow);
lcd.create(2, rightArrow);
lcd.create(3, leftArrow);
// show custom characters
lcd.locate(0, 0);
lcd.character(0, 0, 0);
lcd.character(2, 0, 1);
lcd.character(4, 0, 2);
lcd.character(6, 0, 3);
// try long text
lcd.locate(0, 0);
lcd.printf("Really long hello world\nwith scrolling");
ThisThread::sleep_for(2s);
// scroll
while (1) {
for (auto pos = 0; pos < (23 - lcd.columns()); pos++) {
lcd.display(TextLCD::SCROLL_LEFT);
ThisThread::sleep_for(150ms);
}
ThisThread::sleep_for(1s);
for (auto pos = 0; pos < (23 - lcd.columns()); pos++) {
lcd.display(TextLCD::SCROLL_RIGHT);
ThisThread::sleep_for(150ms);
}
ThisThread::sleep_for(2s);
}
}
OLED
#include "TextOLED.h"
#define DISPLAY_RS_pin PB_1
#define DISPLAY_E_pin PB_2
#define DISPLAY_D4_pin PB_3
#define DISPLAY_D5_pin PB_4
#define DISPLAY_D6_pin PB_5
#define DISPLAY_D7_pin PB_6
#define DISPLAY_RW_pin PB_7
TextOLED oled(DISPLAY_RS_pin, DISPLAY_E_pin, DISPLAY_D4_pin, DISPLAY_D5_pin,
DISPLAY_D6_pin, DISPLAY_D7_pin, DISPLAY_RW_pin);
const char spinner[] = {0x7C, 0x2F, 0x2D, 0xDA};
int main() {
ThisThread::sleep_for(500ms); // give a time to wakeup the controller
oled.init(TextOLED::FONT_EUROPEAN_I);
oled.display(TextOLED::DISPLAY_ON);
// animate spinner
while(1){
for (size_t i = 0; i < sizeof(spinner); i++) {
oled.character(0, 0, spinner[i]);
ThisThread::sleep_for(150ms);
}
}
}
LCD I2C
#include "TextLCD_I2C.h"
#define SDA PB_9
#define SCL PB_8
TextLCD_I2C lcd(SDA, SCL, false); // set to true if LCD backpack has different pinout
int main() {
ThisThread::sleep_for(50ms); // give a time to wakeup the controller
if (lcd.init()) {
printf("init OK\n");
lcd.display(TextLCD_I2C::DISPLAY_ON);
lcd.setBacklight(true);
lcd.printf("Hello world\n");
} else {
printf("error\n");
}
}
OLED I2C
You can use the constructor same as above or you can pass existing I2C object
#include "TextOLED_I2C.h"
#define SDA PB_9
#define SCL PB_8
I2C i2c(SDA, SCL)
TextOLED_I2C oled;
int main() {
ThisThread::sleep_for(500ms); // give a time to wakeup the controller
if (oled.init(&i2c)) {
printf("init OK\n");
oled.display(TextOLED_I2C::DISPLAY_ON);
oled.printf("Hello world\n");
} else {
printf("error\n");
}
}