Четверг, 25 Апрель 2013 04:00

Подключаем LCD на HD44780 через I2C расширитель PCF8574.

Автор 
Оцените материал
(5 голосов)
I2C LCD PCF8574 I2C LCD PCF8574 © 2013, Tamagotchi.

Прикупил я как-то на e-bay такой хитрый дисплей, купился на возможность управлять им всего по двум проводам. Пролежал он у меня почти год, пока не дошли руки попробовать его подключить. При использовании такого дисплея с Arduino все просто - подключается библиотека LiquidCrystal_I2C, после чего не должно возникнуть никаких проблем, но я не собирался использовать Arduino.

Продолжительное поиск в Интернет положительного результата не дал - была найдена одна не работающая библиотека и небольшой пример в котором подключение шины данных дисплея отличалось от реализованного в моем модуле. Было решено, не искать легких путей и разобраться с управлением дисплеем самостоятельно.

Дисплей подключен к расширителю PCF8574 так:

LCD D4_pin -> P4
LCD D5_pin -> P5
LCD D6_pin -> P6
LCD D7_pin -> P7
LCD Pin RS -> P0
LCD Pin RW -> P1
LCD Pin E  -> P2

На выводе P3 чипа PCF8574 висит управление подсветкой дисплея, т.е. существует возможность програмно выключать и выключать подсветку (эта возможность пока не реализована в библиотеке)!

Теперь про адресацию. На плате установлен чип без индекса "А" согласно даташиту ее адрес 0х40, у чипа PCF8574 I2C адрес определяется еще и логическими уровнями на выводах A0-A1. В моем случае на всех этих выводах присутствует логическая единица. Это значит, что адрес нужно использовать такой 0b01001110 = 0x4E.

Записывать данные в I2C будем таким методом (используется реализация I2C от Peter Fleury):

#define PCF8574    0x4E
void i2c_lcd_pio(unsigned char data)
{
  i2c_start(PCF8574 + I2C_WRITE);
  i2c_write(data + LCD_BLIGHT);
  i2c_stop();
}

Теперь можно заняться инициализацией дисплея:

void i2c_lcd_init()
{
  i2c_lcd_pio(0b00000000);
  _delay_ms(40);
// 3 x 0x03h, 8bit
  lcd_data = 0b00110000;
  i2c_lcd_pio(lcd_data);
  STROBE_EN();
  _delay_ms(5);              //delay > 4,1ms
  STROBE_EN();
  _delay_us(100);
  STROBE_EN();
  _delay_us(100);
// 4bit - 0x02h
  lcd_data = 0b00100000;
  i2c_lcd_pio(lcd_data);
  STROBE_EN();
  i2c_lcd_pio(lcd_data);
  _delay_us(100);
// From now on in 4-bit-Mode
  i2c_lcd_cmd(LCD_4BIT | LCD_2LINE | LCD_5X7);    //-  2-Lines, 5x7-Matrix
  i2c_lcd_cmd(LCD_DISPLAYOFF);            //-  Display off
  i2c_lcd_cmd(LCD_CLEAR);                //-  Clear Screen
  i2c_lcd_cmd(LCD_INCREASE | LCD_DISPLAYSHIFTOFF);  //-  Entrymode
  i2c_lcd_cmd(LCD_DISPLAYON | LCD_BLINKINGOFF);    //-  Display on
}

Осталось реализовать методы записи в дисплей комманд и данных. Эти методы различаются только состоянием флага RS.

void i2c_lcd_cmd(unsigned char cmd)
{  
  lcd_data = (cmd & 0xF0);
  lcd_data &= ~LCD_RS;
  STROBE_EN();
  i2c_lcd_pio(lcd_data);
  _delay_us(100);
 
  lcd_data = ((cmd &amp; 0x0F)<<4);
  lcd_data &amp;= ~LCD_RS;
  STROBE_EN();
  i2c_lcd_pio(lcd_data);
 
  if(cmd &amp; 0b11111100) _delay_us(100);else _delay_ms(2);
} 
 
void i2c_lcd_putch(unsigned char chr)
{
  lcd_data = (chr &amp; 0xF0);
  lcd_data |= LCD_RS;
  STROBE_EN();
  _delay_us(100);
 
  lcd_data = ((chr &amp; 0x0F)<<4);
  lcd_data |= LCD_RS;
  STROBE_EN();
  i2c_lcd_pio(lcd_data);
  _delay_ms(2);
}

Остальное - дело техники, реализован необходимый минимум методов и настало время испытать библиотеку в железе:

i2c lcd pcf8574

Работает!

Загрузить текущую версию библиотеки, тестовый проект и схему в протеусе Вы можете по ссылке ниже. Ждите обновлений.

Прочитано 19594 раз Последнее изменение Пятница, 26 Апрель 2013 16:18
Другие материалы в этой категории: Модифицируем 8xAMC7135 ATtiny13A LED Driver »

6 комментарии

Оставить комментарий

Убедитесь, что вы вводите (*) необходимую информацию, где нужно
HTML-коды запрещены

Пользователь

Поиск

Календарь

« Декабрь 2017 »
Пн Вт Ср Чт Пт Сб Вс
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31