uint8_t noinline clock_rw(uint8_t read,uint8_t en) { uint8_t data = 0; if (read) { /* Datenbyte an PCF senden, DBx high zum lesen, sollte vor EN high Flanke geschehen */ i2c_pcf8574x_set(HD44780_PCF8574_ADR, lcd_data | HD44780_PCF8574x_DBx_MASK); /* EN setzen */ lcd_data |= _BV(HD44780_PCF8574x_EN); /* Datenbyte an PCF senden, DBx high zum lesen, EN uebertragen */ i2c_pcf8574x_set(HD44780_PCF8574_ADR, lcd_data | HD44780_PCF8574x_DBx_MASK); /* Datenbyte von PCF lesen, daten_nibble maskiert */ data = i2c_pcf8574x_read(HD44780_PCF8574_ADR) & HD44780_PCF8574x_DBx_MASK; } else { /* Datenbyte an PCF senden, muss vor EN high Flanke geschehen */ i2c_pcf8574x_set(HD44780_PCF8574_ADR, lcd_data); /* EN setzen */ lcd_data |= _BV(HD44780_PCF8574x_EN); /* Datenbyte an PCF senden, EN status uebertragen */ i2c_pcf8574x_set(HD44780_PCF8574_ADR, lcd_data); } /* EN loeschen */ lcd_data &= ~(_BV(HD44780_PCF8574x_EN)); /* Datenbyte erneut senden, EN status uebertragen */ i2c_pcf8574x_set(HD44780_PCF8574_ADR, lcd_data); return data; }
int16_t parse_cmd_i2c_pcf8574x_set(char *cmd, char *output, uint16_t len) { uint8_t adr; uint8_t chip; uint8_t value; sscanf_P(cmd, PSTR("%u %u %x"), &adr, &chip, &value); #ifdef ECMD_MIRROR_REQUEST uint8_t oadr = adr; #endif if (chip == 0) { adr += I2C_SLA_PCF8574; } else { adr += I2C_SLA_PCF8574A; } #ifdef DEBUG_I2C debug_printf("I2C PCF8574X IC address 0x%X, value:%X\n",adr, value); #endif i2c_pcf8574x_set(adr, value); #ifdef ECMD_MIRROR_REQUEST return ECMD_FINAL(snprintf_P(output, len, PSTR("pcf8574x set %u %u 0x%X"), oadr, chip, value)); #else return ECMD_FINAL(snprintf_P(output, len, PSTR("0x%X"), value)); #endif }
void noinline hd44780_hw_init(void) { /* alle ausgaenge auf 0 setzen */ lcd_data = 0; #ifdef HD44780_BACKLIGHT_INV back_light = 1; lcd_data |= _BV(HD44780_PCF8574x_BL); #endif i2c_pcf8574x_set(HD44780_PCF8574x_ADR, lcd_data); }
void hd44780_backlight(uint8_t state) { back_light = state; /* backlight status falls vorhanden uebernehmen */ if(back_light) lcd_data |= _BV(HD44780_PCF8574x_BL); else lcd_data &= ~(_BV(HD44780_PCF8574x_BL)); /* backlight status direkt uebertragen */ i2c_pcf8574x_set(HD44780_PCF8574_ADR, lcd_data); }
void noinline hd44780_hw_init(void) { /* alle ausgaenge auf 0 setzen */ lcd_data = 0; i2c_pcf8574x_set(HD44780_PCF8574_ADR, lcd_data ); }