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 для начинающих. Урок 14. 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 для начинающих. Урок 4. Тактирование микроконтроллера.

Команда 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 видим:

Читайте также  Аналоговый компаратор. Урок 16. AVR для начинающих.

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

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

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

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


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

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

  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. Павел

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

  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. Если у вас есть желание этим заняться, напишите)

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

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