Библиотека для работы с LCD.HD44780.AVR.

Автор: | 05.06.2017

 

Здравствуйте!

Как и обещал, выкладываю библиотеку для работы с LCD на базе контроллера HD44780. Данная библиотека позволяет подключить микроконтроллер к дисплею используя 6 проводов (4 для передачи данных, линии RS и E). Соответственно данные будут передаваться по 4 бита, что позволит сэкономить выводы микроконтроллера. Так же в библиотеке реализована передача команд дисплею.

Для переназначения ножек контроллера исправляйте директивы define на соответствующие

Ну и небольшой пример по работе с дисплеем.

Читайте также  Измерение периода сигнала

Схема:

Прошивка:

 

Библиотека для работы с LCD.HD44780.AVR.: 14 комментариев

  1. rasel

    Сама программа работает, а на экране пусто…

    #define lcd_D7_port PORTC // D7 вывод
    #define lcd_D7_bit PORTC0
    #define lcd_D7_ddr DDRC

    #define lcd_D6_port PORTC // D6 вывод
    #define lcd_D6_bit PORTC1
    #define lcd_D6_ddr DDRC

    #define lcd_D5_port PORTC // D5 вывод
    #define lcd_D5_bit PORTC2
    #define lcd_D5_ddr DDRC

    #define lcd_D4_port PORTC // D4 вывод
    #define lcd_D4_bit PORTC3
    #define lcd_D4_ddr DDRC

    #define lcd_E_port PORTC // E вывод
    #define lcd_E_bit PORTC4
    #define lcd_E_ddr DDRC

    #define lcd_RS_port PORTC // RS вывод
    #define lcd_RS_bit PORTC5
    #define lcd_RS_ddr DDRC

    Это все что я изменил.

  2. rasel

    lcd_write_4(lcd_FunctionReset);
    _delay_ms(10);

    lcd_write_4(lcd_FunctionReset);
    _delay_us(200);

    lcd_write_4(lcd_FunctionReset);
    _delay_us(200);

    lcd_write_4(lcd_FunctionSet4bit);
    _delay_us(80);
    Для чего вызываются эти функции?

    1. DamiKK Автор записи

      Эти функции выполняются для инициализации дисплея

  3. rasel

    Я понимаю что вопрос чайника, но все же. Пытаюсь написать код на СИ для LCD — AVR, вроде казалось вопрос избитый но как оказалось хороший библиотеке рабочей нет, то распиновка не подходит, всякая фигня в виде ошибок или вообще не работает. Читая всякие сайты я не смог понять как происходит передача числа из переменной если значение более 9. В памяти lcd нет числа 124 или 234 значит либо это происходит программно или аппаратно в самом lcd. Но судя из того кода в библиотеках которые я смог найти и понять, идет просто отправка байта, значит это происходит аппаратно в lcd?

  4. Mykola

    Добрий день. Спасибо за библиотеку.
    Долго разбирался в ней (я только учусь) работала как то не стабильно. От себя добавил theByte &= ~(0b00001111) так стало лучше.

    void lcd_write_4(uint8_t theByte)
    {
    lcd_D_port &= ~(1<<lcd_D7_bit);
    lcd_D_port &= ~(1<<lcd_D6_bit);
    lcd_D_port &= ~(1<<lcd_D5_bit);
    lcd_D_port &= ~(1<<lcd_D4_bit);

    theByte &= ~(0b00001111);
    lcd_D_port |= theByte;

    lcd_E_port |= (1<<lcd_E_bit);
    _delay_us(60);

    lcd_E_port &= ~(1<<lcd_E_bit);
    _delay_us(60);
    }

    1. DamiKK Автор записи

      Здравствуйте!
      Расскажите,пожалуйста, подробнее в чем заключалась нестабильность работы библиотеки?
      Спасибо за внимание и за вашу доработку))

  5. Mykola

    Если сменить конфигурацию выводов LCD и повесить их все на один порт контроллера — били проблемы с выводом информации на экран и не работали некоторые команды

    команда lcd_D_port |= theByte меняет не только биты 0-3 но и 4-7, а на них могут быть E и RS

    1. DamiKK Автор записи

      Спасибо, обратим на это внимание в следующей версии библиотеки

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *