AVR для начинающих. Урок 7. Подключение LCD.

Автор: | 09.08.2016

Урок 7

Добрый день, уважаемые читатели!

Настало время подключить к нашему микроконтроллеру экран, который позволит отображать различную информацию. Для данной цели прекрасно подойдет ЖКИ на базе контроллера HD44780, например WH1601, компании WINSTAR.

Стоимость данных ЖКИ достаточно низкая, что позволяет использовать их в любительских проектах. Данный дисплей может отображать одну строку из 16 символов. Так же существуют модели, отображающие 2 строки по 16 символов, 2 строки по 8 символов, и множество других. Управление дисплеем происходит посредством передачи команд и данных от управляющего микроконтроллера — контроллеру дисплея.

Назначение 16 выводов дисплея WH1601:

  • VSS – 0 питания, земля.

  • Vdd — +5 Вольт питания.

  • V — Вывод настройки контрастности дисплея, путем подачи напряжения от 0 до напряжения питания.

  • RS — Если на выводе RS логическая “1” передаются данные, если логический “0” передается команда.

  • R/W — Направление передачи. При R/W =”1” происходит чтение из дисплея, при R/W = “0”, происходит запись в дисплей.

  • E — При переключении логического уровня на данной линии, дисплей производит цикл чтения/записи данных представленных на выводах DB0-DB7.

  • DB0-DB7 — Выводы данных. Данными выводами мы кодируем байт для передачи дисплея, либо декодируем байт, принятый от дисплея. Если DBx=”1” данный бит равен единице, при DBx=”0 ” бит равен нулю.

  • A — Анод светодиода подсветки экрана.

  • K — Катод светодиода подсветки экрана.

Передача данных происходит следующим образом:

1.Устанавливаем логическую единицу на RS, чтобы указать контроллеру о передаче данных.

2.Устанавливаем логический ноль на линии R/W, так как направление передачи — к дисплею.

3.Выставляем байт данных на линии DB0-DB7.

4.Подаем логическую единицу на линию E, на 60 миллисекунд, затем подаем на линию логический ноль.

Читайте также  AVR для начинающих. Урок 15. Регистры EEPROM.

Тем самым мы записываем байт данных в соответствующую память DDRAM,CGROM или CGRAM. Рассмотрим каждый из видов памяти подробнее:

DDRAM — память выделенная под хранение символов на экране. Всё что записывается в этой памяти, мгновенно выводится на экран. Запись символов необходимо производить в ASCII коде.

CGROM — память выделенная под хранение таблицы символов. При записи байта в DDRAM, соответствующий символ находится в данной таблице и выводится на экран.

CGRAM — память выделенная для хранения пользовательских символов. Если Вам необходимо вывести на экран символ, которого нет в стандартной таблице, Вы можете самостоятельно нарисовать его, и поместить в данную таблицу. В данном уроке рассматриваться не будет.

Система команд:

Кроме передачи данных, необходимо подавать специальные команды дисплею. Например, выбор памяти, очистка экрана, изменение позиции курсора, и так далее. Контроллер HD44780 имеет следующую таблицу команд:

Данная таблица нуждается в некотором пояснении.

Рассмотрим формирование команды по данной таблице на примере команды сдвига курсора/экрана:

Первым делом записывается номер команды, затем задаются параметры(см. таблицу выше), а после могут идти незначащие биты.

Передача команды происходит по следующему алгоритму:

1.Устанавливаем логический ноль на RS, чтобы указать контроллеру о передаче команды.

2.Устанавливаем логический ноль на линии R/W, так как направление передачи — к дисплею.

3.Выставляем байт команды на линии DB0-DB7.

4.Подаем логическую единицу на линию E, на 60 миллисекунд, затем подаем на линию логический ноль.

Например, рассмотрим последовательность команд, реализующую следующий алгоритм:

  1. Инициализация дисплея.

  2. Очистка содержимого.

  3. Вывод на экран символа ‘H’.

Для реализации данного алгоритма подадим на контроллер следующую последовательность команд:

*Перед передачей команд установить R/W =0, RS=0

  1. 00110000

Читайте также  AVR для начинающих.Урок 0.Знакомство с микроконтроллерами.

Команда 001 ”Определение параметров развертки и ширины шины данных”.

  • DL = 1 — ширина шины данных – 8бит.

  • N = 0 — одна строка символов.

  • F = 0 — матрица символов 5x8 точек.

  1. 00000001

Команда 00000001 “Очистка экрана, сброс текущего адреса AC”.

  1. 00001100

Команда 00001 Выбирается режим отображения

  • D = 1 — Экран включен.
  • С=0 — Курсор в виде прочерка выключен.
  • И=0 — Курсор в виде мерцающего знакоместа выключен.

Перед передачей символа установить R/W =0, RS=1

  1. 01001000

Передача символа ‘H’ в память DDRAM.

В качестве примера соберем простейшее устройство инициализирующее ЖКИ, и выводящее строку “Hi!” на него.

В этот раз, давайте попробуем симулировать работу нашего устройства. В этом нам поможет программа Proteus, уроки работы с которой вы можете найти на нашем сайте. Данная программа предоставляет широкие возможности эмулирования работы различных устройств на микроконтроллерах.

Соберем простую схему:

Линия RW соединена с землей, так как сейчас мы не планируем читать данные с дисплея, мы будем лишь записывать.

Код прошивки на Си:

После начала эмуляции работы прошивки в Proteus видим:

Читайте также  AVR для начинающих. Урок 12.SPI.Регистры.

