61 lines
1.6 KiB
C++
61 lines
1.6 KiB
C++
#include "uDisplay_I2C_panel.h"
|
|
|
|
i2c_panel::i2c_panel(const I2CPanelConfig& config, uint8_t* framebuffer)
|
|
: cfg(config), framebuffer(framebuffer) {
|
|
|
|
// Execute initialization commands
|
|
if (cfg.init_commands && cfg.init_commands_count > 0) {
|
|
for (uint16_t i = 0; i < cfg.init_commands_count; i++) {
|
|
i2c_command(cfg.init_commands[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
bool i2c_panel::updateFrame() {
|
|
if (!framebuffer) return false;
|
|
|
|
i2c_command(cfg.cmd_set_addr_x | 0x0);
|
|
i2c_command(cfg.page_start | 0x0);
|
|
i2c_command(cfg.page_end | 0x0);
|
|
|
|
uint8_t ys = cfg.height >> 3;
|
|
uint8_t xs = cfg.width >> 3;
|
|
uint8_t m_row = cfg.cmd_set_addr_y;
|
|
uint8_t m_col = cfg.col_start;
|
|
|
|
uint16_t p = 0;
|
|
uint8_t i, j, k = 0;
|
|
|
|
for (i = 0; i < ys; i++) {
|
|
i2c_command(0xB0 + i + m_row);
|
|
i2c_command(m_col & 0xf);
|
|
i2c_command(0x10 | (m_col >> 4));
|
|
|
|
for (j = 0; j < 8; j++) {
|
|
cfg.wire->beginTransmission(cfg.i2c_address);
|
|
cfg.wire->write(0x40);
|
|
for (k = 0; k < xs; k++, p++) {
|
|
cfg.wire->write(framebuffer[p]);
|
|
}
|
|
cfg.wire->endTransmission();
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool i2c_panel::displayOnff(int8_t on) {
|
|
i2c_command(on ? cfg.cmd_display_on : cfg.cmd_display_off);
|
|
return true;
|
|
}
|
|
|
|
bool i2c_panel::invertDisplay(bool invert) {
|
|
i2c_command(invert ? cfg.cmd_invert_on : cfg.cmd_invert_off);
|
|
return true;
|
|
}
|
|
|
|
void i2c_panel::i2c_command(uint8_t val) {
|
|
cfg.wire->beginTransmission(cfg.i2c_address);
|
|
cfg.wire->write(0);
|
|
cfg.wire->write(val);
|
|
cfg.wire->endTransmission();
|
|
} |