#include "lcd1602.h" LCD1602::LCD1602(uint rs, uint e, uint d4, uint d5, uint d6, uint d7) : _rs(rs), _e(e), _d4(d4), _d5(d5), _d6(d6), _d7(d7) {} void LCD1602::pulseEnable() { gpio_put(_e, 1); sleep_us(1); gpio_put(_e, 0); sleep_us(50); } void LCD1602::write4(uint8_t data) { gpio_put(_d4, data & 0x01); gpio_put(_d5, data & 0x02); gpio_put(_d6, data & 0x04); gpio_put(_d7, data & 0x08); pulseEnable(); } void LCD1602::send(uint8_t val, bool rs) { gpio_put(_rs, rs); write4(val >> 4); write4(val & 0x0F); } void LCD1602::command(uint8_t cmd) { send(cmd, false); sleep_ms(2); } void LCD1602::data(uint8_t d) { send(d, true); } void LCD1602::init() { uint pins[] = {_rs, _e, _d4, _d5, _d6, _d7}; for (uint p : pins) { gpio_init(p); gpio_set_dir(p, GPIO_OUT); } sleep_ms(50); write4(0x03); sleep_ms(5); write4(0x03); sleep_us(150); write4(0x03); write4(0x02); // 4bit mode command(0x28); // 2 line command(0x0C); // display on command(0x06); // entry clear(); } void LCD1602::clear() { command(0x01); sleep_ms(2); } void LCD1602::setCursor(uint8_t row, uint8_t col) { static const uint8_t offset[] = {0x00, 0x40}; command(0x80 | (offset[row] + col)); } void LCD1602::print(const char* str) { while (*str) { data(*str++); } }