Либо собрав схему на макетной плате:

Ваши вопросы как обычно оставляйте в комментариях! Будем рады ответить на них!

До новых встреч!

Другие уроки цикла.


Любое копирование, воспроизведение, цитирование материала, или его частей разрешено только с письменного согласия администрации MKPROG.RU. Незаконное копирование, цитирование, воспроизведение преследуется по закону!

AVR для начинающих. Урок 7. Подключение LCD.: 18 комментариев

  1. Уведомление: Семисегментный индикатор. Подключение к AVR | MKPROG.RU

  2. Павел

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

    void Send_Byte (char Data)
    {
    PORTC |=(1<<PC0);
    PORTD = Data;
    Откуда взялась Data? Как она сформировалась? Если правильно понял, то в нее помещается
    код буквы "H" и. т. д?

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

      Здравствуйте, Павел!
      Data это параметр функции Send_Byte( функция отправки байта).

      1. Павел

        Спасибо.

        PORTC &=~(1<<PC2);
        Почему нельзя записать так: PORTC |=(0<<PC2);?

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

          Вопрос предпочтений)
          Мой вариант однозначно рабочий, поэтому так и привык писать)

          1. Павел

            Понял. А я попробовал написать так, как предложил. Не заработало. Может ошибка в синтаксисе?

        2. Антон

          Задача этой команды PORTC &=~(1<<PC2) — установить бит №2 порта С в 0. Как это происходит:
          — команда 1<<PC2 устанавливает второй бит восьмиразрядного числа в 1, т.е. получаем вот такое число в двоичной форме 0b0000100;
          — далее, команда ~ инвертирует это число: вместо нулей появляются единички, а вместо единичек, соответственно, нули, т.е. получаем вот такое 0b1111011;
          — и наконец команда &= выполняет побитовое И с имеющимися данными порта D и одновременно записывает результат в порт D. В итоге, в порте обнуляется только второй бит потому что результат операции побитового И с нулем всегда будет ноль в не зависимости от того, какое значение имеет второй аргумент: 1&0=0, 0&1=0, 0&0=0 и только 1&1=1.

          В этом же случае PORTC |=(0<<PC2) не произойдет ничего т.к. вы пытаетесь применить операцию побитового ИЛИ, результат которой будет всегда 1, если кокой-то из аргументов будет единицей: 1|0=1, 0|1=0, 1|1=1 и только 0|0=0.

  3. Павел

    Вот ещё вопрос. Захотел сделать так, чтобы при нажатии на одну кнопу выводилась надпись «Hi», а при нажатии на другую «Hello». Не получается.

    int main(void)
    {
    PORTB = 0xFF;
    DDRB = 0x00;
    DDRD = 0xFF;
    DDRC |=(1<<PC0)|(1<<PC2);

    if (PINB==0b00000000)
    {
    Send_Cmd(0b00110000);
    _delay_us(200);
    Send_Cmd(0b00000001);
    _delay_ms(10);
    Send_Cmd(0b00001100);
    _delay_us(80);
    Send_Str("Hi!",3);
    }
    else
    {
    Send_Cmd(0b00000001);
    _delay_ms(10);
    }
    if (PINB==0b00000010)
    и т.д.
    Подскажите, пожалуйста, как правильно.

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

      Отправьте пожалуйста схему подключения кнопок

      1. Павел

        1-я кнопка. Одним своим выводом подключена к минусу, другим к PB0.
        2-я кнопка. Одним выводом к минусу, другим к PB1.

        Как отправить картинку через форму не знаю.

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

          Побитно проверяйте значение регистра PINB в главном цикле.
          Либо, если условия позволяют, можно реализовать это через внешние прерывания.
          Или Вы хотели бы получить готовый код?
          Задача тривиальная, лучше бы Вам решить её самостоятельно, для лучшего понимания темы)

  4. Павел

    Понятно. Спасибо. Согласен с Вами по поводу самостоятельного решения для лучшего понимания.

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

      Здравствуйте!
      К сожалению пока нет возможности написать на asm. Если у вас есть желание этим заняться, напишите)

  5. Станислав

    Добрый день. Не подскажите, как включить LCD после перезагрузки питания на него, в то время как МК оставался работать. LCD через I2C, инициализацию пробовал, не срабатывает.

  6. Виктор

    Здравствуйте! Благодарю вас за статью, она мне очень помогла.
    Но я только не понял, как дисплей определил, что надо отобразить символы «Hi!», если по даташиту надо было бы отправить на каждый символ отдельную 8-битную команду с набором 0 и 1?
    И еще: у меня дисплей 20 символов по 4 строчки. Как без помощи библиотеки сделать чтобы отображались символы на всех 4-х строках? У меня, при посылке большого количества символов, заполняются только первая (верхняя) и третья.

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

      Здравствуйте!
      В ПЗУ LCD уже записаны соответствующие символы, подробнее смотрите в даташите на контроллер дисплея HD44780
      Для использования библиотеки в паре с 4-ех строчным дисплеем, необходимо модифицировать функции передачи команды изменения положения курсора)
      Пишите если будут проблемы с этим.

      1. Виктор

        Здравствуйте! С дисплеем разобрался: теперь выводит на всех строках (помогли примеры в одном из даташитов (на SPLC780D), что надо надо подать команду на переход в нужную позицию (ни за что бы не догадался, что она называется «Write data to RAM»), которой сооответствует свой HEX-адрес (адресную таблицу нашел даташите на WH2004A). Благодарю за ответ.

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

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