ESPHome  2024.4.1
pcf8574_display.cpp
Go to the documentation of this file.
1 #include "pcf8574_display.h"
2 #include "esphome/core/log.h"
3 #include "esphome/core/hal.h"
4 
5 namespace esphome {
6 namespace lcd_pcf8574 {
7 
8 static const char *const TAG = "lcd_pcf8574";
9 
10 static const uint8_t LCD_DISPLAY_BACKLIGHT_ON = 0x08;
11 static const uint8_t LCD_DISPLAY_BACKLIGHT_OFF = 0x00;
12 
14  ESP_LOGCONFIG(TAG, "Setting up PCF8574 LCD Display...");
15  this->backlight_value_ = LCD_DISPLAY_BACKLIGHT_ON;
16  if (!this->write_bytes(this->backlight_value_, nullptr, 0)) {
17  this->mark_failed();
18  return;
19  }
20 
22 }
24  ESP_LOGCONFIG(TAG, "PCF8574 LCD Display:");
25  ESP_LOGCONFIG(TAG, " Columns: %u, Rows: %u", this->columns_, this->rows_);
26  LOG_I2C_DEVICE(this);
27  LOG_UPDATE_INTERVAL(this);
28  if (this->is_failed()) {
29  ESP_LOGE(TAG, "Communication with LCD Display failed!");
30  }
31 }
32 void PCF8574LCDDisplay::write_n_bits(uint8_t value, uint8_t n) {
33  if (n == 4) {
34  // Ugly fix: in the super setup() with n == 4 value needs to be shifted left
35  value <<= 4;
36  }
37  uint8_t data = value | this->backlight_value_; // Set backlight state
38  this->write_bytes(data, nullptr, 0);
39  // Pulse ENABLE
40  this->write_bytes(data | 0x04, nullptr, 0);
41  delayMicroseconds(1); // >450ns
42  this->write_bytes(data, nullptr, 0);
43  delayMicroseconds(100); // >37us
44 }
45 void PCF8574LCDDisplay::send(uint8_t value, bool rs) {
46  this->write_n_bits((value & 0xF0) | rs, 0);
47  this->write_n_bits(((value << 4) & 0xF0) | rs, 0);
48 }
50  this->backlight_value_ = LCD_DISPLAY_BACKLIGHT_ON;
51  this->write_bytes(this->backlight_value_, nullptr, 0);
52 }
54  this->backlight_value_ = LCD_DISPLAY_BACKLIGHT_OFF;
55  this->write_bytes(this->backlight_value_, nullptr, 0);
56 }
57 
58 } // namespace lcd_pcf8574
59 } // namespace esphome
void setup()
void send(uint8_t value, bool rs) override
virtual void mark_failed()
Mark this component as failed.
Definition: component.cpp:118
void write_n_bits(uint8_t value, uint8_t n) override
This is a workaround until we can figure out a way to get the tflite-micro idf component code availab...
Definition: a01nyub.cpp:7
void IRAM_ATTR HOT delayMicroseconds(uint32_t us)
Definition: core.cpp:28
bool write_bytes(uint8_t a_register, const uint8_t *data, uint8_t len, bool stop=true)
Definition: i2c.h:248