#include "gpio_lcd.h" Gpio_LCD::Gpio_LCD(uint rs, uint e, uint d4, uint d5, uint d6, uint d7) { _rs = rs; _e = e; _d[0] = d4; _d[1] = d5; _d[2] = d6; _d[3] = d7; } void Gpio_LCD::pulseEnable() { gpio_put(_e, 0); sleep_us(1); gpio_put(_e, 1); sleep_us(1); gpio_put(_e, 0); sleep_us(100); } void Gpio_LCD::write4bits(uint8_t val) { for (int i = 0; i < 4; i++) { gpio_put(_d[i], (val >> i) & 0x01); } pulseEnable(); } void Gpio_LCD::send(uint8_t val, bool is_data) { gpio_put(_rs, is_data); write4bits(val >> 4); // 上位4ビット write4bits(val & 0x0F); // 下位4ビット } void Gpio_LCD::init() { // GPIO初期化 uint pins[] = {_rs, _e, _d[0], _d[1], _d[2], _d[3]}; for(uint p : pins) { gpio_init(p); gpio_set_dir(p, GPIO_OUT); } sleep_ms(50); // 電源立ち上がり待ち write4bits(0x03); sleep_ms(5); write4bits(0x03); sleep_us(150); write4bits(0x03); write4bits(0x02); // 4ビットモードへ send(0x28, false); // 2行表示, 5x8ドット send(0x0C, false); // 表示ON, カーソルOFF clear(); send(0x06, false); // エントリモード } void Gpio_LCD::clear() { send(0x01, false); sleep_ms(2); } void Gpio_LCD::setCursor(uint8_t line, uint8_t pos) { uint8_t addr = (line == 0) ? (0x80 + pos) : (0xC0 + pos); send(addr, false); } void Gpio_LCD::print(const char *str) { while (*str) { send((uint8_t)(*str++), true); } }