AVR Урок 12. LCD индикатор 16×2. Часть 3



 

Урок 12

Часть 3

 

LCD индикатор 16×2

 

Сегодня мы продолжим изучение жидкокристаллического индикатора символьного, который способен выводить определённые символы в две строки по 16 символов в каждую.

Вернёмся в проект Atmel Studio и, используя написанную в прошлой части функцию, передадим в контроллер дисплея двоичное число 11 три раза в функции LCD_ini, также применяя соответствующие задержки, взяв их из даташита

 

_delay_ms(15); //Ждем 15 мс (стр 45)

sendhalfbyte(0b00000011);

_delay_ms(4);

sendhalfbyte(0b00000011);

_delay_us(100);

sendhalfbyte(0b00000011);

_delay_ms(1);

 

Дальше передаём двоичное число 10 таким же образом

 

_delay_ms(1);

sendhalfbyte(0b00000010);

_delay_ms(1);

 

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

В принципе, уже контроллер дисплея должен «догадаться», что мы его просим переключиться в 4 битный режим, и следующая команда будет же с полноправным байтом, переданным поочередно и причем в этой команде уже будет конкретная команда перевода в 4-битный режим. Но для полнорпавных команд мы напишем другую функцию sendbyte, расположив ее код после функции sendhalfbyte.

 

//—————————————-

void sendbyte(unsigned char c, unsigned char mode)

{

}

//—————————————-

 

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

Сначала мы с помощью условия узнаем, команда в нашу функцию пришла или данные, и среагируем на это установки в соответствующее состояние шины RS

 

void sendbyte(unsigned char c, unsigned char mode)

{

  if (mode==0) rs0;

  else rs1;

 

Добавим ещё одну переменную

 

else rs1;

unsigned char hc=0;

 

Сдвинем вправо на 4 пункта наш байт и отправим результат в данную переменную. Тем самым мы в младшую тетраду байта поместим старшую

 

unsigned char hc=0;

hc=c>>4;

 

 

Затем передадим сначала её в функцию sendhalfbyte, а затем и саму нетронутую переменную c. Не важно, что будет в её старшей части, так как функция sendhalfbyte работает только с младшей тетрадой.

 

  hc=c>>4;

  sendhalfbyte(hc); sendhalfbyte(c);

}

 

Ну и теперь, применяя вышенаписанную функцию, мы передаём следующий байт, взятый из даташита в функции LCD_ini

 

_delay_ms(1);

sendbyte(0b00101000, 0); //4бит-режим (DL=0) и 2 линии (N=1)

_delay_ms(1);

 

Здесь мы используем следующую команду

 

image08

 

Единичка в 5 бите нам говорит о том, что мы используем именно эту команду. Дальше идёт у нас бит DL, говорящий контроллеру дисплея о том, какую размерность передачи данных мы используем

 

image09

И, так как мы включаем режим 4-битной передачи, то в 4 бите у нас будет 0.

Следующий бит — N, который отвечает за колисество строк

 

image10

 

У нас 2 строки, поэтому в 3 бит поставим 1.

F — это размер символа

 

image11

 

Здесь также 0.

 

 

Передадим следующий байт

 

_delay_ms(1);

sendbyte(0b00001100, 0); //включаем изображение на дисплее (D=1), курсоры никакие не включаем (C=0, B=0)

_delay_ms(1);

 

Посмотрим данную команду в документации

 

image12

 

Соответственно, здеь 3 бит, установленный в единицу, говорит о том, что мы применяем именно эту команду, вторая единичка — это параметр D

 

image13

 

Данной единичкой мы включаем дисплей.

Следующий бит — это параметр C

 

image14

 

Здесь мы включаем видимость курсора. Смотреть на курсор нам ни к чему, поэтому 0.

Далее бит B

 

image15

 

Этот бит отвечает за мигание дисплея. Также ставим в 0.

Передаём последнюю команду в функции инициализации дисплея

 

  _delay_ms(1);

  sendbyte(0b00000110, 0); //курсор (хоть он у нас и невидимый) будет двигаться влево

  _delay_ms(1);

}

 

Посмотрим данную команду в документации

 

image16

 

Бит 2 говорит о том, что мы используем именно данную команду.

Следующий бит — I/D

 

image17

 

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

Следующий бит — SH

 

image19

 

Данный бит отвечает за смещение дисплея. Так как мы это не применяем, то 0.

На этом инициализация закончена.

В следующей части урока мы уже попробуем поработать с выводом данных на экран дисплея.

 

 

Предыдущая часть Программирование МК AVR Следующая часть

 

Техническая документация на дисплей

Техническая документация на контроллер дисплея HD44780

 

Программатор и дисплей можно приобрести здесь:

Программатор USBASP USBISP с адаптером USBASP USBISP 3.3 с адаптером

Дисплей LCD 16×2

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

AVR LCD индикатор 16×2

8 комментариев на “AVR Урок 12. LCD индикатор 16×2. Часть 3
  1. Владимир:

    Огромное спасибо за серию уроков. Раньше программировал только на Бейсике. Но вот жизнь заставила перейти на Си. Ваша статья это то что надо. СПАСИБО.

  2. Жора:

    «Этот бит отвечает за мигание дисплея.»
    Опечатка, имелось ввиду мигание курсора.

  3. Александр:

    Здравствуйте, что означает запись sendbyte(0b00101000, 0);
    а точнее 0 в скобках после запятой?

  4. Роман:

    Спасибо за уроки, мне очень нравится что без библиотек, с самого нуля так сказать.
    Мне не понятен один момент.
    После того как мы передали байт 0b00000010, по документации в алгоритме инициализации я ее и предыдущие байты нашел, а почему мы следующий байт взяли из Function set никак не пойму.
    Поясните пожалуйста.

  5. Владимир:

    void sendhalfbyte(unsigned char c)
    {
    c<<=4;
    e1; //включаем линию Е
    _delay_us(50);
    PORTD&=(1<<PD0); //D4
    PORTC&=(1<<PC5); //D5
    PORTD&=(1<<PD1); //D6
    PORTD&=(1<<PD2); //D7
    PORTC|=c[5];
    PORTD|=c;
    e0; //выключаем линию Е
    _delay_us(50);
    }
    Как правильно раскидать d4 d5 d6 d7 на разные выводы?

  6. uuu000:

    Единичка в 5 бите нам говорит о том, что мы используем именно эту команду.
    Почему,откуда мы это видим?

  7. rediska:

    «В некоторых даташитах пишут, что данное число нужно передавать 2 раза, но работает и с 1 передачей. Вы на своих дисплеях можете поэксперементировать и с 2 передачами числа 10.»

    за каким-то лешим сразу прописал две отсылки числа 10, и полдня бился с протеусом, почему он у меня не показывает цифры на экране. Дисплей Протеуса не работает при отсылке числа 10 два раза, шлите только один раз.

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

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

*